view to.pl @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
line wrap: on
line source

/*
 Copyright (C) 1988,2005, Shinji Kono 
 Everyone is permitted to copy and distribute verbatim copies
 of this license, but changing it is not allowed.  You can also
 use this wording to make the terms for other programs.

 send your comments to kono@ie.u-ryukyu.ac.jp
*/

/*

	Tokio compiler to prolog
			Thu Aug 15 12:17:04 JST 1985
			Fri Jan 10 16:11:31 JST 1986
			Fri Sep  5 09:51:36 JST 1986 for 1.2a
			Thu Mar 26 16:19:10 JST 1987
			Wed Oct 14 13:35:54 JST 1987 full time F
			Fri Oct 16 11:28:26 JST 1987 Sicstus
			$Header$
	compiler main routine 
*/

com(X) :- reset_macro,tokiocompile(X). 
com(X,Y) :- reset_macro,tokiocompile(X, Y),
	(Y = user,!;reconsult(Y)). 
 
tokiocompile(S) :-
    tokiocompile(S, '#temp.tokio'),
%   reconsult('#temp.tokio'). 
    compile0('#temp.tokio'). 

tokiocompile(S, O) :- 
    cputime(Time),
    init_tokiocomp,
    tell(O), 
    tokiocomp(S, [], _L), told, 
    cputime(Time1),Time0 is Time1-Time, 
    c_error((write('END '), nl, write(Time0), write(' sec.'),nl)).
 
init_tokiocomp :- recorded('$uskel', _X, R), erase(R), fail.
init_tokiocomp :- recorded('$mnum', _X, R), erase(R), fail.
init_tokiocomp.

tokiocomp([], L, L) :- !. 
tokiocomp([H|T], L0, L) :- !, tokiocomp(H, L0, L1), tokiocomp(T, L1, L). 
tokiocomp(F, _L0, _L) :- 
    seeing(O), nofileerrors, tokiofile(F,F1),see(F1), !, 
    tokiocomp1('$$$$'), seen, see(O), !. 
tokiocomp(F, _, _) :- 
    fileerrors, 
    c_error((write('Cannot open file: '), write(F), nl)), !, fail. 
 
tokiofile(F,F).
tokiofile(F,F1) :- name(F,FL),concatenate([FL,".tokio"],NewL),name(F1,NewL).
tokiofile(F,F1) :- name(F,FL),concatenate([FL,".t"],NewL),name(F1,NewL).


/* tokiocomp1
	read loop (fail loop)
*/

tokiocomp1(X) :- tokiocomp2(X).
tokiocomp1(_) :-
    read(Next), !, tokiocomp1(Next). 
tokiocomp1(_) :- c_error((nl,write('read error'),nl)).

/* tokocomp2
	compiler directive 
	this predicate never success except file end.
*/

tokiocomp2(end_of_file) :- !. 
tokiocomp2('$$$$') :- !,fail. 
tokiocomp2('$define'(Macro)) :- 
     read_macro(Macro),!,fail.
tokiocomp2('$function'(Function)) :-
     read_function(Function),!,fail.
tokiocomp2((:- X)) :- 		
    call(X), write_clause((:- X)),!,fail.
tokiocomp2((?- X)) :- 		
    call(X), write_clause((:- X)),!,fail.
tokiocomp2(Head) :- compiling_message(Head),fail.
tokiocomp2(X) :- preprocess(X,X1),!,tokiocomp3(X1).

compiling_message((Head :- _Body)) :- !,compiling_message(Head).
compiling_message(Head) :- 
    (systemp(Head);Head = (_,_);Head = [_|_];functor(Head,'{}',_)),!,
    functor(Head,H,A),
    c_error((
    write('Compiling System Predicate: '), 
    write(H/A),nl)),!.
compiling_message(Head) :- 
    functor(Head,H,A),
    c_error((
    write('Compiling: '), 
    write(H/A),nl)),!,!.

/* tokiocomp3
	if end_of_file then success otherwise fail
*/

tokiocomp3((X,_Y)) :- tokiocomp3(X),fail.	% fail and fall into next line
tokiocomp3((_X,Y)) :- !,tokiocomp3(Y).
tokiocomp3(X) :- 
    c_clause(X, C), write_clause(C),!, fail. % to reduce stack
tokiocomp3(X) :- 
    c_error((nl,write('compiler error on '),write(X),nl)),fail.
 
% preprocess(X,X).			% no development

display_fa(F/A) :- display(F), display('/'), display(A), display(','). 
 
writel([]) :- !. 
writel([X|L]) :- writel(L), write(X), write(', '). 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   varialble type
%
%	'$REF'       full referenced variable
%	'$TMP'	   both now and next are referenced
%	'$NOW','$NXT'  either now or next is referenced
%	'$CNT'	   this variable is constnat in time transition
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

variable(X) :- var(X), !. 
variable('$REF'(_)) :- !. 
variable('$CNT'(_)) :- !. 
variable('$NOW'(_,_)) :- !.
variable('$NXT'(_,_)) :- !.
variable('$TMP'(_,_,_)).
 

% c_post(Vname, Vname, V0, V) :- 
%  	var(Vname),!, V is V0+1,name(V0,Lv),name(Vname,[95|Lv]).  %%% _001
c_post(Vname, Vname, V0, V) :- 
 	var(Vname),!, V is V0+1,Vname = '$VAR'(V0).		%%% _001
