プロローグ統一解像度
-
19-09-2019 - |
質問
なぜ、この作品は行います:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
これは、スタックオーバーフロー例外を与える?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
解決
算術演算のみis
オペレータを通じて句で実行されるので。最初の例では、Y1はYの計算の結果にバインドされている - 以降で1.、システムは、句電源電力を単一化(X、Y1、Z1)、(X「Y」を証明しようと、 =のX 'X結合)' をZは、Y '= Y - 1、Z' 実際に計算を行うことがない、無限のために1等
Prologは、主に用語の統一だけである - 計算は、「一般的な」という意味で、明示的に要求する必要があります。
他のヒント
両方の定義が正しく動作しません。
考えてみましょう。
?- pow(1, 1, 2).
は第二節は関係なく、第二引数の適用することができるので、両方の定義のためにループします。最初の句のカットが、これを元に戻すことはできません。第二節は、再帰的なゴールの前にゴールY > 0
を必要とします。 (is)/2
を使用すると、まだ実際のソリューションを取得することをお勧めします。
最高のは、<クラス=「ポスト・タグ」のhref =「/質問/タグ付き/後継-算術演算」タイトル=で開始することであるのrel = "タグ「ショーの質問『後継-算術演算』をタグ付け」質問が'clpfd'" rel="tag"> clpfd にタグ付けtitle="show「>後継-算術演算はのか、を'prolog-cut'" rel="tag">プロローグカットをタグ付けtitle="showと 無限ループする
-例えば: Prologの述語を見ます
所属していません StackOverflow