Prolog:算术表达式与常量的统一

时间:2014-04-01 13:36:57

标签: prolog unification

我正在努力学习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)不统一。

所以我的问题是:如果常量和算术表达式之间存在统一,在某些情况下会出现问题吗?

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)统一起来。

相关问题