
train(southampton,waterloo,21).
train(southampton,salisbury,10).
train(salisbury,waterloo,20).
train(waterloo,brussels,69).

bus(southampton,heathrow,9).
bus(southampton,waterloo,10).

taxi(southampton,heathrow,39).
taxi(waterloo,heathrow,8).

flight(heathrow,brussels,50).
flight(heathrow,faro,69).
flight(southampton,brussels,150).

/* travel(southampton,brussels,C,Route), 
	C<70.
*/
	
	direct(A,B,Cost,train) :- train(A,B,Cost).
	direct(A,B,Cost,bus) :- bus(A,B,Cost).
	direct(A,B,Cost,taxi) :- taxi(A,B,Cost).
	direct(A,B,Cost,flight) :- flight(A,B,Cost).

/* query:
	train(X,waterloo,C).
	bus(X,Y,_),flight(Y,Z,_). */

travel(A,B,Cost) :- direct(A,B,Cost,_).
travel(A,B,Cost) :-
	direct(A,C,Cost1,_),
	travel(C,B,Cost2),
	Cost is Cost1 + Cost2.

	
	
/* query:
travel(southampton,brussels,C), C<70.
*/
	
travel(A,A,0,[]).
travel(A,B,Cost,[train_to(C)|CB]) :-
	train(A,C,Cost1),
	travel(C,B,Cost2,CB),
	Cost is Cost1 + Cost2.
travel(A,B,Cost,[bus_to(C)|CB]) :-
	bus(A,C,Cost1),
	travel(C,B,Cost2,CB),
	Cost is Cost1 + Cost2.
travel(A,B,Cost,[taxi_to(C)|CB]) :-
	taxi(A,C,Cost1),
	travel(C,B,Cost2,CB),
	Cost is Cost1 + Cost2.
travel(A,B,Cost,[flight_to(C)|CB]) :-
	flight(A,C,Cost1),
	travel(C,B,Cost2,CB),
	Cost is Cost1 + Cost2.
	
/* travel(southampton,brussels,C,Route), 
	C<70.
	
 findall(_C,
	travel(southampton,brussels,
	        _C,_Route),Res).
	
 travel(southampton,brussels,C,R), 
	 \+(member(via(heathrow),R)).
*/
	
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
