home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
X_PROLOG.LZH
/
X_PROLOG
/
SOURCES
/
_BOOT
next >
Wrap
Text File
|
1990-08-13
|
5KB
|
211 lines
/*
* ST PROLOG Vers. 2.0
*
*
* Written by : Andreas Toenne
* CS Dept. , IRB
* University of Dortmund, W-Germany
* <at@unido.uucp>
* <....!seismo!unido!at>
* <at@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.
*
*/
/* ST Prolog Startup File */
/* Structuring clauses */
call(A) :- $call(A). /* make cut local to call */
(A ; B) :- $call(A). /* ; is transparent to CUT */
(A ; B) :- $call(B).
(A , B) :- $call(A), $call(B).
/* Error handling */
error(Number, Where) :-
write('Error ! '),
describe_error(Number), nl, !,
write(Where), nl, fail.
describe_error(1) :- write('Clause not found'). /* ENOCLAUSE */
describe_error(2) :- write('IO Failure'). /* EIO */
describe_error(3) :- write('Read past EOF'). /* EEOF */
describe_error(4) :- write('Bad syntax'). /* ESYNTAX */
describe_error(5) :- write('Too many args/vars'). /* ETOOMANY */
describe_error(6) :- write('Bad arguments'). /* EBAD */
describe_error(7) :- write('No valid expression'). /* EEVAL */
describe_error(8). /* EINTER */
describe_error(_) :- write('Hehe. This is a funny one'). /* catch all */
/* Metalogical stuff */
not(Predicate) :- call(Predicate), !, fail.
not(Predicate).
clause(Head, Body) :- '$clause'(Head, Body, Help).
A = A. /* Simple equality */
print(Term) :- var(Term), !, write(Term).
print(Term) :- portray(Term). /* User defined */
append([],L,L). % common append rule
append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).
/* Toplevel interpreter (with a lot of help from c-prolog) */
main :- write('Welcome to X Prolog'), nl, $loop(0).
main.
$loop(0) :- /* toplevel loop */
prompt(Old, '| '),
repeat,
$prompt('?- '),
read(Term),
$interpret(Term, 0),
prompt(_, Old),
!.
$loop(Status) :-
prompt(Old, '| '),
repeat,
prompt_if_user,
read(Term),
$interpret(Term, Status),
prompt(_, Old),
!.
prompt_if_user :- seeing(user), $prompt('| ').
prompt_if_user.
$interpret(end_of_file, _) :- !.
$interpret(Term, Status) :-
$query(Term, Status, D, T),
!,
prompt(Old, '|: '),
$dogoal(T, D),
prompt(_, Old),
fail.
$interpret(Term, Status) :-
$process(Term, Result),
assertz(Result),
!,
fail.
$interpret(Term, _) :-
write('! clause: '),
write(Term),
fail.
$process(T,T).
$query(:-(X), _, X, command) :- !.
$query(?-(X), _, X, question) :- !.
$query(X, 0, X, question).
$dogoal(command, Term) :-
call(Term),
!.
$dogoal(command, _) :-
!,
nl, write('?'),
nl.
$dogoal(question, Term) :-
$goalvars(List),
call(Term),
$more(Ok),
reply(List, Ok),
nl,
!.
$dogoal(question, _) :-
nl,
write(no),
nl,
!.
reply(List,Ok) :-
$reply(List),
write(yes),
Ok = yes,
$askformore,
!.
reply(_,Ok) :-
Ok = no,
!.
$askformore :- get(X), skip(10), X \== 59.
$reply([]) :- !.
$reply([(Name,Term)|L]) :-
write(Name),
write(' = '),
write(Term),
nl,
!,
$reply(L).
/* Consult and friends */
[File|MoreToCome] :- digfilelist([File|MoreToCome]).
digfilelist([]) :- !.
digfilelist([-File|MoreToCome]) :- !, reconsult(File), digfilelist(MoreToCome).
digfilelist([File|MoreToCome]) :- !, consult(File), digfilelist(MoreToCome).
consult(File) :- !, '$consult'(consult, File).
reconsult(File) :- '$consult'(reconsult, File).
$consult(R, File) :-
S0 is heapused,
T0 is cputime,
( R == consult, X = 0, ! ; X = 1),
$reconsulting(X), % set lastconsult
$checkfile(File),
$read_file(File, R),
Tt is cputime - T0,
Ts is heapused - S0,
write(File), tab(2),
write(R), write('ed '),
write(Ts), write(' bytes '),
Sec is Tt / 1000,
Frac is Tt mod 1000,
write(Sec), display('.'), write(Frac), write(' sec.'), nl, !.
$consult(_,_).
$read_file(File, R) :-
seeing(I),
telling(O),
see(File),
$loop(R),
close(File),
see(I),
tell(O),
fail.
$read_file(_, _).
$checkfile(user) :- !.
$checkfile(File) :-
(atom(File);
nl, write('! Invalid file name: '), write(File), nl, fail
),
!,
(exists(File) ;
nl, write('! The file '), write(File),
write(' does not exist.'), nl, fail
),
!.