212 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			212 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Planner
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(plan(_)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- info([
							 | 
						||
| 
								 | 
							
										author is 'Paulo Moura',
							 | 
						||
| 
								 | 
							
										version is 1.0,
							 | 
						||
| 
								 | 
							
										date is 2000/4/22,
							 | 
						||
| 
								 | 
							
										comment is 'Air-line trip planner.',
							 | 
						||
| 
								 | 
							
										parnames is ['Mode'],
							 | 
						||
| 
								 | 
							
										source is 'Example adopted from the Francis G. McCabe L&O documentation.']).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(from/3).
							 | 
						||
| 
								 | 
							
									:- mode(from(+atom, +atom, -list), zero_or_more).
							 | 
						||
| 
								 | 
							
									:- info(from/3,
							 | 
						||
| 
								 | 
							
										[comment is 'Plan a trip from Start to Destination.',
							 | 
						||
| 
								 | 
							
										 argnames is ['Start', 'Destination', 'Plan']]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									from(Start, Destination, Plan) :-
							 | 
						||
| 
								 | 
							
										from(Start, Destination, [], Plan).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									from(Start, Destination, _, [Step]) :-
							 | 
						||
| 
								 | 
							
										parameter(1, Mode),
							 | 
						||
| 
								 | 
							
										Mode::step(Start, Destination, Step),
							 | 
						||
| 
								 | 
							
										!.
							 | 
						||
| 
								 | 
							
									from(Start, Destination, Locations, [Step| Steps]) :-
							 | 
						||
| 
								 | 
							
										parameter(1, Mode),
							 | 
						||
| 
								 | 
							
										Mode::step(Start, City2, Step),
							 | 
						||
| 
								 | 
							
										not_member(City2, Locations),
							 | 
						||
| 
								 | 
							
										from(City2, Destination, [Start| Locations], Steps).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									not_member(_, []).
							 | 
						||
| 
								 | 
							
									not_member(City, [Location| Locations]) :-
							 | 
						||
| 
								 | 
							
										City \= Location,
							 | 
						||
| 
								 | 
							
										not_member(City, Locations).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Abstractions of City, Airport, and Flight
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(city).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(step/3).
							 | 
						||
| 
								 | 
							
									:- mode(step(+, +, -), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(airport/1).
							 | 
						||
| 
								 | 
							
									:- mode(airport(?atom), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									step(X, Y, P1-P-P2) :-
							 | 
						||
| 
								 | 
							
										\+ same_city(X, Y), !,
							 | 
						||
| 
								 | 
							
										X::airport(XA),
							 | 
						||
| 
								 | 
							
										Y::airport(YA),
							 | 
						||
| 
								 | 
							
										plan(fly)::from(XA, YA, P),
							 | 
						||
| 
								 | 
							
										plan(city)::from(X, XA, P1),
							 | 
						||
| 
								 | 
							
										plan(city)::from(YA, Y, P2).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									step(X, Y, taxi(X, Y)) :-
							 | 
						||
| 
								 | 
							
										same_city(X, Y),
							 | 
						||
| 
								 | 
							
										X \= Y.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									same_city(X, Y) :-
							 | 
						||
| 
								 | 
							
										X::airport(A),
							 | 
						||
| 
								 | 
							
										Y::airport(A).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(airport).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(fly/1).
							 | 
						||
| 
								 | 
							
									:- mode(fly(?), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(airport/1).
							 | 
						||
| 
								 | 
							
									:- mode(airport(?), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									airport(Airport) :-
							 | 
						||
| 
								 | 
							
										self(Airport).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(fly).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									:- public(step/3).
							 | 
						||
| 
								 | 
							
									:- mode(step(+, +, -), zero_or_more).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									step(From, To, fly(From, To)) :-
							 | 
						||
| 
								 | 
							
										From::fly(To).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Edinburgh locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(edinburgh,
							 | 
						||
| 
								 | 
							
									extends(city)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									airport(edin).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(edin,
							 | 
						||
| 
								 | 
							
									extends(edinburgh)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(castle,
							 | 
						||
| 
								 | 
							
									extends(edinburgh)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(aiai,
							 | 
						||
| 
								 | 
							
									extends(edinburgh)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Glasgow locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(glasgow,
							 | 
						||
| 
								 | 
							
									extends(city)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									airport(renfrew).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% London locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(london,
							 | 
						||
| 
								 | 
							
									extends(city)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									airport(lhr).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(albert_hall,
							 | 
						||
| 
								 | 
							
									extends(london)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(imperial,
							 | 
						||
| 
								 | 
							
									extends(london)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Manchester locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(manchester,
							 | 
						||
| 
								 | 
							
									extends(city)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									airport(ringway).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(victoria,
							 | 
						||
| 
								 | 
							
									extends(manchester)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Airports
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(aberdeen_air,
							 | 
						||
| 
								 | 
							
									extends(airport)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fly(renfrew).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(lhr,
							 | 
						||
| 
								 | 
							
									extends(airport)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fly(edin).
							 | 
						||
| 
								 | 
							
									fly(ringway).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(renfrew,
							 | 
						||
| 
								 | 
							
									extends(airport)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fly(aberdeen_air).
							 | 
						||
| 
								 | 
							
									fly(ringway).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- object(ringway,
							 | 
						||
| 
								 | 
							
									extends(manchester, airport)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fly(lhr).
							 | 
						||
| 
								 | 
							
									fly(renfrew).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- end_object.
							 |