我在理解此示例中发生的事情时遇到了麻烦
立即学习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)?

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

我为愚蠢的大脑道歉。

最佳答案

我正在努力了解为什么它会增加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)

10-06 05:50