This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/examples/lo/travellers/towns.lgt

352 lines
4.9 KiB
Plaintext
Raw Normal View History

:- 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.