现在学习Prolog - 在递归练习中回溯的问题

时间:2017-01-03 18:56:38

标签: prolog successor-arithmetics

我很难理解这个例子中发生的事情 立即学习Prolog - Chapter 3 - 示例3:继任者

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

当被问及数字(X)时,它首先为X给出0,然后继续使用succ(0),以这种方式逐个递增succ(0),直到它用完空间:

X = 0 ?     
X = succ(0) ? ;
X = succ(succ(0)) ? ;
X = succ(succ(succ(0))) ? ;
X = succ(succ(succ(succ(0)))) ? 

我很难理解为什么它会增加succ(0)?

我知道prolog将首先找到一个事实并匹配它,因此第一个0.然后它会回溯以查看是否有任何其他解决方案,它将"看到"规则。在规则中,它将使用实例化的X到0.我失败的地方,就是看它为什么继续增加succ(0)。 X是否变为succ(0),而不是0?

我为愚蠢的大脑道歉。

2 个答案:

答案 0 :(得分:4)

我认为Guy Coder对正在发生的事情作了详细的解释。我会提供他的归纳解释的轻微变体,希望有助于提高清晰度。

想想你的Prolog规则说的话:

numeral(0).

这就是说, 0是数字

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

这就是说, succ(X)是一个数字,如果 X是一个数字

根据第一条规则,0是一个数字。也就是说,numeral(0)为真(成功)。根据第二条规则,由于0是数字,因此succ(0)必须是数字(numeral(succ(0))为真)。由于succ(0)是数字,因此再次通过第二个规则,succ(succ(0))必须是数字(numeral(succ(succ(0))为真)。等等...

答案 1 :(得分:2)

  

我很难理解为什么它会增加succ(0)

如果您再次阅读该部分,则说明:

  

这是另一种编写数字的方法,有时会用到   数学逻辑。它仅使用四个符号:0succ和   左括号和右括号( )。这种数字的定义是由   以下归纳定义:

     

0是数字   如果X是数字,则succ(X)也是如此。

我看到很多人在第一次学习高等数学时遇到问题的一个原因是,当你说数学时,首先出现在他们头脑中的是Arabic numeralsCartesian coordinate system

对于这个例子,你必须象征性地思考,例如Symbolic computation,或更重要的是,Abstract rewriting system

对于这个例子,他们没有使用阿拉伯数字,而是一种描述数字的功能方式。换句话说,为了描述一个数字,您只有起始符号0和函数succ(x)。注意我说符号而不是数字,因为符号0在放入上下文时只有意义,在这种情况下natural numbers

所以

 0 is 0
 1 is succ(0)        - The successor of 0 is 1.
 2 is succ(succ(0))  - The successor of the successor of 0 is 2 or
                       The successor of 1, e.g. succ(0), is 2.

等等。如果您阅读Lambda calculus,您会经常看到这一点。

另一种思考方式是关键字inductive。通过归纳,您需要一个启动事实和规则,将您带入下一个事实。因此0是事实,而将您带到下一个事实的规则是succ(X)