0

私は次のような事実でいっぱいのデータベースを持っています:

overground( watfordjunction   , watfordhighstreet , 2 ). 
overground( watfordhighstreet , bushey            , 3 ). 
overground( bushey            , carpenderspark    , 3 ). 
overground( carpenderspark    , hatchend          , 2 ). 

例:ワトフォードジャンクションからワトフォードハイストリートまでは2分かかります。

次に、ある駅から別の駅への移動が逆の移動を含めて実行できるかどうかをテストできるように、ルールを設計しました。

isjourney(Station1,Station2):-
   overground(Station1,_,_), overground(_,Station2,_),!; overground(Station2,_,_), overground(_,Station1,_),!.
isjourney(Station1,Station2):-
   overground(Station1,Station3,_), isjourney(Station3,Station2).
isjourney(Station1,Station2):-
   overground(Station3,Station2,_), isjourney(Station1,Station3).

1行目は最初にstation1とstation2がファクトに存在するかどうかをチェックすることを理解しています。無限ループを防ぐために、旅が真実であることが判明すると、カットはバックトラックも終了します。

次に、2行目は、駅1と駅2の間の移動が中間駅(駅3)を経由できるかどうかを確認します。私が混乱しているのは、その3行目です...それはちょうど反対のことをしているように思えます。つまり、2行目と同じことをチェックしますが、逆の旅をします。しかし、私が見つけたのは、3行目を削除してコードをテストしても、逆の旅をテストする場合も含めて、それでも機能するということです。ルールの2行目で、順方向と逆方向の移動が可能かどうかを確認できる場合、3行目は何をしていますか?

4

2 に答える 2

1

これは、道路が双方向であり、ルートの出発地と目的地が入れ替わっている可能性があることを意味します。

コードは、2つの場所の間にルートがあるかどうかさえチェックしません。最初のルールはtrue出力として取得するのに十分です。最初のルールで場所の存在を確認する場合は、別の名前を付けます。存在を確認することは、それらの間にルートを設けることと同じではありません。

于 2012-01-17T20:37:22.870 に答える
1

逆のことをしているように思えます。つまり、2行目と同じことをチェックしますが、逆の旅をします。

それは確かにそれがしているように見えることです。このコードは非常に紛らわしいです。次のような中間述語を使用して記述した方がよいでしょう。

connected(A, B) :- overground(A, B, _).
connected(A, B) :- overground(B, A, _).
于 2012-01-17T20:40:10.130 に答える