0 まで再帰する述語を書きたいのですが、一貫して終了に失敗します。失敗スライスを使用して、次のように絞り込みました。
f(a, 0).
f(b, 0).
f(X, Y) :- false.
ファイルを としてロードし、プロンプトでswipl -f test.pl
実行すると、出力は表示されますが、新しいプロンプトが表示されないか、表示されません。ピリオドと新しいプロンプトが表示される のように動作することを期待しています。f(X, 0).
X = a
X = b
A is 1 + 1
A = 2.
?-
このようなもので動作させることができましたが、きれいに見えません:
f(X, 0) :- X = x.
f(X, Y) :- Y == 0 -> false; (NewY is Y - 1, f(X, NewY)).
f(X, [A|B])
リストの場合、リストに少なくとも 1 つの要素がある場合にのみ適用されるように、より一般的なケースを記述できます。Y
ここでのより一般的なケースが0でない場合にのみ適用されるようにするために、私ができる同様のことはありますか?
私はこの質問を見てきましたが、正しい方向性を示唆していますが、これもうまくいきません:
:- use_module(library(clpfd)).
int_int_prod(_, 0, 0).
int_int_prod(Num1, Num2, Result) :-
Num2 #> 0,
NewNum2 #= Num2 - 1,
int_int_prod(Num1, NewNum2, NewResult),
Result #= Num1 + NewResult.
?- int_int_prod(0, 0, X).