comparison tp.pl @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:cfb7c6b24319
1 /*
2 Copyright (C) 1988,2005, Shinji Kono
3 Everyone is permitted to copy and distribute verbatim copies
4 of this license, but changing it is not allowed. You can also
5 use this wording to make the terms for other programs.
6
7 send your comments to kono@ie.u-ryukyu.ac.jp
8 */
9
10 /*
11 Tokio preprosessor
12 Thu Aug 22 15:52:08 JST 1985
13 Wed Sep 4 16:07:39 JST 1985
14 $Header$
15
16 use 'r_prepr' record to generate new predicate
17
18 */
19
20 read_macro( (A '$clause' B) ) :- !,recordz('r_prepr',(A,B),_).
21 read_macro( A ) :- recordz('r_prepr',(A,true),_).
22
23 read_function( (A '$clause' B ) ) :- !,recordz('r_func',(A,B),_).
24 read_function( A ) :- recordz('r_func',(A,true),_).
25
26 reset_macro :- recorda('r_tmp',0,_),fail.
27 reset_macro :- recorded('r_prepr', X, R), check_init(X),
28 erase(R), fail.
29 reset_macro :- recorded('r_func', X, R), check_init(X),
30 erase(R), fail.
31 reset_macro.
32
33 check_init(('r_initr_',true)) :- !,recorded('r_tmp',_,Ref),erase(Ref),fail.
34 check_init(_) :- recorded('r_tmp',_,_),!,fail.
35 check_init(_).
36
37
38 preprocess((X,Y),(XX,YY)) :- !,preprocess(X,XX),preprocess(Y,YY).
39 % preprosess(( :- X),( :- X) ) :- !.
40 preprocess((H :- B), OUT) :- !,
41 functor(H,HH,NN),
42 (recorded('$mnum',(HH,NN,N),R),erase(R) ; N = 0),!,
43 functor(H1,HH,NN),
44 develop_args(0, NN, N, N1, H, H, H1, OUT1, (H1 :- B0),B0,BB),
45 develop(B, BB, H, N1, N2, OUT, OUT1),
46 recordz('$mnum',(HH,NN,N2),_).
47 preprocess(H,H1) :- preprocess((H :- true),H1).
48
49 /*
50 develop(Original, Head, Base, NextBase, Qhead, Qtail).
51
52 */
53
54
55 develop(A,'tokio_call'(A),_H,N,N,Q,Q) :- var(A),!.
56 develop((A,B),(AA,BB),H,N,N1,Q,Q1) :- !,
57 develop(A,AA,H,N,N2,Q,Q2),
58 develop(B,BB,H,N2,N1,Q2,Q1).
59 develop(@(A),@(AA),H,N,N1,Q,Q1) :- !,
60 develop(A,AA,H,N,N1,Q,Q1).
61 develop(next(A),next(AA),H,N,N1,Q,Q1) :- !,
62 develop(A,AA,H,N,N1,Q,Q1).
63 develop(ifEmpty(A),ifEmpty(AA),H,N,N1,Q,Q1) :- !,
64 develop(A,AA,H,N,N1,Q,Q1).
65 develop(ifNotEmpty(A),ifNotEmpty(AA),H,N,N1,Q,Q1) :- !,
66 develop(A,AA,H,N,N1,Q,Q1).
67 develop((A & B),'$chop'(AA,BBB),H,N,N1,Q3,Q1) :- !,
68 copyv(A,Acopy,V,Vcopy),(
69 V = [],
70 develop(A,AA,H,N,N2,Q,Q2),!
71 ;
72 length(V,VN),VN>8,!,
73 develop(( 'r_eq'(V,Vcopy),Acopy ) ,AA,H,N,N2,Q,Q2)
74 ;
75 V=[V1],Vcopy=[Vc1],!,
76 develop(( 'r_eq'(V1,Vc1),Acopy ) ,AA,H,N,N2,Q,Q2)
77 ;
78 V=[V1,V2],Vcopy=[Vc1,Vc2],!,
79 develop(( 'r_eq'(V1,Vc1),'r_eq'(V2,Vc2),Acopy ) ,AA,H,N,N2,Q,Q2)
80 ;
81 V=[V1,V2,V3],Vcopy=[Vc1,Vc2,Vc3],!,
82 develop(( 'r_eq'(V1,Vc1),'r_eq'(V2,Vc2),'r_eq'(V3,Vc3),
83 Acopy ) ,AA,H,N,N2,Q,Q2)
84 ;
85 develop(( #(V=Vcopy),Acopy ) ,AA,H,N,N2,Q,Q2)),!,
86 develop(B,BB,H,N2,N3,Q2,Q1),!,
87 ( var(BB), !, Q3 = Q, BBB = B, N1 = N3
88 ; get_variable(BB,Vlist,[],_,0,_Vcount),
89 new_head(H,BBB,N3,Vlist), % necessary to reduce variable copy..
90 N1 is N3+1,
91 Q3 = ((BBB :- BB),Q)),!.
92 % single time funcitons
93 develop(A:=B, true, _Root, M, M, Q, Q) :-
94 (A \= *('$CNT'(_)),A \= *(_); var(A)) ,!,
95 c_error((write('assign to non static:'),write(A:=B),nl)).
96 % <= use current value for addressing
97 develop(A<==B, true, _Root, M, M, Q, Q) :-
98 (A \= *_,A \= [_|_]; var(A)) ,!,
99 c_error((write('assign to non static:'),write(A<==B),nl)).
100 develop(*A<==B, C, Root, M, M1, Q, Q1) :- !,
101 d_function(A, AA, M, M2, Root, Q, Q2, C, C2),
102 d_function(B, BB, M2,M1, Root, Q2,Q1, C2,
103 ('$CNT'(YY)=AA,'$CNT'(VV)=BB, 'r_assign'('$CNT'(YY),'$CNT'(VV)))).
104 % develop(*A<=B, C, Root, M, M1, Q, Q1) :- atomic(A),!,
105 % d_function(B, BB, M,M1, Root, Q,Q1, C, 'r_assign'(A,'$CNT'(BB))).
106 develop(*('$CNT'(A)):=B, C, Root, M, M1, Q, Q1) :- !,
107 d_function(A, AA, M, M2, Root, Q, Q2, C2, *('$CNT'(AA)):=BB),!,
108 d_function(B, BB, M2,M1, Root, Q2,Q1, C, C2).
109 develop(*A:=B, C, Root, M, M1, Q, Q1) :- !,
110 d_function(A, AA, M, M2, Root, Q, Q2, C2, *AA:=BB),!,
111 d_function(B, BB, M2,M1, Root, Q2,Q1, C, C2).
112 develop(A=B, C, Root, M, M1, Q, Q1) :- !,
113 d_function(A, AA, M, M2, Root, Q, Q2, C2, AA=BB),!,
114 d_function(B, BB, M2,M1, Root, Q2,Q1, C, C2).
115 develop(A<B, C, Root, M, M1, Q, Q1) :- !,
116 d_function(A, AA, M, M2, Root, Q, Q2, C2, AA<BB),!,
117 d_function(B, BB, M2,M1, Root, Q2,Q1, C, C2).
118 develop(A>B, C, Root, M, M1, Q, Q1) :- !,
119 d_function(A, AA, M, M2, Root, Q, Q2, C2, AA>BB),!,
120 d_function(B, BB, M2,M1, Root, Q2,Q1, C, C2).
121 % full time functions
122 develop(A,AAA,Root,N,N1,Q,Q1) :-
123 recorded('r_prepr', ((A :- AA),Body),_),!,
124 develop_macro(Body,A,AA,AAA,Root,N,N1,Q,Q1).
125 develop(A, C, Root, M, M1, Q, Q1) :- functor(A,H,N),functor(AA,H,N),
126 develop_args(0, N, M, M1, Root, A, AA, Q, Q1, C, AA).
127
128 develop_args(N , N, M, M , _Root, _A, _AA, Q, Q, C, C) :- !.
129 develop_args(N1, N, M, M1, Root, A, AA, Q, Q1, C, C1) :-
130 N2 is N1+1, arg(N2,A,B), arg(N2,AA,BB),
131 d_function(B, BB, M, M2, Root, Q, Q2, C, C2),!, %%% check full time here?
132 develop_args(N2, N, M2, M1, Root, A, AA, Q2, Q1, C2, C1).
133
134 develop_macro(true,_A,AA,AAA,Root,N,N1,Q,Q1) :- !,
135 develop(AA,AAA,Root,N,N1,Q,Q1).
136 develop_macro(Body,A,AA,AAA,Root,N,N1,Q,Q2) :-
137 get_variable(A,Vlist,[],_,0,_Vcount),
138 macro(Body, Root, N, N2, Vlist, Q, Q1),
139 develop(AA,AAA,Root,N2,N1,Q1,Q2),!.
140
141 /* make original head
142
143 Root head
144 New head
145 uniq Id
146 variable list
147 */
148
149 new_head(Root,New,No,Vlist) :-
150 new_head(Root,New,No,Vlist,_,T,T).
151
152 new_head(Root,New,No,Vlist,large,T,T1) :-
153 length(Vlist,N),N>10,!,
154 [A,B,C|T] = Vlist,
155 functor(Root,HH,Arity),
156 name(HH,HL),name(No,NL),name(Arity,NAL),
157 concatenate(["r_",NL,HL,NAL],NewL),
158 name(NewH,NewL),
159 New =.. [NewH,A,B,C,T1].
160 new_head(Root,New,No,Vlist,small,_,_) :- functor(Root,HH,A),
161 name(HH,HL),name(No,NL),name(A,NAL),
162 concatenate(["r_",NL,HL,NAL],NewL),
163 name(NewH,NewL),
164 New =.. [NewH|Vlist].
165
166 /* make variable list */
167
168 get_variable(H,V,V1,VL,N,N1) :-
169 var(H),!,
170 not_vmember(H,V,V1,VL,N,N1).
171 get_variable(H,V,V1,VL,N,N1) :-
172 H = '$CNT'(_),!, % inherit constant
173 not_vmember(H,V,V1,VL,N,N1).
174 get_variable(F,V,V1,VL,N,N1) :-
175 functor(F,_,A),
176 get_variable_arg(0,A,F,V, V1, VL, N,N1).
177
178 get_variable_arg(A,A,_F,V,V,_VL, N,N) :- !.
179 get_variable_arg(A,A1,F,V,V1,VL,N,N1) :-
180 A2 is A+1, arg(A2, F, Arg),
181 get_variable(Arg,V,V2,VL,N, N2),
182 get_variable_arg(A2,A1,F,V2,V1,VL,N2,N1).
183
184 not_vmember(H,[H|T],T,VL,N,N1) :- var(VL),!,VL = [H|_],N1 is N+1.
185 not_vmember(H, T,T,[H1|_VL],N,N) :- H == H1,!.
186 not_vmember(H, T,T,[H1|_VL],N,N) :- H == '$CNT'(H1),!.
187 not_vmember(H, T, T1,[_|VL], N, N1) :- not_vmember(H,T,T1,VL,N,N1).
188
189 /* copyv
190 make copy with new variables
191 and its old variable list and new variable list
192
193 copyv(Old, New, OldVariable, NewVariable)
194
195 a little dum algorithm
196 */
197
198 copyv(O,N,OV,NV) :-
199 get_variable(O,OV,[],_,0,_Vcount),!,
200 copy((O,OV),(N,NV)).
201
202 /*
203 macro
204
205 */
206
207
208 macro((A '$clause' B), Root, N, N1, Vs, Q, Q2) :- !,
209 single_macro(A, Root, N, N2, Vs, Q, Q1),
210 macro(B, Root, N2, N1, Vs, Q1, Q2).
211 macro(A, Root, N, N1, Vs, Q, Q1) :-
212 single_macro(A, Root, N, N1, Vs, Q, Q1).
213
214
215 single_macro(A , Root, N, N1, Vlist, (A,Q), Q) :- var(A),!,
216 new_head(Root,A,N,Vlist),
217 N1 is N+1.
218 single_macro((A :- B), Root, N, N2, Vlist, Q, Q2) :- !,
219 head_optimize(BB,A,Root,Vlist,N,N1,Q,Q1),!,
220 develop(B,BB,Root,N1,N2,Q1,Q2),!.
221 single_macro(A, _Root, N, N, _Vlist, (A,Q), Q).
222
223 head_optimize(BB,A,Root,Vlist,N,N2,((A:-BB),Q),Q) :-
224 var(A),
225 !,
226 new_head(Root,A,N,Vlist),
227 N2 is N+1.
228 head_optimize(BB,A,_Root,_Vlist,N,N,((A:-BB),Q),Q).
229
230 /*
231 functions
232 should be seprated full time function and
233 now only function
234 */
235
236 d_function(A,AA,N,N,_Root,Q,Q,C,C) :- var(A),!, A = AA. % not interval constant
237 d_function(A,R1,N,N1,Root,Q,Q1,(AAA,C1),C) :- % not interval constant
238 recorded('r_func', ((A = R :- AA),Body) ,_),!,
239 d_function(R,R1,N,N2,Root,Q2,Q1,C1,C),
240 d_f_dev(Body,A,AA,AAA,Root,N2,N1,Q,Q2).
241 d_function(cputime, '$CNT'(Value), N,N,_R,Q, Q, ('r_cputime'(Value),C),C) :- !.
242 d_function(A,AA,N,N,_Root,Q,Q,C,C) :- atomic(A),!, A = AA.
243 d_function(@A,@AA,N,N2,Root,Q,Q1,Next,C) :- !, % not interval constant
244 d_function(A,AA,N,N2,Root,Q,Q1,CN,true),
245 d_next_check(CN,Next,C).
246 d_function(*Name,'$CNT'(V),N,N2,Root,Q,Q1,C,C1) :- !, % not interval constant
247 d_function(Name,Name1,N,N2,Root,Q,Q1,C,('r_read_value'(Name1,'$CNT'(V)),C1)).
248 d_function(binary(B), Value, N,N,_R,Q, Q, C,C) :- !,
249 c_binary(B,Value),!.
250 d_function(hex(H), Value, N,N,_R,Q, Q, C,C) :- !,
251 c_hex(H,Value),!.
252 d_function(Exp, '$CNT'(Value), N,N1,R,Q, Q1, C,C1) :- % not interval constant
253 n_function(Exp,A,B,Exp1,AA,BB),!,
254 d_function_exp(A, AA, N,N2,R,Q, Q2,C, C2),
255 d_function_exp(B, BB, N2,N1,R,Q2,Q1,C2,('$CNT'(Value) is Exp1,C1)).
256 d_function(A,AA,N,N1,Root,Q,Q1,C,C1) :- functor(A,H,M),functor(AA,H,M),
257 d_function_args(0,M,A,AA,N,N1,Root,Q,Q1,C,C1),!.
258
259 d_next_check(true,C,C):-!.
260 d_next_check(CN,(next(CN),C),C):-!.
261
262 d_function_args(M,M,_A,_AA,N,N,_Root,Q,Q,C,C) :- !.
263 d_function_args(M1,M,A,AA,N,N1,Root,Q,Q1,C,C1) :-
264 M2 is M1+1, arg(M2,A,B), arg(M2,AA,BB),
265 d_function(B,BB,N,N2,Root,Q,Q2,C,C2),!,
266 d_function_args(M2,M,A,AA,N2,N1,Root,Q2,Q1,C2,C1),!.
267
268 d_function_exp(Exp, Exp1, N,N1,R,Q, Q1, C,C1) :- nonvar(Exp),
269 n_function(Exp,A,B,Exp1,AA,BB),!,
270 d_function_exp(A, AA, N,N2,R,Q, Q2, C,C2),
271 d_function_exp(B, BB, N2,N1,R,Q2, Q1, C2,C1).
272 d_function_exp(Exp, Exp1, N,N1,R,Q, Q1, C,C1) :-
273 d_function(Exp, Exp1, N,N1,R,Q, Q1, C,C1).
274
275 d_f_dev(true,_A,AA,AAA,Root,N,N1,Q,Q1) :-!,
276 develop(AA, AAA, Root, N, N1, Q, Q1).
277 d_f_dev(Body,A,AA,AAA,Root,N,N1,Q,Q1) :-
278 get_variable(A,Vs,[],_,0,_Vcount),!,
279 develop(AA, AAA, Root, N, N2, Q, Q2),!,
280 macro(Body, Root, N2, N1, Vs, Q2, Q1),!.
281
282 /* */