c_post('$VAR'(X), '$VAR'(X), V, V) :- !. 
c_post('$CNT'(X), XX, V0, V) :- !, c_post(X, XX, V0, V). 
c_post('$REF'(X), XX, V0, V) :- !, c_post(X, XX, V0, V). 
c_post('$TMP'(X,Now,Nxt), XX, V0, V) :- !, c_post_tvar(X,Now,Nxt, XX, V0, V).
c_post('$NOW'(X,Now), XX, V0, V) :- !, c_post_tvar(X,Now,_Nxt, XX, V0, V).
c_post('$NXT'(X,Nxt), XX, V0, V) :- !, c_post_tvar(X,_Now,Nxt, XX, V0, V).
c_post(Atomic,Qatomic,V,V) :- atomic(Atomic),!,
     c_post_atomic(Atomic,Qatomic).
c_post([A|B],[AA|BB], V0, V) :- !, 
	c_post(A,AA,V0,V1),c_post(B,BB,V1,V).
c_post((A,B),(AA,BB), V0, V) :- !, 
	c_post(A,AA,V0,V1),c_post(B,BB,V1,V).
% Special Hack.... ( nonvar for C-Prolog)
c_post('r_eq'(A,B,Q1,Q2), B1=A1, V0, V) :- nonvar(A),nonvar(B),
	functor(A,'$CNT',_),functor(B,'$CNT',_),!,
	c_post(A,A1,V0,V1),c_post(B,B1,V1,V2),
	c_post(Q1,Q11,V2,V3),c_post(Q2,Q12,V3,V),Q11=Q12.
c_post('r_eq'(A,B,Q1,Q2), 'r_eqn'(B1,A1,Q11,Q12), V0, V) :- nonvar(A),
	functor(A,'$CNT',_),!,
	c_post(A,A1,V0,V1),c_post(B,B1,V1,V2),
	c_post(Q1,Q11,V2,V3),c_post(Q2,Q12,V3,V).
c_post('r_eq'(A,B,Q1,Q2), 'r_eqn'(A1,B1,Q11,Q12), V0, V) :- nonvar(B),
	functor(B,'$CNT',_),!,
	c_post(A,A1,V0,V1),c_post(B,B1,V1,V2),
	c_post(Q1,Q11,V2,V3),c_post(Q2,Q12,V3,V).
c_post('r_eq'(A,B,Q1,Q2), 'r_eq'(A1,B1,Q11,Q12), V0, V) :- !,
	c_post(A,A1,V0,V1),c_post(B,B1,V1,V2),
	c_post(Q1,Q11,V2,V3),c_post(Q2,Q12,V3,V).
c_post(X, XX, V0, V) :- 
    functor(X, F, A), c_post_atomic(F,F1),!, functor(XX, F1, A), 
    c_post_args(0, A, X, XX, V0, V). 

c_post_atomic(X,X).
% c_post_atomic([],[]) :- !.
% c_post_atomic(Number,Number) :- number(Number),!.
% c_post_atomic(Atomic,Qatomic):-
%     name(Atomic,La),La=[H|_],[H]\="'",[H]\="_",!,
%     concatenate(["'",La,"'"],Nla),name(Qatomic,Nla).
% c_post_atomic(Atomic,Atomic).

c_post_args(N, N, _, _, V, V) :- !. 
c_post_args(K, N, X, XX, V0, V) :- 
    K1 is K+1, arg(K1, X, XK), c_post(XK, XXK, V0, V1), arg(K1, XX, XXK), 
    c_post_args(K1, N, X, XX, V1, V). 
 
c_post_tvar(X, Now, Nxt, '$t'(Now1,Nxt1), V0, V) :- var(X),!,
    X='$TMP'(_,Now,Nxt),
    c_post(Now, Now1, V0, V1),
    c_post(Nxt, Nxt1, V1, V).
c_post_tvar('$REF'(X), _Now, _Nxt, XX, V0, V) :- !,
    c_post(X, XX, V0, V).
c_post_tvar('$CNT'(X), _Now, _Nxt, XX, V0, V) :- !,
    c_post(X, XX, V0, V).
c_post_tvar('$TMP'(X,Now,Nxt), Now, Nxt, XX, V0, V) :- !,
    c_post_tvar(X, Now, Nxt, XX, V0, V).

write_clause(X) :- recorded('r_assert',_,_),assert_clause0(X).
write_clause(_) :- recorded('r_assert',_,_).
write_clause(X) :- write_clause0(X).
write_clause(_).

write_clause0((X:-true)) :- 
    c_post(X, XX, 0, _), 
    write_term(XX,[numbervars(true),quoted(true)]),
    % writeq(XX), 
    put("."), nl,!,fail. %%% writeq --> write
write_clause0(X) :- 
    c_post(X, XX, 0, _), writeq1(XX), put("."), nl,!,fail. %%% writeq --> write

% a little pretty print
writeq1((A,B)) :- !,writeq1(A),put("."), nl,
    writeq1(B).
writeq1((H:-B)) :- !,
    % writeq(H),
    write_term(H,[numbervars(true),quoted(true)]),
    write((:-)),
    writeq2(B).
writeq1(X) :- 
    % writeq(X).
    write_term(X,[numbervars(true),quoted(true)]).
writeq2((A,B)) :- !,nl,tab(4),
    % writeq(A),
    write_term(A,[numbervars(true),quoted(true)]),
    put(","),writeq2(B).
writeq2(X) :- nl,tab(4),
    write_term(X,[numbervars(true),quoted(true)]).
    % writeq(X).


assert_clause(X) :- assert_clause0(X).
assert_clause(_).

%assert_clause0((X:-true)) :- 
%    c_post(X, XX, 0, _), c_melt(XX,XXX,_),
%    recorda('r_run',XXX,Ref),assertz(XXX), !,fail. 
assert_clause0(X) :- 
    c_post(X, XX, 0, _), c_melt(XX,((XXX:-Y)),_),
    recorda('r_run',((XXX:-_)),_Ref),assertz((XXX:-Y)), !,fail. 

/* end  */