2016-10-07 12 views
0

Prologプログラムを介して小都市NZをリンクする際に問題があります。私は道路、その出入り口、および距離である一連のデータを与えられています。私は最初の問題はまっすぐになると思ったが、私は幸運にもこれで何時間も私の髪を引っ張ってきた。私がしなければならないのは、ルートを考えれば実現可能な道をプリントアウトすることだけだった。なぜソリューションは正しいパスを見つけることができないのですか?Prologグラフが経路を見つけられない

road('Wellington', 'Palmerston North', '143'). 
road('Palmerston North', 'Wanganui', '74'). 
road('Palmerston North', 'Napier', '178'). 
road('Palmerston North', 'Taupo', '259'). 
road('Wanganui', 'Taupo', '231'). 
road('Wanganui', 'New Plymouth', '163'). 
road('Wanganui', 'Napier', '252'). 
road('Napier', 'Taupo', '147'). 
road('Napier', 'Gisborne', '215'). 
road('New Plymouth', 'Hamilton', '242'). 
road('New Plymouth', 'Taupo', '289'). 
road('Taupo', 'Hamilton', '153'). 
road('Taupo', 'Rotorua', '82'). 
road('Taupo', 'Gisborne', '334'). 
road('Gisborne', 'Rotorua', '291'). 
road('Rotorua', 'Hamilton', '109'). 
road('Hamilton', 'Auckland', '126'). 

route(Current, Finish, []) :- route(Current, Finish, [Current]).  
route(Current, Finish, _) :- Current==Finish.  
route(Current, Finish, Visits) :- traverse(Current, Next, Visits), route(Next, Finish, Visits). 

traverse(Current, Next, [Next|_]) :- road(Current, Next, _). 

私が呼ぶたび:route('Wellington','Napier', X).それはパス、Wellington->パーマストンノース - >ネイピアそこにいるにもかかわらず、失敗しました。事前に感謝します、私はおそらく私がPrologを初めて使っているので、何かばかげたことをしていることを知っています。

答えて

1

私はあなたが必要としないいくつかの余分な句を持っていると思う:

route(Current, Current, [Current]).  
route(Current, Finish, [Current|T]) :- road(Current, Next, _), 
             route(Next, Finish, T). 

例:

?- route('Wellington','Napier', X). 
X = ['Wellington', 'Palmerston North', 'Wanganui', 'Napier'] ; 
X = ['Wellington', 'Palmerston North', 'Napier'] ; 
false. 

注形road('X','Y').の定義された条項が'X'からの道があることを意味すること'Y'になりますが、その逆ではありません。

?- route('Palmerston North','Wellington',L). 
false. 

あなたが宣言した道は片道だけです。

あなたは敵例に句を追加する場合:

road('Palmerston North','Wellington', '143'). 

次に照会場合:

?- route('Wellington','Wellington', X). 
X = ['Wellington'] ; 
X = ['Wellington', 'Palmerston North', 'Wellington'] ; 
X = ['Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington'] ; 
X = ['Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington', 'Palmerston North', 'Wellington'] 

とに行く....それは、円の中に落ちるようにします。あなたは(それが原因のサイクルに、これまでに検索されます他のため)のパスの長さを与え、sort(L,L).

+0

恐ろしい感謝を使って、異なる都市とのパスのみを受け入れる

route2(X,Y,L,N):- length(L,N),route(X,Y,L),sort(L,L). 

:あなたが書くことができ、これを解決するために それを明確にするために、私はそれを思慮深くする傾向があります。私がそこにいると信じている接続の片方向のことを指摘してくれてありがとうございます。それらを結びつけるもう2つのルールを必要とする2通りの方法があります。 – SHolmes

+0

道路が2通りあるときに役立ちました。私の答えを編集します。 – coder

関連する問題