2016-10-13 6 views
3

私が設定した時刻に残して到着し、場所からそしてに行くバス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)に余分なパラメータを追加する必要があるということですが、それ以降、ルートの中間ステップを報告するために、その後に何ができるのか分かりません。

答えて

3

あなたは、書面による接続でリストを保つことができる:

checkTime(X,Y,Z, connection(X,Y,S,W)):- 
    connection(X,Y,S,W), 
    (Z =< S). 

aRoute(From, To, Time,Head):- 
    checkTime(From,To,Time,Head). 

testRoute(A,B,T,L):- 
    walk(A,B,T,[],L). 


walk(A,B,Tijd,V,[Head|L]) :- 
    aRoute(A,X,Tijd,Head), 
    not(member(X,V)), 
    (
     B = X,L=[]; 
     connection(A,X,_,S), walk(X,B,S,[A|V],L) 
    ). 

例:

?- testRoute(kerkrade, sittard, 900,L). 
L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1331, 1430)] ; 
L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1345, 1445)] ; 
false. 
+0

あなたの答えを提案しているあなたは、ルート

ために別の変数を渡すために持っているとは完璧に働いた、ありがとうございました! 'L = []'は正確に何をするのですか?それは空のリストとLの間の平等を評価しますか? – Zimano

+0

Lを空リストと統一していますか? – Zimano

+0

リストのHeadをインスタンス化したので、リストの末尾が空でなければなりません(追加する要素はありません)ので、Lを空のリストと統一します。 – coder

3

を私は2つのポイントとの間のルートを作成するために使用される接続を示したいと思います。.. 。]これはどうすればいいですか?私はtestRouteへの呼び出しと一緒にXのような変数を渡さなければならないと思うので、その値を報告することができます。

はい:私は、私は以下のソリューション

walk(Stop, Stop, _, ReverseRoute, DirectRoute):- 
    reverse(ReverseRoute, DirectRoute). 

walk(Start, Stop, TimeMin, ReverseRoute, DirectRoute) :- 
    connection(Start, Mid, TimeStart, TimeArrival), 
    TimeMin =< TimeStart, 
    not(member(Mid, ReverseRoute)), 
    walk(Mid, Stop, TimeArrival, [Mid | ReverseRoute], DirectRoute). 

testRoute(Start, Stop, TimeStart, Route) :- 
    walk(Start, Stop, TimeStart, [Start], Route). 
関連する問題