3455276aa2
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1487 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
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.
|