现在学习Prolog-递归练习中的回溯问题
我很难理解这个例子中发生了什么现在学习Prolog-递归练习中的回溯问题,prolog,successor-arithmetics,Prolog,Successor Arithmetics,我很难理解这个例子中发生了什么 现在学习序言——例3:后继 numeral(0). numeral(succ(X)) :- numeral(X). 当询问数字(X)时,它将首先给出X的0,然后继续进行succ(0),以这种方式将succ(0)部分增加1,直到空间用完: X = 0 ? X = succ(0) ? ; X = succ(succ(0)) ? ; X = succ(succ(succ(0))) ? ; X = succ(succ(succ(succ(0)))) ? 我
现在学习序言——例3:后继
numeral(0).
numeral(succ(X)) :- numeral(X).
当询问数字(X)时,它将首先给出X的0,然后继续进行succ(0),以这种方式将succ(0)部分增加1,直到空间用完:
X = 0 ?
X = succ(0) ? ;
X = succ(succ(0)) ? ;
X = succ(succ(succ(0))) ? ;
X = succ(succ(succ(succ(0)))) ?
我很难理解为什么它会增加成功率(0)
我知道prolog首先会找到一个事实并匹配它,因此第一个0。然后它将回溯,看看是否还有其他解决方案,然后它将“看到”规则。在规则中,它将使用实例化的X到0。我失败的地方是看它为什么一直递增succ(0)。X是否变成了成功(0),而不是仅仅0
我为愚蠢的大脑道歉
我很难理解为什么它会增加成功率(0)
如果您再次阅读本节,它会说明:
这里还有另一种书写数字的方法,有时在英语中也会用到
数理逻辑。它只使用了四个符号:0
,succ
,和
左括号和右括号,(
)
。这种类型的数字由
以下归纳定义:
0是一个数字。如果X是一个数字,那么succ(X)也是一个数字 我看到很多人在第一次学习高等数学时有一个问题,那就是当你说数学的时候,他们脑海中浮现的第一件事就是一个问题 对于这个例子,你必须象征性地思考,例如,或者更根本地思考 在这个例子中,他们不是用阿拉伯数字,而是用一种功能性的方式来描述数字。换句话说,要描述一个数字,您只有起始符号
0
和函数succ(x)
。注意,我说的是符号,而不是数字,因为符号0
只有放在上下文中才有意义,在这种情况下
所以
0是0
1是成功的(0)-0的后续者是1。
2为成功(成功(0))-0的后续者的后续者是2或
1的后继者,例如succ(0),是2。
等等。如果你读到这篇文章,你会经常看到这一点
另一种思考这个问题的方法是使用关键字。在归纳法中,你需要一个开始的事实和一个引导你进入下一个事实的规则。因此
0
是事实,而将您带到下一个事实的规则是succ(X)
我认为盖伊·科德(Guy Coder)对发生的事情做了很好的详细解释。我将提供他的归纳解释的一个细微的变体,希望有助于带来更多的清晰度
想想你的序言规则是怎么说的:
numeral(0).
也就是说,0是一个数字
这表示,succ(X)
是一个数字,如果X
是一个数字
根据第一条规则,
0
是一个数字。也就是说,数字(0)
为真(成功)。根据第二条规则,由于0
是一个数字,因此such(0)
必须是一个数字(numeric(such(0))
为true)。由于such(0)
是一个数字,那么根据第二条规则,such(such(0))
必须是一个数字(numeric(such(0))
为真).等等……啊,我明白了!非常好的解释,谢谢你的书的建议-我认为这将是一个很大的帮助。非常感谢。感兴趣:感谢你花时间研究我的问题,你的回答真的帮助我把事情弄清楚了!非常感谢!)
numeral(succ(X)) :- numeral(X).