Reputation: 195
I am writing the following code and is working correctly.
edge(s,a,300,300/500 * 60, 300*1,plane).
edge(s,a,300,300/120 * 60, 300*3/4,train).
edge(s,a,300,300/80 * 60, 300*3/5,bus).
edge(s,a,300,300/100 * 60, 300*2/5,car).
edge(s,a,300,300/5 * 60, 300*0,walk).
edge(s,d,20,20/500 * 60, 20*1,plane).
edge(s,d,20,20/120 * 60, 20*3/4,train).
edge(s,d,20,20/80 * 60, 20*3/5,bus).
edge(s,d,20,20/100 * 60, 20*2/5,car).
edge(s,d,20,20/5 * 60, 20*0,walk).
edge(a,d,400,400/500 * 60, 400*1,plane).
edge(a,d,400,400/120 * 60, 400*3/4,train).
edge(a,d,400,400/80 * 60, 400*3/5,bus).
edge(a,d,400,400/100 * 60, 400*2/5,car).
edge(a,d,400,400/5 * 60, 400*0,walk).
edge(a,b,1500,1500/500 * 60, 1500*1, plane).
edge(a,b,1500,1500/120 * 60, 1500*3/4,train).
edge(a,b,1500,1500/80 * 60, 1500*3/5,bus).
edge(a,b,1500,1500/100 * 60,1500*2/5, car).
edge(a,b,1500,1500/5 * 60, 1500*0,walk).
edge(b,c,9,9/500 * 60, 9*1,plane).
edge(b,c,9,9/120 * 60, 9*3/4,train).
edge(b,c,9,9/80 * 60, 9*3/5,bus).
edge(b,c,9,9/100 * 60,9*2/5, car).
edge(b,c,9,9/5 * 60, 9*0,walk).
edge(b,e,200,200/500 * 60, 200*1, plane).
edge(b,e,200,200/120 * 60, 200*3/4,train).
edge(b,e,200,200/80 * 60, 200*3/5,bus).
edge(b,e,200,200/100 * 60, 200*2/5,car).
edge(b,e,200,200/5 * 60, 200*0,walk).
edge(c,d,2000,2000/500 * 60, 2000 * 1,plane).
edge(c,d,2000,2000/120 * 60, 2000 * 3/4,train).
edge(c,d,2000,2000/80 * 60, 2000 * 3/5,bus).
edge(c,d,2000,2000/100 * 60, 2000 * 2/5,car).
edge(c,d,2000,2000/5 * 60, 2000 * 0,walk).
edge(c,g,12,12/500 * 60, 12 * 1,plane).
edge(c,g,12,12/120 * 60, 12 * 3/4,train).
edge(c,g,12,12/80 * 60, 12 * 3/5,bus).
edge(c,g,12,12/100 * 60, 12 * 2/5,car).
edge(c,g,12,12/5 * 60, 12 *0 ,walk).
edge(d,e,3,3/500 * 60, 3* 1,plane).
edge(d,e,3,3/120 * 60, 3 * 3/4,train).
edge(d,e,3,3/80 * 60, 3 * 3/5,bus).
edge(d,e,3,3/100 * 60, 3 * 2/5,car).
edge(d,e,3,3/5 * 60, 3 * 0,walk).
edge(e,f,400,400/500 * 60, 400 * 1,plane).
edge(e,f,400,400/120 * 60, 400 * 3/4,train).
edge(e,f,400,400/80 * 60, 400 * 3/5,bus).
edge(e,f,400,400/100 * 60, 400 * 2/5,car).
edge(e,f,400,400/5 * 60, 400 * 0,walk).
edge(f,g,800,800/500 * 60, 800 * 1,plane).
edge(f,g,800,800/120 * 60, 800 * 3/4,train).
edge(f,g,800,800/80 * 60, 800 * 3/5,bus).
edge(f,g,800,800/100 * 60, 800 * 2/5,car).
edge(f,g,800,800/5 * 60, 800 * 0,walk).
connected(X,Y,D,T,C) :- edge(X,Y,D,T,C,M) ; edge(Y,X,D,T,C,M).
path(A,B,D,T,C,Path) :-
travel(A,B,D,T,C,[A],Q),
reverse(Q,Path).
travel(A,B,D,T,C,P,[B|P]) :-
connected(A,B,D,T,C).
travel(A,B,D,T,C,Visited,Path) :-
connected(A,X,D1,T1,C1),
X \== B,
\+member(X,Visited),
travel(X,B,D2,T2,C2,[X|Visited],Path),
D is D1 + D2,
T is T1 + T2,
C is C1 + C2.
I wish to know the mode of transport for the selected paths.
I am not able to add it to a list.
So, if I query like
| ? - path(s,e,D,T,C,P,M), T<3.
gives me a list corresponding to each path describing the modes of transport
Upvotes: 0
Views: 266
Reputation: 60014
From graph data it seems there are many different ways to move from, say, s
to e
.
Usually graph data is used while computing the path, also to avoid eventual useless solutions. Your predicate path
already has many arguments, then I show a dumb post search mapping: say you got a path like [a, b, c], then all lists of available transport modes are enumerated with
transport_mode([X,Y|R], [M|Ms]):-
( edge(X,Y,_,_,_,M) ; edge(Y,X,_,_,_,M) ),
transport_mode([Y|R], Ms).
transport_mode([_], []).
edit if you have library(aggregate) (available in SWI-Prolog or Yap), the minimum distance path can be computed this way:
?- aggregate_all(min(D, P), (path(s,e,D,T,C,P), T < 3), Min).
Upvotes: 1