我对使用某些规则的查询期间发生的事情感到有些困惑。 以下是我的笔记中的示例代码。
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? ; 然后我们继续按下;
接下来会发生什么?我们称第一条路还是第二条路?如果我们失败了会发生什么,我们是否会从第一条道路开始呢?
答案 0 :(得分:1)
按;
您需要下一个解决方案。正如您所知,Prolog中的替代词用多个子句表示。
要成为现实,抽象解释,从上到下,从左到右,不会尝试第一个或第二个路径/ 2,但会首先尝试查看是否有另一个{{ 1}}。
由于索引,SWI-Prolog不会尝试调用其中任何一个(它知道没有其他链接/ 2适当),而是将回溯并尝试下一个路径/ 2(第二个规则)。 / p>
这里是(部分)跟踪:当您看到link(X,bcpl)
时,表示它正在选择下一个可用的替代。括号之间的数字是调用级别,但是您可以看到,对于某些实现细节,证明不是从1开始。
Redo