次の解決策;
が必要です。Prolog の代替は、ご存知のように複数の句で表現されます。
確かに、抽象的な解釈は、上から下、左から右へ、最初のパスも 2 番目のパス/2 も試しませんが、最初に別のlink(X,bcpl)
.
索引付けのため、SWI-Prolog はこれらのいずれも呼び出そうとせず (別の適切な link/2 がないことを認識している)、代わりにバックトラックして次の path/2 を試行します (2 番目のルール)。
ここに (部分的な) トレースがRedo
あります。括弧内の数字は呼び出しレベルですが、実装の詳細によっては、証明が 1 から始まらないことがわかります。
?- leash(-all), trace, path(X,bcpl).
Call: (7) path(_G2093, bcpl)
Call: (8) link(_G2093, bcpl)
Exit: (8) link(cpl, bcpl)
Exit: (7) path(cpl, bcpl)
X = cpl ;
Redo: (7) path(_G2093, bcpl)
Call: (8) link(_G2093, _G2262)
Exit: (8) link(fortran, algol60)
Call: (8) path(algol60, bcpl)
Call: (9) link(algol60, bcpl)
Fail: (9) link(algol60, bcpl)
Redo: (8) path(algol60, bcpl)
Call: (9) link(algol60, _G2262)
Exit: (9) link(algol60, cpl)
Call: (9) path(cpl, bcpl)
Call: (10) link(cpl, bcpl)
Exit: (10) link(cpl, bcpl)
Exit: (9) path(cpl, bcpl)
Exit: (8) path(algol60, bcpl)
Exit: (7) path(fortran, bcpl)
X = fortran ;
Redo: (9) path(cpl, bcpl)
...
Fail: (8) path(cplusplus, bcpl)
Redo: (8) link(_G2093, _G2262)
Exit: (8) link(simula67, smalltalk80)
Call: (8) path(smalltalk80, bcpl)
Call: (9) link(smalltalk80, bcpl)
Fail: (9) link(smalltalk80, bcpl)
Redo: (8) path(smalltalk80, bcpl)
Call: (9) link(smalltalk80, _G2262)
Fail: (9) link(smalltalk80, _G2262)
Fail: (8) path(smalltalk80, bcpl)
Fail: (7) path(_G2093, bcpl)
false.