我有以下知识库,应该添加两个参数并给出结果:
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
答案 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))
,因此X
与succ(succ(0))
统一,这是递归调用add/3
的第一个参数。