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

Recursion 理解Prolog中的递归规则和统一,recursion,prolog,unification,successor-arithmetics,Recursion,Prolog,Unification,Successor Arithmetics,我是学习“LearnPrologNow!”系列教程的初级Prolog学生。我正在尽最大努力掌握概念和词汇。在第三章递归定义之前,当我遇到这个问题时,我已经能够理解所有内容: numeral(0). numeral(succ(X)) :- numeral(X). 给定查询 numeral(X). 现在,我了解到这个程序的想法是Prolog将开始在这个系统中按如下顺序计数 X=0 X=succ(0) X=succ(succ(0)) 但我不明白是什么导致它每次“收缩”和提升。我理解统一的原

我是学习“LearnPrologNow!”系列教程的初级Prolog学生。我正在尽最大努力掌握概念和词汇。在第三章递归定义之前,当我遇到这个问题时,我已经能够理解所有内容:

numeral(0).
numeral(succ(X))  :-  numeral(X). 
给定查询

numeral(X).
现在,我了解到这个程序的想法是Prolog将开始在这个系统中按如下顺序计数

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

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

请以声明的方式思考:

规则

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

如果
X
是一个数字,则
such(X)
是一个数字


:-
类似于逻辑含义中使用的箭头(它看起来类似于
请以声明的方式思考:

规则

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

如果
X
是一个数字,则
such(X)
是一个数字

:-
类似于逻辑含义中使用的箭头(它看起来类似于
已经很好了,我将补充一些:

Prolog使用指称语法(或声明语法)来定义术语之间的逻辑关系/方程

术语是由变量/函数/占位符等组成的对象

统一是检查两个表达式(或两个项)相对于给定关系/方程是否相等的过程

numeral(succ(X))  :-  numeral(X)
是这样一个关系/方程,它表明变量项
X
数字类型
(或类),意味着后继函数
succ
也是同一类型的。因此这里的Prolog可以统一表达式(换句话说解方程)然后将
X
替换为
succ(X)
等等,直到
X
的域被覆盖。因此,这种统一意味着
X
succ(X)
替换,然后可以重新应用统一。

已经很好了,我将补充一些:

Prolog使用指称语法(或声明语法)来定义术语之间的逻辑关系/方程

术语是由变量/函数/占位符等组成的对象

统一是检查两个表达式(或两个项)相对于给定关系/方程是否相等的过程

numeral(succ(X))  :-  numeral(X)
是这样一个关系/方程,它表明变量项
X
数字类型
(或类),意味着后继函数
succ
也是同一类型的。因此这里的Prolog可以统一表达式(换句话说解方程)然后将
X
替换为
succ(X)
等等,直到
X
的域被覆盖。因此这种统一意味着
X
succ(X)
替换,然后可以重新应用统一