rendered paste body#!/afs/cats.ucsc.edu/courses/cmps112-wm/usr/swiprolog/bin/pl -s
/* $Id: functions.pl,v 1.1 2008-02-29 15:47:30-08 - - $ */
/*
* Function: Distance between airports.
* Tested using SWI prolog.
*/
degmin_to_deg( degmin( Degrees, Minutes ), Degreesonly ) :-
Degreesonly is Degrees + Minutes / 60.
pythagoras( X1, Y1, X2, Y2, Hypotenuse ) :-
DeltaX is X1 - X2,
DeltaY is Y1 - Y2,
Hypotenuse is sqrt( DeltaX * DeltaX + DeltaY * DeltaY ).
distance( Airport1, Airport2, DistanceMiles ) :-
airport( Airport1, _, Latitude1, Longitude1 ),
airport( Airport2, _, Latitude2, Longitude2 ),
degmin_to_deg( Latitude1, Latdegrees1 ),
degmin_to_deg( Latitude2, Latdegrees2 ),
degmin_to_deg( Longitude1, Longdegrees1 ),
degmin_to_deg( Longitude2, Longdegrees2 ),
pythagoras( Latdegrees1, Longdegrees1, Latdegrees2, Longdegrees2,
DistanceDegrees ),
DistanceMiles is 69 * DistanceDegrees.
hoursmins_to_hours( time( Hours, Mins ), Hoursonly ) :-
Hoursonly is Hours + Mins / 60.
print_2digits( Digits ) :-
Digits < 10, print( 0 ), print( Digits ).
print_2digits( Digits ) :-
Digits >= 10, print( Digits ).
print_time( Hoursonly ) :-
Minsonly is integer( Hoursonly * 60 ),
Hours is Minsonly // 60,
Mins is Minsonly mod 60,
print_2digits( Hours ),
print( ':' ),
print_2digits( Mins ).
/*validpath( CurrTime, Dephours, Distance ) :-*/
validpath( CurrTime, Dephours) :-
CurrTime < Dephours,
CurrTime + 0.5 < Dephours,
/* Arrivalhours is Dephours + Distance / 500,
Arrivalhours < 24. */
Dephours < 24.
printpath([]).
printpath([flight(Depart, Arrive, DepartTime)|Flightlist]) :-
airport( Depart, Depart_name, _, _ ),
airport( Arrive, Arrive_name, _, _ ),
distance( Depart, Arrive, Distance),
hoursmins_to_hours(DepartTime, DepartHours),
ArrivalHours is DepartHours + Distance / 500,
write( 'depart ' ),
write( Depart ), write( ' ' ), write( Depart_name ),
write( '\t' ), print_time( DepartHours ), nl,
write( 'arrive ' ),
write( Arrive ), write( ' ' ), write( Arrive_name ),
write( '\t' ), print_time( ArrivalHours), nl,
printpath(Flightlist).
fly( Depart, Arrive) :-
listpath( Depart, Arrive, Outlist),
printpath(Outlist).
listpath( Node, End, Outlist ) :-
listpath( Node, End, [Node], Outlist, 0 ).
listpath( Node, Node, _, [], _ ).
listpath( Node, End, Tried, [flight(Node, Next, Deptime)|List], CurrTime ) :-
flight( Node, Next, Deptime),
not( member( Next, Tried )),
hoursmins_to_hours(Deptime, Dephours),
distance( Node, Next, Distance),
validpath( CurrTime, Dephours ),
NewCurrTime is Dephours + Distance / 500,
listpath( Next, End, [Next|Tried], List, NewCurrTime ).
fly1( Depart, Arrive) :-
flight( Depart, Arrive, DepartTime ),
airport( Depart, Depart_name, _, _ ),
airport( Arrive, Arrive_name, _, _ ),
distance( Depart, Arrive, Distance),
hoursmins_to_hours(DepartTime, DepartHours),
ArrivalHours is DepartHours + Distance / 500,
write( 'depart ' ),
write( Depart ), write( ' ' ), write( Depart_name ),
write( '\t' ), print_time( DepartHours ), nl,
write( 'arrive ' ),
write( Arrive ), write( ' ' ), write( Arrive_name ),
write( '\t' ), print_time( ArrivalHours), nl.
/*
* The following is a dummy predicate which doesn't work
* and must be replaced.
*/
/*
fly( Depart, Arrive ) :-
write( 'Depart=' ), write( Depart ), nl,
write( 'Arrive=' ), write( Arrive ), nl,
flight( Depart, Arrive, Time ),
write( 'Time=' ), write( Time ), nl,
airport( Depart, Depart_name, Depart_lat, Depart_long ),
airport( Arrive, Arrive_name, Arrive_lat, Arrive_long ),
write( 'Depart=' ), write( Depart ), nl,
write( 'Depart_name=' ), write( Depart_name ), nl,
write( 'Depart_lat=' ), write( Depart_lat ), nl,
write( 'Depart_long=' ), write( Depart_long ), nl,
write( 'Arrive=' ), write( Arrive ), nl,
write( 'Arrive_name=' ), write( Arrive_name ), nl,
write( 'Arrive_lat=' ), write( Arrive_lat ), nl,
write( 'Arrive_long=' ), write( Arrive_long ), nl.
*/