0

我正在尝试了解 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。我想这与这一点有关,即“测试”谓词中的 add(s(0),0,R) 不会评估我的想法。谁能向我解释一下,或者最终提供一些描述这种行为的链接?谢谢你的帮助!干杯。

4

1 回答 1

0

不,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

于 2021-03-19T19:08:20.227 回答