diff tr.pl @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children 61743469ee56
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tr.pl	Thu Aug 30 14:57:44 2007 +0900
@@ -0,0 +1,325 @@
+/*
+ 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 to prolog compiler
+		Runtime routine
+		with register list
+
+ 					Mon Aug  5 09:01:29 JST 1985
+	fix put_queue			Fri Jan 24 11:47:11 JST 1986
+	add tracer			Sun Jun 22 12:47:21 JST 1986
+	fix empty/notempty		Wed Mar  9 09:24:47 JST 1988
+        reducing compile time   	Fri Oct 14 03:27:08 JST 1988
+	add mcom and fix chop		Sat Aug  5 22:25:15 JST 1989
+        meta call supported             Sun Aug  6 00:55:42 JST 1989
+	$Header$
+*/
+
+:-dynamic(r_fififi/1).
+:-dynamic(r_skip/1).
+
+r_header :-
+ write('
+ Tokio to prolog compiler $Revision$ $Date$
+           try ?- tokio_help.
+  ').
+
+user_help :- tokio_help.
+tokio_help :-
+    nl, r_header,nl,
+write('   com(File).       : compile & compile program.    '),nl,
+write('   com(File,Output).: compile & counsult & save file.    '),nl,
+write('   pcom(File,Predicate-heads).       : compile specified predicates.    '),nl,
+write('   pcom(File,Predicate-heads,Output).: compile specified predicates.    '),nl,
+write('   mcom(File).       : preprocess '),nl,
+write('   mcom(File,Output).: preprocess & outputfile.'),nl,
+write('   restart(File).   : run tokio save file.    '),nl,
+write('   tokiodebug.      : All computation will be traced.    '),nl,
+write('   tokionodebug.    : Debug mode is switched off.    '),nl,
+write('   tokiodebugging.  : Display some informations about tracing.    '),nl,
+write('   notimebacktrack. : no time backtrack.. '),nl,
+write('   timebacktrack.   : time backtrack.. '),nl,
+write('   tokio.           : start tokio top-level. '),nl,
+write('   tokio predicate.   : run tokio program. '),nl,
+write('   reset_macro.     : Reset Macro Definition. com predicates also reset Macros.'),nl.
+% write('   tokiospy         : All predicate will be traced.   '),nl,
+% write('   tokiospy(F/N)    : Predicate F which have N arity will be traced.'),nl,
+% write('   tokionospy       : All spy point are removed.    '),nl,
+% write('   tokionospy(F/N)  : Spy point F/N will be removed.    '),nl,
+% write('   tokiodebugat(T)  : Tracing will be start at time=Time.    '),nl,
+% write('   tokionodebugat   : Start point of tracing is removed.    '),nl,
+
+r_tokio0(Goals) :-
+    cputime(Time),
+    r_do_solve(Goals, C),
+    cputime(Time1),
+    T is (Time1-Time),				% sec
+    r_tokiostats(C, T).
+r_tokio0(_Goals) :- nl, write('--fail--'), nl.
+
+r_do_solve(Goals,C) :-
+    r_put_queue(Goals, X, true, Q, Q1),
+    r_notEmpty(Q),
+  ( recorded(tokiodebug, on, _), !,
+	r_solve_t(X,C,0,Q,Q1);
+    recorded(timebacktrack, off, _), !,
+	r_solve_d(X,C,0,Q,Q1);
+    r_solve(X,C,0,Q,Q1)).
+
+notimebacktrack :- recorded(timebacktrack,_,Ref),erase(Ref),fail.
+notimebacktrack :- recorda(timebacktrack,off,_Ref).
+timebacktrack :- recorded(timebacktrack,_,Ref),erase(Ref),fail.
+timebacktrack :- recorda(timebacktrack,on,_Ref).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Quick and Easy Compile
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+r_put_queue(X, Y, Y, Q, Q) :- var(X),!,
+	write('cannot call variable:'),write(X),nl.
+r_put_queue(X, (unifyNow(X,Xn),Xn,Y), Y, Q, Q) :- systemp(X),!.
+% Tokio's varible is local, so, meta call is also local to 
+% its value. But I don't care about its arguments.
+r_put_queue('$t'(Now,_Next),Z, Z1,Q, Q1) :- !,
+	r_put_queue(Now, Z, Z1,Q, Q1).
+r_put_queue((X,Y), Z, Z1, Q, Q1) :- !,
+    r_put_queue(X,Z, Z2, Q,Q2),
+    r_put_queue(Y,Z2,Z1,Q2,Q1).
+r_put_queue(#P, (r_always(P,Q,Q1),Y), Y, Q, Q1) :- !.
+r_put_queue(next(P), (r_next(P,Q,Q1),Y), Y, Q, Q1) :- !.
+r_put_queue(length(N), (r_length(M,Q),Y), Y, Q, Q) :- !,	% restricted length
+    M is N.
+r_put_queue(P, (P1,Y), Y, Q, Q1) :-
+    functor(P, H, N), N2 is N+2, N1 is N+1,
+    functor(P1, H, N2), arg(N1, P1, Q), arg(N2, P1, Q1),
+    r_put_queue_arg(N,P,P1).
+
+r_put_queue_arg(0,_,_) :- !.
+r_put_queue_arg(M,F,F1) :-
+    arg(M,F,FA),arg(M,F1,FA),M1 is M-1,
+    r_put_queue_arg(M1,F,F1).
+
+r_tokiostats(L, T) :-  nl,
+        write(L), write(' clock and '),
+	write(T), write(' sec. '), nl.
+
+r_always(X,['$t'((r_always(Xn,Q,Q2),N),F,E,C)|Q],Q1) :- 
+	unifyNowNext(X,Xx,Xn),
+	'tokio_call'(Xx,['$t'(N,F,E,C)|Q2],Q1).
+r_next(X,['$t'(N,F,E,C)|Q],                  % same as next(tokio_call(X))
+	['$t'(N1,F,E,C)|Q1]) :- unifyNext(X,Xn),
+	r_put_queue(Xn,N,N1,Q,Q1).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Tokio Temporal Resolution
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+r_solve(r_end,_Fin,_Now,_X,_Y) :- !.
+r_solve(X,Fin,Now,['$t'(Next,F,K,'$'(Fin,Now,Empty))|Futures],
+		['$t'(true,true,true,'$'(Fin,Now,Empty))|True]) :-
+	NextTime is Now+1,
+	nl,write('t'),write(Now),write(':'),ttyflush,
+	call(X),
+	r_exec_fin_keep(Empty,Fin,Now,F,K,Next,Next1),
+	r_solve(Next1, Fin, NextTime, Futures, True).
+r_solve(_,_,Now,_,_) :- B is Now-1, B>0, nl,write(b),write(B),write(':'),
+	ttyflush,!,fail.
+
+r_solve_t(r_end,_Fin,_Now,_X,_Y) :- !.
+r_solve_t(X,Fin,Now,['$t'(Next,F,K,'$'(Fin,Now,Empty))|Futures],
+		['$t'(true,true,true,'$'(Fin,Now,Empty))|True]) :-
+	r_tokioDebug(t(Empty,X,Fin,Now,F,K,Next,Futures,True),Now),
+	NextTime is Now+1,
+	nl,write('t'),write(Now),write(':'),ttyflush,
+	call(X),
+	r_exec_fin_keep(Empty,Fin,Now,F,K,Next,Next1),
+	r_solve_t(Next1, Fin, NextTime, Futures, True).
+r_solve_t(_,_,Now,_,_) :- B is Now-1, B>0, nl,write(b),write(B),write(':'),
+	ttyflush,!,fail.
+
+r_solve_d(r_end,_Fin,_Now,_X,_Y) :- !.
+r_solve_d(X,Fin,Now,['$t'(Next,F,K,'$'(Fin,Now,Empty))|Futures],
+		['$t'(true,true,true,'$'(Fin,Now,Empty))|True]) :-!,
+	NextTime is Now+1, call(X),
+	r_exec_fin_keep(Empty,Fin,Now,F,K,Next,Next1),
+	r_solve_d(Next1, Fin, NextTime, Futures, True).
+
+r_exec_fin_keep(empty,	Fin, Fin, F, _, _, r_end) :- !,	% end at this time
+	call(F).
+r_exec_fin_keep(notEmpty,	Now, Fin, _, K, Next, Next) :-
+	Now \== Fin,
+	call(K).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Chop Operator Runtime
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+r_subBegin(['$t'(_,_,_,'$'(_,Now,_))|Q],		% original interval
+	['$t'((r_subBegin(Q,SQ,SQ1,Fin),N),F,K,'$'(Fin,Now,E))|SQ],
+	['$t'(N,F,K,'$'(Fin,Now,E))|SQ1],Fin).	% subinterval's Fin
+
+r_subFin( ['$t'(_, F   , _, '$'(Fin,Fin,empty))  | _  ],	% outer fin?
+	['$t'(_, true, _, '$'(Fin,Fin,empty))  | _  ]) :-
+	call(F).
+
+r_subNotFin( LaterLoop, '$'(Q,Q1,QF,QF1),
+	['$t'(N,  F,  K,  '$'(OuterFin,Now,notEmpty)) | Q   ],
+	['$t'(N1, F1, K1, '$'(OuterFin,Now,notEmpty)) | Q1  ],
+	['$t'(N,  F,  K,  '$'(Fin,Now,Empty)) | QF ],
+	['$t'((LaterLoop,N1), F1, K1, '$'(Fin,Now,Empty)) | QF1  ]) :-
+	r_sub_check(OuterFin,Now,Fin).
+
+r_sub_check(OuterFin,Now,Fin) :- var(OuterFin),!,
+	r_sub_check2(Fin,Now).
+r_sub_check(OuterFin,Now,Fin) :- 
+	OuterFin > Now,r_sub_check3(OuterFin,Now,Fin). %%%% Fin > Now, OuterFin > Now
+r_sub_check2(Fin,_Now) :- var(Fin),!.                  %%%% freeze(Fin,Fin>Now).
+r_sub_check2(Fin,Now) :- Fin>Now.
+r_sub_check3(_OuterFin,_Now,Fin) :- var(Fin),!.       %%%% freeze(Fin,(N<F,F<O))
+r_sub_check3(OuterFin,Now,Fin) :- Now<Fin,Fin<OuterFin.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%
+% meta call ( same restriction as top level )
+%%%%%%%%%%%%%%%%%%%%%%%%%
+tokio_call(A,Q,Q) :- var(A),!,
+	write('uninstantiated meta call'),nl.
+tokio_call(A,Q,Q1) :-
+	r_put_queue(A, X, true, Q, Q1),
+	call(X).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%
+% Tokio System Call
+%%%%%%%%%%%%%%%%%%%%%%%%%
+%  Thanks for Prof. Esterline and Dr. Kilis
+r_empty(['$t'(_,_,_,'$'(F,F,empty))|_]).
+r_notEmpty(['$t'(_,_,_,'$'(F,N,notEmpty))|_]):- F\==N.
+
+r_length( 0, ['$t'(_,_,_,'$'(Fin,Fin,empty))|_] ) :-!.
+r_length( L, ['$t'(_,_,_,'$'(Fin,Now,notEmpty))|_] ) :-
+	Fin is Now+L.
+
+r_cputime(X) :- statistics(runtime,[X1,_]),X is X1/1000.
+r_cputime(X,Q,Q) :- r_cputime(X).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Static Variable Runtime
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+r_set_value(Name,Value) :- var(Value),!,
+	write('Assign non fixed value = '),
+	write(Name),nl.
+r_set_value(Name,Value) :-
+%%%%%%%	r_check(Name,Time),
+	recorded(Name,(Name,V,_Time),_),!,V=Value.
+r_set_value(Name,Value) :-
+%%%%%%%	r_check(Name,Time),
+	recorda(Name,(Name,Value,_Time),_).
+r_set_value(Name,Value) :-
+	recorded(Name,(Name,Value,_),Ref),
+	erase(Ref),!,fail.
+
+r_set_value(Name,Value,_Time) :- var(Value),!,
+	write('Assign non fixed value = '),
+	write(Name),nl.
+r_set_value(Name,Value,Time) :-
+	recorded(Name,(Name,V,Time),_),!,V=Value.
+r_set_value(Name,Value,Time) :-
+	recorda(Name,(Name,Value,Time),_).
+r_set_value(Name,Value,Time) :-
+	recorded(Name,(Name,Value,Time),Ref),
+	erase(Ref),!,fail.
+
+% Special Cases
+
+% #(A=B)
+%    variable vs varible
+%    variable vs time constance
+% *i <= ??
+
+r_eq(A,B,['$t'((r_eq(C,D,E,F),G),H,I,J)|E],['$t'(G,H,I,J)|F]) :- 
+	unifyNowNext(A,K,C),unifyNowNext(B,K,D).
+r_eqn(A,B,['$t'((r_eqn(C,B,D,E),F),G,H,I)|D],['$t'(F,G,H,I)|E]) :- 
+	unifyNowNext(A,B,C).
+r_assign(Static,A,['$t'((r_assign(Static,A,B,C),D),(r_set_value(Static,A,Time),E),F,G)|B],
+	['$t'(D,E,F,G)|C]):- G='$'(_Fin,Time,_Empty).
+
+
+
+% r_check(Name,Time) :- 
+% 	recorded(time,Time,_),
+%	(	recorded(Name,(Name,Value1,Time),_),
+%		report_conflict(Name,Name,Time)
+%	;	true),
+%	(	recorded(r_write,(Name,Bus),_),(
+%		    recorded(Bus,(Name2,Time),_),
+%		    report_conflict(Name,Name2,Time)
+%	    	;   recorda(Bus,(Name,Time),_))
+%	; true),!.
+
+r_read_value(Name,Value) :- recorded(Name,(Name,Value1,_),_),!,
+%	recorded(time,Time,_),
+%	recorda(Name,(Name,Value1,Time),_),
+%	(	recorded(r_read,(Name,Bus),_),(
+%		    recorded(Bus,(Name2,Time),_),Name2 \= Name,
+%		    report_conflict(Name,Name2,Time)
+%		;   recorda(Bus,Name,_))
+%	;	true),!,
+	Value = Value1.
+r_read_value(Name,_Value) :- nl,
+	write('Reference Not assigned value -- '),
+	write(Name),nl.
+
+init_static :- recorded(r_static,Name,_),recorded(Name,_,Ref),
+	erase(Ref),fail.
+init_static :- abolish(r_skip,1),
+	assert(r_skip(-1)).
+
+reset_static :- recorded(r_static,Name,Iref),recorded(Name,_,Ref),
+	erase(Ref),erase(Iref),fail.
+
+static([]) :- !.
+static([H|T]) :- !,static(H),static(T).
+
+
+% static(Name=Bus) :- !,static(Name),static(Bus),
+% 	r_read_bus(Name,Bus),r_write_bus(Name,Bus).
+% static(Name=[RBus,WBus]) :- !,static(Name),static(Bus),
+% 	r_read_bus(Name,RBus),r_write_bus(Name,WBus).
+static(Name) :- functor(Name,_H,_),recorded(r_static,Name,_),!.
+static(Name) :- functor(Name,_H,_),recordz(r_static,Name,_).
+
+static_memory(L) :- static(L).
+static_register(L) :- static(L).
+
+r_read_bus(Name,Bus) :-
+	(recorded(r_read,(Name,Bus),_);recordz(r_read,(Name,Bus),_)).
+r_write_bus(Name,Bus) :-
+	(recorded(r_write,(Name,Bus),_);recordz(r_write,(Name,Bus),_)).
+
+/* :- static(time). */
+
+% r_report_conflict(Name,Name2,Time) :- nl,
+% 	write('Conflict *'),
+% 	write(Name),write(' and *'),
+% 	write(Name2),write(' at '),
+% 	write(Time).
+
+% A \= A :-!,fail.
+% _ \= _.
+
+append([],X,X).
+append([H|X],Y,[H|Z]) :- append(X,Y,Z).
+
+member(H,[H|_]) :-!.
+member(H,[_|T]) :- member(H,T).
+
+/* for ttyflush  */
+
+/* :- (ttyflush ; assert(ttyflush) ). */
+
+/* end of runtime */