Prolog 一元数 - 评估表达式



我试图理解Prolog,我遇到了以下情况。我通过以下方式定义了自然数(一元):

n(0).
n(s(X)) :- nat(X).

这意味着 0 是 0,s(0) 是 1,s(s(0)) 是 2,依此类推......

然后我定义了谓词添加:

add(0, Y, Y) :- nat(Y).
add(s(X), Y, s(Z)) :-
add(X, Y, Z).

它将两个一元数和结果存储添加到 Z。

现在我有以下谓词"测试"来证明我的问题:

test(s(0),0).

然后在解释中我键入:

add(s(0),0,R). %result: R = s(0), which is correct

然后我尝试:

test(add(s(0),0,R), 0).

所以第一个参数应该导致 R = s(0),第二个参数为零,所以整个表达式应该被计算为 true,但 prolog 说 false。我想这与这一点有关,即"test"谓词中的add(s(0),0,R)没有按照我的想法计算。任何人都可以向我解释这一点或最终提供一些描述这种行为的链接吗?感谢您的任何帮助! 干杯。

不,prolog 并不像你想象的那样工作。 当你问

?- test(add(s(0),0,R), 0).

Prolog试图找到一个匹配的子句。但是,数据库中没有匹配子句,因为s(0)不匹配add(s(0),0,R)。两个结构只有在具有相同的函子时才能匹配。

s(0)具有函子s,而add(s(0),0,R)具有函子add

最新更新