2

我无法理解此示例中发生的情况
立即学习 Prolog -第 3 章- 示例 3:继任者

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

当询问 numeric(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)))) ? 

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

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

我为愚蠢的大脑道歉。

4

2 回答 2

5

我认为 Guy Coder 对正在发生的事情给出了很好的详细解释。我将提供他归纳解释的一个轻微变体,希望能帮助提高清晰度。

想想你的 Prolog 规则是怎么说的:

numeral(0).

这就是说,0 是一个数字

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

这说, succ(X)is a numeric if X is a numeric

那么,根据第一条规则,0是一个数字。也就是说,numeral(0)是真的(成功)。根据第二条规则,既然0是数字,那么succ(0)一定是数字(numeral(succ(0))为真)。既然succ(0)是数字,那么再次按第二条规则,succ(succ(0))一定是数字(numeral(succ(succ(0))为真)。等等...

于 2017-01-03T19:48:44.283 回答
3

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

如果您再次阅读该部分,它会指出:

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

0 是一个数字。
如果 X 是数字,那么 succ(X) 也是。

我看到很多人在第一次学习高等数学时遇到的一个问题是,当你说数学时,他们脑海中首先出现的就是阿拉伯数字笛卡尔坐标系

对于这个例子,你必须以符号的方式思考,例如符号计算,或者更根本地,抽象重写系统

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

所以

 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 演算,您会经常看到这一点。

考虑这一点的另一种方法是由关键字inductive给出的。通过归纳,您需要一个起始事实和一个将您带到下一个事实的规则。事实也是如此0,将您带到下一个事实的规则是succ(X)

于 2017-01-03T19:17:08.107 回答