私は次のような事実でいっぱいのデータベースを持っています:
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行目は何をしていますか?