問題タブ [failure-slice]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 整数ベースケースで非終了を回避するにはどうすればよいですか?
0 まで再帰する述語を書きたいのですが、一貫して終了に失敗します。失敗スライスを使用して、次のように絞り込みました。
ファイルを としてロードし、プロンプトでswipl -f test.pl
実行すると、出力は表示されますが、新しいプロンプトが表示されないか、表示されません。ピリオドと新しいプロンプトが表示される のように動作することを期待しています。f(X, 0).
X = a
X = b
A is 1 + 1
A = 2.
?-
このようなもので動作させることができましたが、きれいに見えません:
f(X, [A|B])
リストの場合、リストに少なくとも 1 つの要素がある場合にのみ適用されるように、より一般的なケースを記述できます。Y
ここでのより一般的なケースが0でない場合にのみ適用されるようにするために、私ができる同様のことはありますか?
私はこの質問を見てきましたが、正しい方向性を示唆していますが、これもうまくいきません:
prolog - ゴールの並べ替え後に Prolog が終了しない
私は現在、Learn Prolog Now の例に取り組んでいます。1 つの演習では、1 つのルールにわずかな変更を加えるだけで、ローカル スタックが不足する KB があります。これはKBです:
および関連するルール:
そして、これは問題のクエリであり、スタックを使い果たします:
しかし、ルールを次のように変更すると
その後、動作します。
クエリをトレースすると、次のようにすぐに行き詰まります。
しかし、理由がわかりません。ラグランがエンドステーションであり、1 レベル後戻りする必要があることを理解するだけでよいのではないでしょうか?
ありがとう!
編集:SWI Prologを使用しています
編集:段階的に問題を解決した後、問題を見つけました。ラグランの場合、どこにもルールはありません。したがって、 を試行した後、(最後のルールの最初のゴール) を再試行するため、ループしますbyPlane, byTrain, byCar
。travel(raglan, X)
しかし、他のルールがどのように優れているかはわかりません。