
:- object(driving,
	extends(salesman)).


	:- info([
		author is 'Paulo Moura',
		version is 1.0,
		date is 2000/4/22,
		comment is '.',
		source is 'Example adopted from the Francis G. McCabe L&O documentation.']).


	:- op(400, yfx, ~).


	route(Towns, Route) :-
		presort::route(Towns, Presort), 
		drive_around(Presort, Route).


	drive_around(Route~Town1~Town2, Route1~Route2) :-
		!,
		drive_around(Route~Town1, Route1),
		Town1::drive(Town2, Route2).

	drive_around(Town1~Town2, Route) :-
		!,
		Town1::drive(Town2, Route).

	drive_around(Town, Town).


	drive_length(Route, Length) :-
		drive_length(Route, 0, Length).


	drive_length(Route~Town1~Town2, Acc, Length) :-
		!,
		Town1::road_distance(Town2, Length2),
		Acc2 is Acc + Length2,
		drive_length(Route~Town1, Acc2, Length).

	drive_length(Town1~Town2, Acc, Length) :-
		!,
		Town1::road_distance(Town2, Length2),
		Length is Acc + Length2.

	drive_length(_, Length, Length).


:- end_object.
