2

0 まで再帰する述語を書きたいのですが、一貫して終了に失敗します。失敗スライスを使用して、次のように絞り込みました。

f(a, 0).
f(b, 0).
f(X, Y) :- false.

ファイルを としてロードし、プロンプトでswipl -f test.pl実行すると、出力は表示されますが、新しいプロンプトが表示されないか、表示されません。ピリオドと新しいプロンプトが表示される のように動作することを期待しています。f(X, 0).X = aX = bA is 1 + 1A = 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).
4

1 に答える 1