Prolog递归条款

时间:2016-11-28 13:05:09

标签: prolog successor-arithmetics

我有以下知识库,应该添加两个参数并给出结果:

add(0,X,X).
add(succ(X),Y,succ(R)):- add(X,Y,R).

现在这是我的问题:

?- add(succ(succ(succ(0))), succ(succ(0)), Result).

0不与第一个参数统一,因此它转到第二个add / 3子句。现在这是我无法弄清楚的事情。这本书(LPN)告诉我,最外面的succ因子是从第一个参数中得到的,但是我无法弄清楚为什么?在我看来,它添加了一个succ仿函数。有人可以解释为什么它剥离它?

提前致谢!

Luuk

1 个答案:

答案 0 :(得分:2)

在您的顶级提示处尝试此操作:

?- succ(succ(0)) = succ(X).

在您输入<Enter>之前,您认为解决方案是什么?

&#34;剥离&#34;本书讨论的内容发生在第二个子句add(succ(X), ...)的头部和递归调用add(X, ...)之间。

我真的没有看到谈论&#34;剥离&#34;这里。实际发生的情况是,如果add/3的第一个参数是带有仿函数succ/1的术语(所以任何东西看起来都像succ(<Whatever>))那么,X将统一使用此<Whatever>。对于查询:

?- add(succ(succ(succ(0))), succ(succ(0)), Result).

<Whatever>succ(succ(0)),因此Xsucc(succ(0))统一,这是递归调用add/3的第一个参数。