对查询和回溯感到困惑

时间:2013-03-13 12:19:53

标签: prolog

我对使用某些规则的查询期间发生的事情感到有些困惑。 以下是我的笔记中的示例代码。

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,因为link(cpl,bcpl)是我们数据库中匹配的第一个东西。所以现在L = cpl,M = bcpl。 X = cpl? ; 然后我们继续按下;

接下来会发生什么?我们称第一条路还是第二条路?如果我们失败了会发生什么,我们是否会从第一条道路开始呢?

1 个答案:

答案 0 :(得分:1)

;您需要下一个解决方案。正如您所知,Prolog中的替代词用多个子句表示。

要成为现实,抽象解释,从上到下,从左到右,不会尝试第一个或第二个路径/ 2,但会首先尝试查看是否有另一个{{ 1}}。

由于索引,SWI-Prolog不会尝试调用其中任何一个(它知道没有其他链接/ 2适当),而是将回溯并尝试下一个路径/ 2(第二个规则)。 / p>

这里是(部分)跟踪:当您看到link(X,bcpl)时,表示它正在选择下一个可用的替代。括号之间的数字是调用级别,但是您可以看到,对于某些实现细节,证明不是从1开始。

Redo
相关问题