| 
									
										
										
										
											2001-06-06 20:07:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | :- object(location(_X, _Y)). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:- info([ | 
					
						
							| 
									
										
										
										
											2003-02-05 00:15:28 +00:00
										 |  |  | 		author is 'Paulo Moura', | 
					
						
							| 
									
										
										
										
											2001-06-06 20:07:01 +00:00
										 |  |  | 		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.']). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:- op(400, yfx, ~). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	:- 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. |