さて、あなたはこれのために複数の答えを得ています:
convertToD(A,0).
ここで意味するのは、 「convertToDは0の場合は0」を意味する場合、「convertToDはすべてと0のconvertToD(0, 0)
間で真である」と言っているためです。これは、Prologがあなたが複数の結果を持っていると考える理由でもあります。
いくつか考えて、この質問が重複している質問に気づいたので、2番目の句で何を達成しようとしていたかわかります。あなたがやろうとしていることは、通常のPrologでそこからclpfdソリューションをエミュレートすることです。clpfdを使用する場合:
convertToD(succ(S), Y) :- numeral(S), Y0 #= Y-1, convertToD(S, Y0).
それをバニラPrologに直接コピーすると、ここにコードが表示されますが、clpfdがテーブルにもたらすすべての魔法は起こりません。clpfdがないと、インスタンス化の組み合わせに対して機能し、ループしない述語を作成することは非常に困難です。役立つことの1つは、算術演算を最後に移動することです。
convertToD(succ(S), Y) :- numeral(S), convertToD(S, Y1), succ(Y1, Y).
これにより、ここでループすることを除いて、すべての望ましいプロパティを持つ述語が得られます。
?- convertToD(X, 3).
X = s(s(s(0))) ;
^CAction (h for help) ? abort
私はこれをwhen/2
and var/1
/nonvar/1
でいじりましたが、その小さな問題を解決することができませんでした。