試験のためにPrologを学習しようとしています。
私のスライドによると、算術式は定数と統一されていません。理由はありますか?
例えば
even(0).
even(X) :- X>0, odd(X-1).
odd(1).
odd(X) :- X>1, even(X-1).
?-even(2).
=> false.
は0
と一体化しません(X-1)
。
だから私の質問は次のとおりです。定数と算術式の間に統一があった場合、場合によっては問題になりますか?
試験のためにPrologを学習しようとしています。
私のスライドによると、算術式は定数と統一されていません。理由はありますか?
例えば
even(0).
even(X) :- X>0, odd(X-1).
odd(1).
odd(X) :- X>1, even(X-1).
?-even(2).
=> false.
は0
と一体化しません(X-1)
。
だから私の質問は次のとおりです。定数と算術式の間に統一があった場合、場合によっては問題になりますか?
これらの句の問題は、Prolog が算術式を述語へのクエリへの引数としてインラインで評価しないことです。
したがって、この:
even(X) :- X>0, odd(X-1).
odd(X) :- X>1, even(X-1).
次のように照会すると、次のようeven(2)
になります。
2 > 0, % success
odd(2-1). % hmmm
次にodd(2-1)
(これは実際にはodd('-'(2,1))
が一致odd(1)
しないことを意味します)、 に移動して次のようにodd(X)
なります:
2-1>1, % This will evaluate, but will fail because 1>1 is false
>/2
は評価比較なので、評価を行います。しかし、間違った句が選択されているため、それでは遅すぎます。だから失敗する。
以下を事前評価する必要があります。
even(0).
even(X) :- X>0, X1 is X-1, odd(X1).
odd(1).
odd(X) :- X>1, X1 is X-1, even(X1).
Prolog は、次のis/2
ような の 2 番目の引数にある式を評価します。
Y is (X+1)/2.
または、数値的に比較する比較演算子の場合。たとえば、次は比較の前に式を評価します。
Y+7 < X*2
X/2 =:= Y mod 2
=/2
は式を評価しないことに注意してください。統一演算子です。そう:
X-2 = Y*2
'-'(X,2)
との統合を試みるため、失敗し'*'(Y,2)
ます。