1

いくつかのルールを使用したクエリ中に何が起こるかについて少し混乱しています。これが私のメモのサンプルコードです。

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).

これを照会すると、最初のパスが呼び出され、link(cpl,bcpl) がデータベースで最初に一致するため、X は cpl に対して開始されます。したがって、L = cpl および M = bcpl です。X = cpl? ; 次に、 ; を押して続行します。

次は何が起こる?最初のパスと呼ぶか、2 番目のパスと呼ぶか。ルールに違反した場合はどうなりますか? 最初のパスに戻りますか?

4

1 に答える 1

1

次の解決策;が必要です。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.
于 2013-03-13T13:15:52.943 に答える