2016-04-17 6 views
0

プロローグを学習していて、ルートを見つけようとするとクリープエラーが発生します。 私は、再帰であると思います。それは、直線経路ではない経路を見つける方法なので、再帰です。ここで ルートが見つかったときにプロローグにクリープエラーが発生しました

はコードです:

route(london,paris). 
route(paris,rome). 
route(rome,spain). 
route(london,berlin). 
route(berlin,praga). 
route(london,dublin). 
route(dublin,berlin). 

path(X,Y,[X,Y]):- straight(X,Y). 
path(X,Z,[X | other]):- straight(X,Y), path(Y,Z,other). 

私は見つけるしようとすると、のは、私はこのエラーを取得ローマ

path(london,rome,Store). 

にロンドンからのルートを言わせて:

Exception: (8) straight(london, rome) ? creep 

Exception: (7) path(london, rome, _G4705) ? creep 

を何私は間違っている? 別の定義が必要ですか?

ありがとうございます!

+1

s /ストレート/ルート/ – false

答えて

2

あなたの述語はほぼ正しいです。あなただけの代わりに原子otherの変数Otherとしてリストの末尾を書き、第二にストレート接続のためにルート/ 2あなたの事実を使用する必要があります。

path(X,Y,[X,Y]) :- 
    route(X,Y). 
path(X,Z,[X | Other]) :- 
    route(X,Y), 
    path(Y,Z,Other). 

今、あなたのクエリが動作します。

?- path(london,rome,S). 
S = [london,paris,rome] ? ; 
no 
関連する問題