このページの下部にある演習を進めようとしていますが、3番で完全に混乱しています。
旅行情報に関する次の知識ベースが提供されます。
byCar(auckland, hamilton).
byCar(hamilton, raglan).
byCar(valmont, saarbruecken).
byCar(valmont, metz).
byTrain(metz, frankfurt).
byTrain(saarbruecken, frankfurt).
byTrain(metz, paris).
byTrain(saarbruecken, paris).
byPlane(frankfurt, bangkok).
byPlane(frankfurt, singapore).
byPlane(paris, losAngeles).
byPlane(bangkok, auckland).
byPlane(singapore, auckland).
byPlane(losAngeles, auckland).
2つの都市間を移動できるかどうかを確認するのは簡単です。私はこれをしました:
connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
travel(X, Y) :- connected(X, Y).
travel(X, Z) :- connected(Y, Z), travel(X, Y).
しかし、実際にパスを変数と統合する必要がある場合、私は完全に混乱します!
私はこれを書いた:
connected(X, Y) :- byCar(X, Y); byTrain(X, Y); byPlane(X, Y).
connected(Y, Z, Out) :- connected(Y, Z).
travel(X, Y, Out) :- connected(X, Y).
travel(A, Z, Out) :- connected(Y, Z),travel(A, Y, connected(Y, Z, Out)).
そして呼ばれるtravel(valmont, losAngeles,X).
トレース中に、最後の匿名変数を除いて、正しいパスが表示されるポイントがあります。
travel(valmont, metz, connected(metz, paris, connected(paris, losAngeles, _17)))
しかし、これを変数と統合する方法は実際にはわかりませんX
。
私は本当にこれに頭を悩ませることはできません。誰かが私を正しい方向に押し進めるためのヒントを教えてもらえますか?私が行方不明になっている終了条件か何かがありますか?
編集:
今私が持っています:
connected(X,Y) :- byCar(X,Y);byTrain(X,Y);byPlane(X,Y).
go(X,Y) :- connected(X,Y).
travel(X,Y,go(X,Y)) :- connected(X,Y).
travel(A,Z,Path) :- travel(Y,Z,Path),go(A,Y,Path).
go(A,Y,Path) :- travel(A,Y,Path).
しかし、それはこのように立ち往生します:
4 4 Exit: byPlane(paris,losAngeles) ?
3 3 Exit: connected(paris,losAngeles) ?
2 2 Exit: travel(paris,losAngeles,go(paris,losAngeles)) ?
5 2 Call: go(metz,paris,go(paris,losAngeles)) ?
6 3 Call: travel(metz,paris,go(paris,losAngeles)) ?
7 4 Call: travel(_217,paris,go(paris,losAngeles)) ?
8 5 Call: travel(_242,paris,go(paris,losAngeles)) ?
9 6 Call: travel(_267,paris,go(paris,losAngeles)) ?
10 7 Call: travel(_292,paris,go(paris,losAngeles)) ?
私はそれで遊んだことがありますが、全体を構築するためにそれを取得することはできませんgo(a,b,go(b,c))
...