Recursion 理解Prolog中的递归规则和统一
我是学习“LearnPrologNow!”系列教程的初级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)) 但我不明白是什么导致它每次“收缩”和提升。我理解统一的原
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)
替换,然后可以重新应用统一