我正在尝试学习 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
第二个参数上的表达式,例如:
Y is (X+1)/2.
或者 if 是进行数字比较的比较运算符。例如,以下将在比较之前评估表达式:
Y+7 < X*2
X/2 =:= Y mod 2
请注意,=/2
不会计算表达式。它是一个统一运算符。所以:
X-2 = Y*2
会失败,因为它尝试将 '-'(X,2)
与 '*'(Y,2)
统一。
关于Prolog:算术表达式和常数的统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787623/