我正在努力学习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)
不统一。
所以我的问题是:如果常量和算术表达式之间存在统一,在某些情况下会出现问题吗?
答案 0 :(得分:3)
这些子句的问题在于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
的第二个参数上的表达式,例如:
Y is (X+1)/2.
或者,如果在比较运算符中进行数字比较。例如,以下内容将在比较之前评估表达式:
Y+7 < X*2
X/2 =:= Y mod 2
请注意=/2
不评估表达式。它是统一运算符。所以:
X-2 = Y*2
会失败,因为它会尝试将'-'(X,2)
与'*'(Y,2)
统一起来。