352 lines
4.9 KiB
Plaintext
352 lines
4.9 KiB
Plaintext
|
|
||
|
:- object(location(_X, _Y)).
|
||
|
|
||
|
:- info([
|
||
|
author is 'Paulo Moura',
|
||
|
version is 1.0,
|
||
|
date is 2000/4/22,
|
||
|
parnames is ['X', 'Y'],
|
||
|
comment is '.',
|
||
|
source is 'Example adopted from the Francis G. McCabe L&O documentation.']).
|
||
|
|
||
|
:- public(at/2).
|
||
|
:- mode(at(-integer, -integer), one).
|
||
|
|
||
|
:- public(crow_flies/2).
|
||
|
:- mode(crow_flies(+atom, -integer), one).
|
||
|
|
||
|
:- public(drive/2).
|
||
|
:- mode(drive(+atom, -nonvar), zero_or_more).
|
||
|
|
||
|
:- public(links/1).
|
||
|
:- mode(links(-list), one).
|
||
|
|
||
|
:- public(road_distance/2).
|
||
|
:- mode(road_distance(?atom, ?integer), zero_or_more).
|
||
|
|
||
|
at(X, Y) :-
|
||
|
parameter(1, X),
|
||
|
parameter(2, Y).
|
||
|
|
||
|
crow_flies(Town, Distance) :-
|
||
|
::at(X, Y),
|
||
|
Town::at(U, V),
|
||
|
U0 is U-X,
|
||
|
V0 is V-Y,
|
||
|
Distance is sqrt(U0*U0+V0*V0).
|
||
|
|
||
|
road_distance(Town, Distance) :-
|
||
|
::links(Links),
|
||
|
member((Town, Distance), Links).
|
||
|
|
||
|
drive(To, Route) :- % plan a road journey
|
||
|
self(Self),
|
||
|
plan_drive(Self, To, [], _, Route).
|
||
|
|
||
|
% go directly
|
||
|
plan_drive(From, To, _, Distance, From-To):-
|
||
|
To::links(Links),
|
||
|
member((From, Distance), Links).
|
||
|
|
||
|
% go indirectly
|
||
|
plan_drive(From, To, R, D+DI, Route-To):-
|
||
|
To::links(Links),
|
||
|
nearest(Links, From, Int, DI),
|
||
|
\+ member(Int, R),
|
||
|
plan_drive(From, Int, [To| R], D, Route).
|
||
|
|
||
|
nearest(Links, To, Int, Distance):-
|
||
|
quick(metric(To))::sort(Links, Sorted),
|
||
|
member((Int, Distance), Sorted).
|
||
|
|
||
|
member(Head, [Head| _]).
|
||
|
member(Head, [_| Tail]) :-
|
||
|
member(Head, Tail).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
|
||
|
:- object(aberdeen,
|
||
|
extends(location(194, 340))).
|
||
|
|
||
|
links([
|
||
|
(edinburgh, 115),
|
||
|
(glasgow, 142)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(aberystwyth,
|
||
|
extends(location(126, 102))).
|
||
|
|
||
|
links([
|
||
|
(birmingham, 114),
|
||
|
(liverpool, 100),
|
||
|
(swansea, 75)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(birmingham,
|
||
|
extends(location(192, 106))).
|
||
|
|
||
|
links([
|
||
|
(aberystwyth, 114),
|
||
|
(bristol, 86),
|
||
|
(cambridge, 97),
|
||
|
(liverpool, 99),
|
||
|
(nottingham, 48),
|
||
|
(oxford, 63),
|
||
|
(sheffield, 75)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(brighton,
|
||
|
extends(location(248, 10))).
|
||
|
|
||
|
links([
|
||
|
(dover, 81),
|
||
|
(portsmouth, 49),
|
||
|
(london, 52)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(bristol,
|
||
|
extends(location(168, 47))).
|
||
|
|
||
|
links([
|
||
|
(cardiff, 44),
|
||
|
(exeter, 76),
|
||
|
(oxford, 71),
|
||
|
(birmingham, 86)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(cambridge,
|
||
|
extends(location(254, 92))).
|
||
|
|
||
|
links([
|
||
|
(nottingham, 82),
|
||
|
(oxford, 80),
|
||
|
(london, 54),
|
||
|
(birmingham, 97)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(cardiff,
|
||
|
extends(location(148, 56))).
|
||
|
|
||
|
links([
|
||
|
(bristol, 44),
|
||
|
(swansea, 45)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(carlisle,
|
||
|
extends(location(166, 226))).
|
||
|
|
||
|
links([
|
||
|
(glasgow, 94),
|
||
|
(leeds, 117),
|
||
|
(newcastle, 58)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(dover,
|
||
|
extends(location(292, 38))).
|
||
|
|
||
|
links([
|
||
|
(brighton, 81),
|
||
|
(london, 71)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(edinburgh,
|
||
|
extends(location(162, 282))).
|
||
|
|
||
|
links([
|
||
|
(aberdeen, 115),
|
||
|
(glasgow, 44),
|
||
|
(newcastle, 104)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(exeter,
|
||
|
extends(location(138, 18))).
|
||
|
|
||
|
links([
|
||
|
(bristol, 76),
|
||
|
(penzance, 112),
|
||
|
(portsmouth, 126)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(glasgow,
|
||
|
extends(location(132, 273))).
|
||
|
|
||
|
links([
|
||
|
(aberdeen, 142),
|
||
|
(carlisle, 94),
|
||
|
(edinburgh, 44)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(hull,
|
||
|
extends(location(240, 168))).
|
||
|
|
||
|
links([
|
||
|
(leeds, 58),
|
||
|
(sheffield, 65),
|
||
|
(york, 37)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(leeds,
|
||
|
extends(location(208, 170))).
|
||
|
|
||
|
links([
|
||
|
(carlisle, 117),
|
||
|
(hull, 58),
|
||
|
(sheffield, 34),
|
||
|
(manchester, 41),
|
||
|
(york, 23)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(liverpool,
|
||
|
extends(location(164, 150))).
|
||
|
|
||
|
links([
|
||
|
(aberystwyth, 100),
|
||
|
(birmingham, 99),
|
||
|
(manchester, 35),
|
||
|
(sheffield, 70)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(london,
|
||
|
extends(location(244,54))).
|
||
|
|
||
|
links([
|
||
|
(brighton, 52),
|
||
|
(dover, 71),
|
||
|
(cambridge, 54),
|
||
|
(oxford, 57),
|
||
|
(portsmouth, 72)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(manchester,
|
||
|
extends(location(180, 156))).
|
||
|
|
||
|
links([
|
||
|
(leeds, 41),
|
||
|
(liverpool, 35),
|
||
|
(sheffield, 38)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(newcastle,
|
||
|
extends(location(210, 230))).
|
||
|
|
||
|
links([
|
||
|
(edinburgh, 104),
|
||
|
(carlisle, 58),
|
||
|
(york, 80)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(nottingham,
|
||
|
extends(location(216, 128))).
|
||
|
|
||
|
links([
|
||
|
(birmingham, 48),
|
||
|
(cambridge, 82),
|
||
|
(sheffield, 38)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(oxford,
|
||
|
extends(location(214, 66))).
|
||
|
|
||
|
links([
|
||
|
(bristol, 71),
|
||
|
(birmingham, 63),
|
||
|
(cambridge, 80),
|
||
|
(london, 57)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(penzance,
|
||
|
extends(location(10, 0))).
|
||
|
|
||
|
links([(
|
||
|
exeter, 112)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(portsmouth,
|
||
|
extends(location(216, 22))).
|
||
|
|
||
|
links([
|
||
|
(brighton, 49),
|
||
|
(exeter, 126),
|
||
|
(london, 72)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(sheffield,
|
||
|
extends(location(208, 142))).
|
||
|
|
||
|
links([
|
||
|
(birmingham, 75),
|
||
|
(hull, 65),
|
||
|
(leeds, 34),
|
||
|
(liverpool, 70),
|
||
|
(manchester, 38),
|
||
|
(nottingham, 38)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(swansea,
|
||
|
extends(location(126, 66))).
|
||
|
|
||
|
links([
|
||
|
(cardiff, 45),
|
||
|
(aberystwyth, 75)]).
|
||
|
|
||
|
:- end_object.
|
||
|
|
||
|
|
||
|
:- object(york,
|
||
|
extends(location(218, 184))).
|
||
|
|
||
|
links([
|
||
|
(leeds, 23),
|
||
|
(hull, 37),
|
||
|
(newcastle, 80)]).
|
||
|
|
||
|
:- end_object.
|