flight :-
   write('Fly Amzi! Air'), nl,
   repeat,
   do_command.

do_command :-
   write('enter command> '),
   read_string(STRING),
   string_tokens(STRING, TOKENS),
   command(CLIST, TOKENS, []),
   COMMAND =.. CLIST,
   call(COMMAND),
   !,
   COMMAND == exit.
  
command([OP|ARGS]) --> operation(OP), arguments(ARGS).

arguments([ARG|ARGS]) --> argument(ARG), arguments(ARGS).
arguments([]) --> [].

operation(report) --> [list].
operation(book) --> [book].
operation(exit) --> ([exit]; [quit]; [bye]).

argument(passengers) --> [passengers].
argument(flights) --> [flights].

argument(FLIGHT) --> [FLIGHT], {flight(FLIGHT)}.
argument(PASSENGER) --> [PASSENGER].

flight(aa101).
flight(aa102).
flight(aa103).

flights(flights) :-
   flight(F),
   write(F), nl,
   fail.
flights(_).

flights(passengers, FLIGHT) :-
   booked(PASSENGER, FLIGHT),
   write(PASSENGER), nl,
   fail.
flights(_, _).

book(PASSENGER, FLIGHT) :-
   assert(booked(PASSENGER, FLIGHT)).

