理解Prolog中的递归规则和统一

时间:2015-03-12 13:08:42

标签: recursion prolog unification successor-arithmetics

我是“LearnPrologNow!”之后的Prolog学生的开始。一套教程。我正在尽力掌握概念和词汇。在提出这个问题时,我已经能够理解第3章关于递归定义的所有内容:

numeral(0).
numeral(succ(X))  :-  numeral(X). 

给出查询

numeral(X).

现在,我知道该程序的想法是Prolog将开始计算此系统中的数字,如

X=0
X=succ(0)
X=succ(succ(0))

但我不明白是什么原因导致它“缩小”并每次都提升。我理解统一的原则是程序试图统一X的查询,但它应该只遵循递归规则一次,然后返回零?什么允许它围绕查询添加 succ()?这不是在相反的方向上遍历递归规则吗?

2 个答案:

答案 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,然后可以重新应用统一。