我对使用某些规则查询期间会发生什么感到困惑。 以下是我笔记中的示例代码。困惑于查询和回溯
link(fortran, algol60).
link(algol60,cpl).
link(cpl, bcpl).
link(bcpl, c).
link(c, cplusplus).
link(algol60, simula67).
link(simula67, cplusplus).
link(simula67, smalltalk80).
path(L,M) :- %first path
link(L,M). %first link
path(L,M) :- %second path
link(L,X), %second link
path(X,M). %third path
| ?- path(X,bcpl).
当我们询问,我们将调用第一路径和X将被启动,以CPL,因为链路(CPL,BCPL)是在我们的数据库匹配的第一件事。所以现在L = cpl和M = bcpl。 X = cpl? ; 然后我们继续按下;
接下来会发生什么?我们称之为第一路还是第二路?如果我们失败了一条规则会发生什么,我们从第一条路开始?
您可以实际使用的示踪剂自己回答你的问题。在尝试输入相同的目标之前,尝试输入:?? - trace.',您将看到所有调用,失败和重做。 – 2013-03-13 13:01:05
我试图按照这个,但我迷路了,因为我不确定第三条路径是第一条路径还是第二条路径。 – Instinct 2013-03-13 13:07:31
如果您正在使用SWI-Prolog,则行首的数字将告诉您是否要进入新的“框架”,即谓词的新调用。无论如何,你所说的“第三条路径”是谓词'路径'的新调用,它有两个子句。你的“第一”和“第二条路径”是谓词定义,而第三条“路径”实际上是一个子目标。这是一个根本的区别,它可以被我现在能想到的所有编程语言共享。 – 2013-03-13 13:10:54