立即学习 Prolog - 递归练习中的回溯问题

qwe*_*rty 2 prolog successor-arithmetics

我在理解此示例中发生的事情时遇到了麻烦
立即学习 Prolog -第 3 章- 示例 3:后继

numeral(0).
numeral(succ(X)) :- numeral(X).
Run Code Online (Sandbox Code Playgroud)

当询问number(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)))) ? 
Run Code Online (Sandbox Code Playgroud)

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

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

我为愚蠢的大脑道歉。

lur*_*ker 5

我认为 Guy Coder 对正在发生的事情进行了很好的详细解释。我将提供他的归纳解释的一个轻微变体,希望有助于带来更多的清晰度。

想想你的 Prolog 规则怎么说:

numeral(0).
Run Code Online (Sandbox Code Playgroud)

这就是说,0 是一个数字

numeral(succ(X)) :- numeral(X).
Run Code Online (Sandbox Code Playgroud)

这表示,如果succ(X)数字, X是数字

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