私が設定した時刻に残して到着し、場所からそしてに行くバスWTHバス会社を反映したプロローグで、この知識ベース、作成しました:間のルートがある場合、私は私の知識ベースを尋ねるたびこのグラフパスファインダーのPrologで中間ステップを表示するにはどうすればよいですか?
connection(kerkrade, heerlen, 1100, 1200).
connection(kerkrade, bleijerheide, 1100, 1225).
connection(heerlen, kerkrade, 1115, 1230).
connection(heerlen, maastricht, 1230, 1330).
connection(maastricht, heerlen, 1430, 1530).
connection(maastricht, sittard, 1331, 1430).
connection(maastricht, sittard, 1345, 1445).
connection(sittard, maastricht, 1630, 1530).
connection(sittard, denbosch, 1530, 1700).
connection(denbosch, sittard, 1800, 1930).
connection(denbosch, amsterdam, 1000, 1330).
checkTime(X,Y,Z):-
connection(X,Y,S,_),
(Z =< S).
aRoute(From, To, Time):-
checkTime(From,To,Time).
testRoute(A,B,T):-
walk(A,B,T,[]).
walk(A,B,Time,V) :-
aRoute(A,X,Time),
not(member(X,V)),
(
B = X;
connection(A,X,_,S), walk(X,B,S,[A|V])
).
を2つのポイントは、それが可能かどうかを返します。 true
またはfalse
:
testRoute(kerkrade, sittard, 900).
true; (signifies that there are three routes, of which two are possible)
true;
false.
しかし、これは私が望むものではありません。私はこのようなトップレベル内の2点間のルートを作成するために使用される接続を表示する最良のケースで:
connection(kerkrade, heerlen, 1100, 1200)
connection(heerlen, maastricht, 1230, 1330)
/* and so on.. */
私はこれをどのように行うのですか?私はX
のような変数をtestRouteへの呼び出しと一緒に渡さなければならないと思うので、その値を報告することができます。私はそれを置く場所が不明なので、その述語を書くのに問題があります。私の考えは、walk(A,B,Time,V)
に余分なパラメータを追加する必要があるということですが、それ以降、ルートの中間ステップを報告するために、その後に何ができるのか分かりません。
あなたの答えを提案しているあなたは、ルート
ために別の変数を渡すために持っているとは完璧に働いた、ありがとうございました! 'L = []'は正確に何をするのですか?それは空のリストとLの間の平等を評価しますか? – Zimano
Lを空リストと統一していますか? – Zimano
リストのHeadをインスタンス化したので、リストの末尾が空でなければなりません(追加する要素はありません)ので、Lを空のリストと統一します。 – coder