次のような事実でいっぱいのデータベースがあります。
overground(newcrossgate,brockley,2).
overground(brockley,honoroakpark,3).
overground(honoroakpark,foresthill,3).
overground(foresthill,sydenham,2).
overground(sydenham,pengewest,3).
overground(pengewest,anerley,2).
overground(anerley,norwoodjunction,3).
overground(norwoodjunction,westcroydon,8).
overground(sydenham,crystalpalace,5).
overground(highburyandislington,canonbury,2).
overground(canonbury,dalstonjunction,3).
overground(dalstonjunction,haggerston,1).
overground(haggerston,hoxton,2).
overground(hoxton,shoreditchhighstreet,3).
例: ニュークロスゲートからブロックリーまでの所要時間は 2 分です。
次に、クエリを入力すると istime(newcrossgate,honoroakpark,Z) になるようにルールを作成しました。プロローグは、これらの 2 つの駅間を移動するのにかかる時間を教えてくれるはずです。(私が作成したルールは、隣接する駅だけでなく、任意の 2 つの駅間の距離を計算するように設計されています)。
istime(X,Y,Z):- istime(X,Y,0,Z); istime(Y,X,0,Z).
istime(X,Y,T,Z):- overground(X,Y,Z), T1 is T + Z.
istime(X,Y,Z):- overground(X,A,T), istime(A,Y,T1), Z is T + T1.
istime(X,Y,Z):- overground(X,B,T), istime(B,X,T1), Z is T + T1.
newcrossgate から最初の 2 駅まで、たとえば newcrossgate から foresthill または sydenham までは完璧に機能するようです。しかし、26分かかるウェストクロイドンへのニュークロスゲートをテストした後、クリスタルパレスへのニュークロスゲートを試してみたところ、プロローグは15分かかるはずだと言いました...ウェストクロイドンの次の駅であるという事実にもかかわらず。ここで明らかに何かがおかしいのですが、ほとんどのステーションで機能しますが、時々時折エラーが発生します。何が問題なのか教えてもらえますか? :S