#!/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. */