2

このページの下部にある演習を進めようとしていますが、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))...

4

2 に答える 2

2

再帰の基本ケースを示します。

travel(X, Y, go(X, Y)) :- connected(X, Y).

再帰的なケースは非常によく似ていgo/3ますが、作成する用語の最初の2つの引数として場所が必要であり、2番目の引数としてパス(別の用語go/2またはgo/3用語)が必要です。

于 2012-04-19T15:57:43.410 に答える
1

私はこれをaBathologistによって次のように説明してもらいました:

あなたの目的は、クエリtravel(valmont、losAngeles、X)に応答してX = go(valmont、metz、go(metz、paris、go(paris、losAngeles)))を取得することです。

この問題を解決するには、travel / 3述語にFrom、To、およびPathが必要ですが、Pathのない単純なgo(From、To)で終了する必要があります。単純なgo(From、To)は、travel / 3の基本条件なので、次のようになります。

travel(X, Y, go(X, Y)) :- connected(X, Y).

これは、larsmansが述べているとおりです。

次に、再帰的なtravel/3述語を作成する必要があります。

travel(X, Y, go(X, Z, Path)) :-
 connected(X, Z),
 travel(Z, Y, Path).

go / 2述語は冗長であり、travel / 3述語には、go述語のように見えるものがあるため、少し混乱します。go / 2述語を削除することで、コードが少し読みやすくなり、理解しやすくなります。

于 2014-05-13T13:34:02.343 に答える