2016-12-07 14 views
0

私は、異なる都市間のルートをトレースし、距離を計算し、都市が直接接続されているかどうかを調べる簡単なPrologプログラムをコーディングしています。 都市が直接接続されていても返ってこないので、最初の部分は部分的に成功しましたが、都市とプログラムの間のルートをトレースすることはできません。無限ループ、私はちょうど理由を理解できません。Prolog:都市間のルートの追跡は無限ループになります

コードは以下の通りです:

road (city1, city2, distance).

road(campinas,valinhos,16.9). 
road(campinas,paulinia,30.1). 
road(campinas,hortolandia,27.6). 
road(campinas,holambra,41.1). 
road(valinhos,vinhedo,7.8). 
road(paulinia,cosmopolis,18.5). 
road(hortolandia,sumare,9.1). 
road(holambra,santo_antonio_de_posse,16.7). 
road(vinhedo,louveira,11.2). 
road(sumare,americana,12.3). 
road(sumare,santa_barbara_doeste,29.8). 
road(louveira,jundiai,12.9). 
road(americana,limeira,27.6). 
road(limeira,cordeiropolis,14.9). 
road(santa_barbara_doeste,piracicaba,28.0). 
road(cordeiropolis,araras,21.4). 

conects(A,B,D):-road(A,B,D). 
conects(A,B,D):-road(B,A,D). 

distance(A,B,0):- A == B!. 
distance(A,B,D):- conects(A, B, D). 
distance(A,B,D):- distance(B1,B,D2), conects(A,B1,D1), not(conects(A,B,_)), D is D1 + D2. 

私が間違って何をしているのですか?

+0

ここには「not(conectas(A、B、_))」の入力ミスがあるようです。 (conects(A、B、_))でなければならない。距離(A、B、0)のカットを導入する:-A == B、!バックトラッキングを回避します。 – Karpak

+0

がそれを修正しても、結果はまだ「ローカルスタック外」です。何が起こっていますか? –

答えて

2

コードをトレースすると、最初の2つのdistance/3句を統一できなくても、がアンバインドされているため、常に一致することができるため、無限ループに入ります。

road(campinas,valinhos,16.9). 
road(campinas,paulinia,30.1). 
road(campinas,hortolandia,27.6). 
road(campinas,holambra,41.1). 
road(valinhos,vinhedo,7.8). 
road(paulinia,cosmopolis,18.5). 
road(hortolandia,sumare,9.1). 
road(holambra,santo_antonio_de_posse,16.7). 
road(vinhedo,louveira,11.2). 
road(sumare,americana,12.3). 
road(sumare,santa_barbara_doeste,29.8). 
road(louveira,jundiai,12.9). 
road(americana,limeira,27.6). 
road(limeira,cordeiropolis,14.9). 
road(santa_barbara_doeste,piracicaba,28.0). 
road(cordeiropolis,araras,21.4). 

conects(A,B,D):-road(A,B,D). 
conects(A,B,D):-road(B,A,D). 

distance(A,A,0). 
distance(A,B,D):- conects(A, B, D). 
distance(A,B,D):- not(conects(A,B,_)), conects(A1, A, D1), A1 \= A, conects(B1, B, D2), B1 \= B, distance(A1, B1, D3), D is D1 + D2 + D3. 

試運転:

[debug] ?- distance(campinas, louveira, D). 
D = 35.9 ; 
D = 95.49999999999999 ; 
D = 155.09999999999997 ; 
D = 214.7 ; 
D = 274.3 ; 
D = 333.90000000000003 ; 
D = 393.50000000000006 ; 
D = 453.1000000000001 ; 
D = 512.7 ; 
D = 572.3 ; 
D = 631.8999999999999 ; 
D = 691.4999999999998 ; 
D = 751.0999999999997 ; 
D = 810.6999999999996 ; 
D = 870.2999999999995 

[debug] ?- distance(campinas, test, D). 
false. 

[debug] ?- distance(campinas, louveira, D). 
D = 35.9 

は実際にそれが同じ都市間を何度も移動することにより、距離の無限の数を見つけることができますが、次のように

はあなたのコードを変更し

あなたがそうしたくない場合は、 DD !は、次のように:

distance(A,B,D):- not(conects(A,B,_)), conects(A1, A, D1), A1 \= A, conects(B1, B, D2), B1 \= B, distance(A1, B1, D3), !, D is D1 + D2 + D3. 

テスト・ラン:

[debug] ?- distance(campinas, louveira, D). 
D = 35.9. 

[debug] ?- 

はそれが役に立てば幸いに... trace/0はあなたの友達です。

+1

本当にありがとうございました。また、Prologがどのように動作するかについて私がしなかった多くのことを理解するのを助けました。 –

関連する問題