有人可以向我解释为什么此序言查询以这种方式起作用。定义是:

add(0,Y,Y).
add(succ(X),Y,succ(Z)):- add(X,Y,Z).

鉴于这种:
?-  add(succ(succ(succ(0))),  succ(succ(0)),  R).

这是查询的痕迹:
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))))))

关于该教程,令我最困惑的部分是,在第一个参数中,succ被剥离,然后递归进行。在递归的同时,R获得成功……怎么办?!另外,零在哪里从第一个导出(9)来?我是新手,我正在尝试了解家庭作业的语言。任何帮助,不胜感激。

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

最佳答案

“零从第一个导出(9)哪里来?”

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

“虽然递归,但是R获得成功...如何?!”

这是应用第二个子句的结果。该子句指出(大致),您首先要从第一个参数中删除succ,然后以递归方式调用add,最后,从该递归调用返回的第三个参数中添加succ的另一个“层”。

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

关于prolog - Prolog如何在使用succ的递归查询中运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10308557/

10-12 16:23