我是“LearnPrologNow!”之后的Prolog学生的开始。一套教程。我正在尽力掌握概念和词汇。在提出这个问题时,我已经能够理解第3章关于递归定义的所有内容:
numeral(0).
numeral(succ(X)) :- numeral(X).
给出查询
numeral(X).
现在,我知道该程序的想法是Prolog将开始计算此系统中的数字,如
X=0
X=succ(0)
X=succ(succ(0))
但我不明白是什么原因导致它“缩小”并每次都提升。我理解统一的原则是程序试图统一X的查询,但它应该只遵循递归规则一次,然后返回零?什么允许它围绕查询添加 succ()?这不是在相反的方向上遍历递归规则吗?
答案 0 :(得分:3)
请以声明的方式思考:
规则
numeral(succ(X)) :- numeral(X).
表示:
如果 X
是数字,则 succ(X)
是数字。
:-
就像逻辑蕴涵中使用的箭头(看起来类似于<==
)。
看到您成功派生了0
是一个数字(第一个答案),因此succ(0)
是另一种解决方案就不足为奇了。
我建议你考虑这种关系,而不是试图追踪实际的控制流程。
请注意,succ/1
未在查询&#34;周围添加&#34;但是是实际答案的一部分。术语succ(0)
只是一个普通的Prolog术语,带有仿函数succ
和参数0
。
答案 1 :(得分:2)
已经given answer好了,我还会补充一些:
Prolog使用指称语法(或声明性语法)来定义术语
之间的逻辑关系/“等式”术语是由变量/函数/占位符等组成的对象。
统一是检查两个表达式(或两个术语)相对于给定关系/方程是否相等的过程。
numeral(succ(X)) :- numeral(X)
这样的关系/等式是否表示变量项X
属于numeral type
(或类),暗示后继函数{{1}也是同一类型。所以这里的Prolog可以统一表达式(换句话说,解决等式)并将succ
替换为X
等等,直到域名为止succ(X)
已涵盖。因此,此统一意味着将X
替换为X
,然后可以重新应用统一。