All pastes #1361037 Raw Edit

Something

public text v1 · immutable
#1361037 ·published 2009-03-14 23:20 UTC
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.
*/