home *** CD-ROM | disk | FTP | other *** search
- /*
- * X PROLOG Vers. 2.0
- *
- *
- * Written by : Andreas Toenne
- * CS Dept. , IRB
- * University of Dortmund, W-Germany
- * <atoenne@unido.uucp>
- * <....!seismo!unido!atoenne>
- * <atoenne@unido.bitnet>
- *
- * Copyright : This software is copyrighted by Andreas Toenne.
- * Permission is granted hereby to copy the entire
- * package including this copyright notice without fee.
- *
- */
-
- % X Prolog Boot File
-
- % hack to create an intermediate goal for call
- % this make the cut local to call
-
- call(A) :- $call(A).
-
- % definitions for conjunction and disjunction
- % both procedures are made transparent to the cut
-
- (A ; B) :- $call(A).
- (A ; B) :- $call(B).
-
- (A , B) :- $call(A), $call(B).
-
- % further predicates
-
- not(Predicate) :- call(Predicate), !, fail.
- not(Predicate).
-
- clause(Head, Body) :- $clause(Head, Body, Help). % see the documentation
-
- A = A. % equality predicate :-)
-
- print(Term) :- var(Term), !, write(Term).
- print(Term) :- portray(Term). % portray should be user defined
-
- append([],L,L). % common append procedure
- append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).
-
- member(X, [X|_]). % common member procedure
- member(X, [_|Y]) :- member(X, Y).
-
- % toplevel interpreter loop
- % the main goal should not be changed
-
- main :- $loop(toplevel). % start things
- main. % just to make Xprolog happy
-
- % this is a failure driven loop
-
- $loop(toplevel) :-
- prompt(Old, '| '), % change the default prompt
- repeat, % loop forever
- $prompt('?- '), % give a prompt
- read(Term), % wait for response
- $solve(Term, toplevel), % solve the query
- prompt(_, Old), % restore the prompt
- !.
- $loop(Where) :- % loop not at top level
- prompt(Old, '| '), % different default prompt
- repeat, % round and round again
- prompt_if_user, % no prompt for files
- read(Term), % read something
- $solve(Term, Where), % solve it
- prompt(_, Old), % restore the prompt
- !.
-
- prompt_if_user :- seeing(user), $prompt('| '), !.
- prompt_if_user.
-
- $solve(end_of_file, _) :- !. % the only way to stop the repeat
- $solve(Term, _) :- var(Term), !, fail. % don't accept strange goals
- $solve(Term, Where) :- % try to solve it as a goal
- $query(Term, Where, Goal, What), % check for sort of question
- !,
- prompt(Old, '|: '),
- $solve_goal(Goal, What), % try to solve a goal
- prompt(_, Old),
- fail.
- $solve(Term, Where) :- % try to assert it
- $process(Term, Result), % hook for preprocessors
- assertz(Result), % assert it
- !,
- fail.
- $solve(Term, _) :- % assert or $process failed
- write('! clause: '),
- write(Term),
- fail.
-
- % this is a hook to add preprocessors like the grammar rule translator
- % to this top level interpreter.
- % simply add via 'asserta' another clause for the preprocessor
-
- $process(T,T).
-
- % check the current term for a question or a command
-
- $query(:-(X), _, X, command) :- !. % this is a command
- $query(?-(X), _, X, question) :- !. % this is a question
- $query(X, toplevel, X, question). % always questions on top level
-
- % this procedure solves goals
- % note the use of $more and $goalvars
-
- $solve_goal(Term, command) :- % no answer, no alternatives
- call(Term), % try it once
- !. % and no further alternatives
- $solve_goal(_, command) :- % above clause failed
- !,
- nl, write('?'), nl. % notify the user
- $solve_goal(Term, question) :-
- $goalvars(List), % save the reader's symbol table
- call(Term), % try the question
- $more(Ok), % call(Term) had a alternative ?
- $reply(List, Ok), % say 'yes' to the user
- nl,
- !.
- $solve_goal(_, question) :- % above clause failed !
- nl,
- write(no), % sorry but ...
- nl,
- !.
-
- $reply(List, Ok) :- % say yes and show variables
- $show_variables(List),
- write(yes), % horray
- Ok = yes, % an alternative ?
- $askformore, % check if the user wants it
- !.
- $reply(_, Ok) :- % no more alternative
- Ok = no,
- !.
-
- $askformore :- get(X), skip(10), X \== 59. % 59 is ';'
-
- $show_variables([]) :- !.
- $show_variables([(Name, Variable)|L]) :-
- write(Name),
- write(' = '),
- write(Variable),
- nl,
- !,
- $show_variables(L).
-
-
-
- % consult and friends
- % we simply use the top level interpreter for the asserts and queries
-
- [X|Y] :- $process_files([X|Y]).
-
- $process_files([]) :- !.
- $process_files([-File|Rest]) :- !, reconsult(File), $process_files(Rest).
- $process_files([File|Rest]) :- !, consult(File), $process_files(Rest).
-
- consult(File) :- !, $read_file(File, 0).
-
- reconsult(File) :- !, $read_file(File, 1).
-
- $read_file(File, R) :-
- Heap is heapused,
- Time is cputime,
- $reconsulting(R),
- $test_filename(File), % check the file
- seeing(OldIn),
- telling(OldOut),
- see(File), % open the file
- $do_loop,
- seen, % close the file
- see(OldIn),
- tell(OldOut),
- $reconsulting(0),
- DiffTime is cputime - Time,
- DiffHeap is heapused - Heap,
- write(File),
- ( R == 0 , write(' consulted ') ;
- R == 1 , write(' reconsulted ')),
- write(DiffHeap), write(' bytes '),
- write(DiffTime), write(' msec.'),
- nl, !.
-
- $do_loop :- $loop(filelevel). % loop at filelevel
- $do_loop.
-
- $test_filename(user) :- !. % this stream is always ok
- $test_filename(File) :-
- not atom(File), % invalid name
- nl,
- write('Invalid filename: '),
- write(File),
- nl,
- !, fail.
- $test_filename(File) :-
- not exists(File), % file not found
- nl,
- write('The file '),
- write(File),
- write(' does not exist.'),
- nl,
- !, fail.
- $test_filename(_). % is ok
-
- %
- % debugging hooks
- %
-
- leash(off) :- $leash(0).
- leash(loose) :- $leash(1).
- leash(half) :- $leash(5).
- leash(tight) :- $leash(7).
- leash(full) :- $leash(15).
-
-