prolog 如何使用 succ 运行递归查询?

And*_*ndy 5 prolog successor-arithmetics

有人可以向我解释为什么这个 prolog 查询的工作方式。定义是:

add(0,Y,Y). 
add(succ(X),Y,succ(Z)):- add(X,Y,Z).
Run Code Online (Sandbox Code Playgroud)

鉴于这种:

?-  add(succ(succ(succ(0))),  succ(succ(0)),  R).
Run Code Online (Sandbox Code Playgroud)

这是查询的跟踪:

Call:  (6)  add(succ(succ(succ(0))),  succ(succ(0)),  R) 

Call:  (7)  add(succ(succ(0)),  succ(succ(0)),  _G648) 

Call:  (8)  add(succ(0),  succ(succ(0)),  _G650) 

Call:  (9)  add(0,  succ(succ(0)),  _G652) 

Exit:  (9)  add(0,  succ(succ(0)),  succ(succ(0))) 

Exit:  (8)  add(succ(0),  succ(succ(0)),  succ(succ(succ(0)))) 

Exit:  (7)  add(succ(succ(0)),  succ(succ(0)), 
                                              succ(succ(succ(succ(0))))) 

Exit:  (6)  add(succ(succ(succ(0))),  succ(succ(0)), 
                                                succ(succ(succ(succ(succ(0))))))
Run Code Online (Sandbox Code Playgroud)

该教程中最让我困惑的部分是,在第一个参数中,succ 被剥离,并且它会递归。在递归的同时,R 获得了成功......如何?!另外,第一个出口 (9) 处的零从何而来?我是 prolog 的新手,我正在努力理解家庭作业的语言。非常感谢任何帮助。

注意:对于任何感兴趣的人,本教程的链接是http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse9

Ale*_*nik 1

“第一个出口(9)处的零从何而来?”

该调用add(0, succ(succ(0)), _G652)与第一个子句统一,该子句表示如果 的第一个参数为零add,则第二个和第三个相同。在这种特殊情况下,变量_G652变为succ(succ(0))

“尽管在递归时,R 取得了成功......怎么办?!”

这是应用第二条的结果。该子句(粗略地)指出,您首先succ从第一个参数中剥离,然后递归add调用,最后向从此递归调用succ返回的第三个参数添加另一个“层”。

谓词add只不过是皮亚诺算术中加法的直接实现:http://en.wikipedia.org/wiki/Peano_axioms#Addition