Prolog 递归子句

Prolog Recursive Clause

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

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 仿函数。有人可以解释为什么要剥离它吗?

提前致谢!

卢克

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

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

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


书上讲的"stripping"发生在第二个子句的头部add(succ(X), ...)和递归调用add(X, ...).

之间

我真的看不出在这里谈论 "stripping" 有什么附加价值。实际发生的是,如果 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的第一个参数。