diff tp.pl @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tp.pl	Thu Aug 30 14:57:44 2007 +0900
@@ -0,0 +1,282 @@
+/*
+ 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 preprosessor
+					Thu Aug 22 15:52:08 JST 1985
+					Wed Sep  4 16:07:39 JST 1985
+					$Header$
+
+	use 'r_prepr' record to generate new predicate
+
+*/
+
+read_macro( (A '$clause' B) ) :- !,recordz('r_prepr',(A,B),_).
+read_macro( A ) :- recordz('r_prepr',(A,true),_).
+
+read_function( (A '$clause' B ) ) :- !,recordz('r_func',(A,B),_).
+read_function( A ) :- recordz('r_func',(A,true),_).
+
+reset_macro :- recorda('r_tmp',0,_),fail.
+reset_macro :- recorded('r_prepr', X, R), check_init(X),
+    erase(R), fail.
+reset_macro :- recorded('r_func', X, R), check_init(X),
+    erase(R), fail.
+reset_macro.
+
+check_init(('r_initr_',true)) :- !,recorded('r_tmp',_,Ref),erase(Ref),fail.
+check_init(_) :- recorded('r_tmp',_,_),!,fail.
+check_init(_).
+
+
+preprocess((X,Y),(XX,YY)) :- !,preprocess(X,XX),preprocess(Y,YY).
+% preprosess(( :- X),( :- X) ) :- !.
+preprocess((H :- B), OUT) :- !,
+    functor(H,HH,NN),
+    (recorded('$mnum',(HH,NN,N),R),erase(R) ; N = 0),!,
+    functor(H1,HH,NN),
+    develop_args(0, NN, N, N1, H, H, H1, OUT1, (H1 :- B0),B0,BB),
+    develop(B, BB, H, N1, N2, OUT, OUT1),
+    recordz('$mnum',(HH,NN,N2),_).
+preprocess(H,H1) :- preprocess((H :- true),H1).
+
+/*
+	develop(Original, Head, Base, NextBase, Qhead, Qtail).
+
+*/
+
+
+develop(A,'tokio_call'(A),_H,N,N,Q,Q) :- var(A),!.
+develop((A,B),(AA,BB),H,N,N1,Q,Q1) :- !,
+    develop(A,AA,H,N,N2,Q,Q2),
+    develop(B,BB,H,N2,N1,Q2,Q1).
+develop(@(A),@(AA),H,N,N1,Q,Q1) :- !,
+    develop(A,AA,H,N,N1,Q,Q1).
+develop(next(A),next(AA),H,N,N1,Q,Q1) :- !,
+    develop(A,AA,H,N,N1,Q,Q1).
+develop(ifEmpty(A),ifEmpty(AA),H,N,N1,Q,Q1) :- !,
+    develop(A,AA,H,N,N1,Q,Q1).
+develop(ifNotEmpty(A),ifNotEmpty(AA),H,N,N1,Q,Q1) :- !,
+    develop(A,AA,H,N,N1,Q,Q1).
+develop((A & B),'$chop'(AA,BBB),H,N,N1,Q3,Q1) :- !,
+    copyv(A,Acopy,V,Vcopy),(
+	V = [],
+	develop(A,AA,H,N,N2,Q,Q2),!
+	;
+	length(V,VN),VN>8,!,
+	develop(( 'r_eq'(V,Vcopy),Acopy ) ,AA,H,N,N2,Q,Q2)
+        ;
+	V=[V1],Vcopy=[Vc1],!,
+	develop(( 'r_eq'(V1,Vc1),Acopy ) ,AA,H,N,N2,Q,Q2)
+        ;
+	V=[V1,V2],Vcopy=[Vc1,Vc2],!,
+	develop(( 'r_eq'(V1,Vc1),'r_eq'(V2,Vc2),Acopy ) ,AA,H,N,N2,Q,Q2)
+        ;
+	V=[V1,V2,V3],Vcopy=[Vc1,Vc2,Vc3],!,
+	develop(( 'r_eq'(V1,Vc1),'r_eq'(V2,Vc2),'r_eq'(V3,Vc3),
+	          Acopy ) ,AA,H,N,N2,Q,Q2)
+	;
+	develop(( #(V=Vcopy),Acopy ) ,AA,H,N,N2,Q,Q2)),!,
+    develop(B,BB,H,N2,N3,Q2,Q1),!,
+    (	var(BB), !, Q3 = Q, BBB = B, N1 = N3
+    ;	get_variable(BB,Vlist,[],_,0,_Vcount),
+    	new_head(H,BBB,N3,Vlist),       % necessary to reduce variable copy..
+	N1 is N3+1,
+	Q3 = ((BBB :- BB),Q)),!.
+% single time funcitons
+develop(A:=B, true, _Root, M, M, Q, Q) :- 
+	(A \= *('$CNT'(_)),A \= *(_); var(A)) ,!,
+	c_error((write('assign to non static:'),write(A:=B),nl)).
+% <= use current value for addressing
+develop(A<==B, true, _Root, M, M, Q, Q) :- 
+	(A \= *_,A \= [_|_]; var(A)) ,!,
+	c_error((write('assign to non static:'),write(A<==B),nl)).
+develop(*A<==B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C, C2),
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C2, 
+	('$CNT'(YY)=AA,'$CNT'(VV)=BB, 'r_assign'('$CNT'(YY),'$CNT'(VV)))).
+% develop(*A<=B, C, Root, M, M1, Q, Q1) :- atomic(A),!,
+%    d_function(B, BB, M,M1, Root, Q,Q1, C, 'r_assign'(A,'$CNT'(BB))).
+develop(*('$CNT'(A)):=B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C2, *('$CNT'(AA)):=BB),!,
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C,  C2).
+develop(*A:=B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C2, *AA:=BB),!,
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C,  C2).
+develop(A=B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C2, AA=BB),!,
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C,  C2).
+develop(A<B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C2, AA<BB),!,
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C,  C2).
+develop(A>B, C, Root, M, M1, Q, Q1) :- !,
+    d_function(A, AA, M, M2, Root, Q, Q2, C2, AA>BB),!,
+    d_function(B, BB, M2,M1, Root, Q2,Q1, C,  C2).
+% full time functions
+develop(A,AAA,Root,N,N1,Q,Q1) :- 
+    recorded('r_prepr', ((A :- AA),Body),_),!,
+    develop_macro(Body,A,AA,AAA,Root,N,N1,Q,Q1).
+develop(A, C, Root, M, M1, Q, Q1) :- functor(A,H,N),functor(AA,H,N),
+    develop_args(0, N, M, M1, Root, A, AA, Q, Q1, C, AA).
+
+develop_args(N , N, M, M , _Root, _A, _AA, Q, Q,  C, C) :- !.
+develop_args(N1, N, M, M1, Root, A, AA, Q, Q1, C, C1) :-
+    N2 is N1+1, arg(N2,A,B), arg(N2,AA,BB),
+    d_function(B, BB, M, M2, Root, Q, Q2, C, C2),!,   %%% check full time here?
+    develop_args(N2, N, M2, M1, Root, A, AA, Q2, Q1, C2, C1).
+
+develop_macro(true,_A,AA,AAA,Root,N,N1,Q,Q1) :- !,
+    develop(AA,AAA,Root,N,N1,Q,Q1).
+develop_macro(Body,A,AA,AAA,Root,N,N1,Q,Q2) :- 
+    get_variable(A,Vlist,[],_,0,_Vcount),
+    macro(Body, Root, N, N2, Vlist, Q, Q1),
+    develop(AA,AAA,Root,N2,N1,Q1,Q2),!.
+
+/* make original head
+
+	Root head
+	New head
+	uniq Id
+	variable list
+*/
+
+new_head(Root,New,No,Vlist) :- 
+    new_head(Root,New,No,Vlist,_,T,T).
+
+new_head(Root,New,No,Vlist,large,T,T1) :- 
+    length(Vlist,N),N>10,!,
+    [A,B,C|T] = Vlist,
+    functor(Root,HH,Arity),
+    name(HH,HL),name(No,NL),name(Arity,NAL),
+    concatenate(["r_",NL,HL,NAL],NewL),
+    name(NewH,NewL),
+    New =.. [NewH,A,B,C,T1].
+new_head(Root,New,No,Vlist,small,_,_) :- functor(Root,HH,A),
+    name(HH,HL),name(No,NL),name(A,NAL),
+    concatenate(["r_",NL,HL,NAL],NewL),
+    name(NewH,NewL),
+    New =.. [NewH|Vlist].
+
+/* make variable list */
+
+get_variable(H,V,V1,VL,N,N1) :- 
+    var(H),!,
+    not_vmember(H,V,V1,VL,N,N1).
+get_variable(H,V,V1,VL,N,N1) :- 
+    H = '$CNT'(_),!,			% inherit constant
+    not_vmember(H,V,V1,VL,N,N1).
+get_variable(F,V,V1,VL,N,N1) :-
+    functor(F,_,A),
+    get_variable_arg(0,A,F,V, V1, VL, N,N1).
+
+get_variable_arg(A,A,_F,V,V,_VL, N,N) :- !.
+get_variable_arg(A,A1,F,V,V1,VL,N,N1) :-
+    A2 is A+1, arg(A2, F, Arg),
+    get_variable(Arg,V,V2,VL,N, N2),
+    get_variable_arg(A2,A1,F,V2,V1,VL,N2,N1).
+
+not_vmember(H,[H|T],T,VL,N,N1) :- var(VL),!,VL = [H|_],N1 is N+1.
+not_vmember(H, T,T,[H1|_VL],N,N) :- H == H1,!.
+not_vmember(H, T,T,[H1|_VL],N,N) :- H == '$CNT'(H1),!.
+not_vmember(H, T, T1,[_|VL], N, N1) :- not_vmember(H,T,T1,VL,N,N1).
+
+/* copyv
+	make copy with new variables
+	  and its old variable list and new variable list 
+
+	copyv(Old, New, OldVariable, NewVariable)
+
+	a little dum algorithm
+*/
+
+copyv(O,N,OV,NV) :- 
+    get_variable(O,OV,[],_,0,_Vcount),!,
+    copy((O,OV),(N,NV)).   
+
+/*
+	macro
+
+*/
+
+
+macro((A '$clause' B), Root, N, N1, Vs, Q, Q2) :- !,
+    single_macro(A, Root, N, N2, Vs, Q, Q1),
+    macro(B, Root, N2, N1, Vs, Q1, Q2).
+macro(A, Root, N, N1, Vs, Q, Q1) :-
+    single_macro(A, Root, N, N1, Vs, Q, Q1).
+    
+
+single_macro(A , Root, N, N1, Vlist, (A,Q), Q) :- var(A),!,
+    new_head(Root,A,N,Vlist),
+    N1 is N+1.
+single_macro((A :- B), Root, N, N2, Vlist, Q, Q2) :- !,
+    head_optimize(BB,A,Root,Vlist,N,N1,Q,Q1),!,
+    develop(B,BB,Root,N1,N2,Q1,Q2),!.
+single_macro(A, _Root, N, N, _Vlist, (A,Q), Q).
+
+head_optimize(BB,A,Root,Vlist,N,N2,((A:-BB),Q),Q) :-
+    var(A), 
+    !,
+    new_head(Root,A,N,Vlist),
+    N2 is N+1.
+head_optimize(BB,A,_Root,_Vlist,N,N,((A:-BB),Q),Q).
+
+/*
+	functions	
+		should be seprated full time function and
+			now only function
+*/
+
+d_function(A,AA,N,N,_Root,Q,Q,C,C) :- var(A),!, A = AA. % not interval constant
+d_function(A,R1,N,N1,Root,Q,Q1,(AAA,C1),C) :- 	       % not interval constant
+    recorded('r_func', ((A = R :-  AA),Body) ,_),!,
+    d_function(R,R1,N,N2,Root,Q2,Q1,C1,C),
+    d_f_dev(Body,A,AA,AAA,Root,N2,N1,Q,Q2).
+d_function(cputime, '$CNT'(Value), N,N,_R,Q, Q, ('r_cputime'(Value),C),C) :- !.
+d_function(A,AA,N,N,_Root,Q,Q,C,C) :- atomic(A),!, A = AA.
+d_function(@A,@AA,N,N2,Root,Q,Q1,Next,C) :- !, % not interval constant
+    d_function(A,AA,N,N2,Root,Q,Q1,CN,true),
+    d_next_check(CN,Next,C).
+d_function(*Name,'$CNT'(V),N,N2,Root,Q,Q1,C,C1) :- !,  % not interval constant
+    d_function(Name,Name1,N,N2,Root,Q,Q1,C,('r_read_value'(Name1,'$CNT'(V)),C1)).
+d_function(binary(B), Value, N,N,_R,Q, Q, C,C) :- !,
+    c_binary(B,Value),!.
+d_function(hex(H), Value, N,N,_R,Q, Q, C,C) :- !,
+    c_hex(H,Value),!.
+d_function(Exp, '$CNT'(Value), N,N1,R,Q, Q1, C,C1) :-  % not interval constant
+    n_function(Exp,A,B,Exp1,AA,BB),!,
+    d_function_exp(A, AA, N,N2,R,Q, Q2,C, C2),
+    d_function_exp(B, BB, N2,N1,R,Q2,Q1,C2,('$CNT'(Value) is Exp1,C1)).
+d_function(A,AA,N,N1,Root,Q,Q1,C,C1) :- functor(A,H,M),functor(AA,H,M),
+    d_function_args(0,M,A,AA,N,N1,Root,Q,Q1,C,C1),!.
+
+d_next_check(true,C,C):-!.
+d_next_check(CN,(next(CN),C),C):-!.
+
+d_function_args(M,M,_A,_AA,N,N,_Root,Q,Q,C,C) :- !.
+d_function_args(M1,M,A,AA,N,N1,Root,Q,Q1,C,C1) :-
+    M2 is M1+1, arg(M2,A,B), arg(M2,AA,BB),
+    d_function(B,BB,N,N2,Root,Q,Q2,C,C2),!,
+    d_function_args(M2,M,A,AA,N2,N1,Root,Q2,Q1,C2,C1),!.
+
+d_function_exp(Exp, Exp1, N,N1,R,Q, Q1, C,C1) :- nonvar(Exp),
+    n_function(Exp,A,B,Exp1,AA,BB),!,
+    d_function_exp(A, AA, N,N2,R,Q,  Q2, C,C2),
+    d_function_exp(B, BB, N2,N1,R,Q2, Q1, C2,C1).
+d_function_exp(Exp, Exp1, N,N1,R,Q, Q1, C,C1) :- 
+    d_function(Exp, Exp1, N,N1,R,Q, Q1, C,C1).
+
+d_f_dev(true,_A,AA,AAA,Root,N,N1,Q,Q1) :-!,
+    develop(AA, AAA, Root, N, N1, Q, Q1).
+d_f_dev(Body,A,AA,AAA,Root,N,N1,Q,Q1) :-
+    get_variable(A,Vs,[],_,0,_Vcount),!,
+    develop(AA, AAA, Root, N, N2, Q, Q2),!,
+    macro(Body, Root, N2, N1, Vs, Q2, Q1),!.
+
+/* */