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
的第一个参数。
我有以下知识库,应该添加两个参数并给出结果:
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
的第一个参数。