Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
现在学习Prolog-递归练习中的回溯问题_Prolog_Successor Arithmetics - Fatal编程技术网

现在学习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).