comparison tc.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
12 Tokio compiler to prolog
13 Thu Aug 15 12:17:04 JST 1985
14 Fri Jan 10 16:11:31 JST 1986
15 Fri Sep 5 09:51:36 JST 1986 for 1.2a
16 Thu Mar 26 16:19:10 JST 1987
17 Wed Oct 14 13:35:54 JST 1987 full time F
18 Fri Oct 16 11:28:26 JST 1987 Sicstus
19 $Header$
20 body-compiler
21 */
22
23 c_clause((Head :- Body), (H :- B)) :- !,
24 c_opt(Body, NBody, _), % delete true
25 c_body(NBody, Control,
26 ['$t'(B1,_,_,_)|Q] , ['$t'(true,_,_,_)|T1], before_cut-_),
27 % make queue structure
28 c_head(Head, H0, B2, B1,Control,Q), % inline unification
29 c_opt(B2, B, _), % off tailing true
30 c_make_pred(H0, H, Q, T1).
31 c_clause(Head, H) :- % fact
32 c_head(Head, H0, B2, true,_,_),
33 c_make_pred(H0, H1, Q, Q),
34 c_opt(B2, B, _), % off tailing true
35 (B = true, H = H1,! ; H = (H1 :- B)).
36
37 c_error(A) :-
38 telling(Old),tell(user),
39 call(A),
40 tell(Old).
41
42 /*
43
44 c_head(Head, ModfiedHead, Qhead, Qtail)
45
46 */
47
48 c_head(H,Mh,Qh0,Qt,Control,Q) :-
49 c_control_reference(Control,Qh0,Qh,Q),
50 functor(H,F,A),functor(Mh,F,A),
51 c_args(0,A, H, Mh, Qh, Qt).
52
53 c_args(N, N, _, _, Q, Q) :- !.
54 c_args(K, N, Head, H, Q, Q1) :-
55 K1 is K+1, arg(K1, Head, AK), arg(K1, H, HK),
56 c_unify(AK, HK, Q, Q2, 8),
57 c_args(K1, N, Head, H, Q2, Q1).
58
59 % We needs NOW value however sometines is is hiden in Next time Queue
60 c_control_reference(Control,(Q=['$t'(_N,_F,_K,'$'(_,NowTime,_))|_],Qh),Qh,Q) :-
61 Control = '$'(_Fin,Now,_Empty),nonvar(Now),var(Q),
62 Now = '$REF'(NowTime),!.
63 c_control_reference(_Control,Qh,Qh,_Q).
64
65 /*
66
67 Tokio compiler Queue structure
68
69 [Qnow,Qnext1,Qnext2,......|_],[QnowTail,Qnext1Tail,Qnext2Tail,.....|_]
70 D-list
71 Qnow = '$t'(Next,Fin,Keep,'$'(Fin,Now,Empty))
72
73 predicate(A):- p,q.
74 ---> predicate(A,Q,Q1) :-
75 p(Q,Q2),q(Q2,Q1).
76 */
77
78 c_body(E=E1, Control,
79 ['$t'(N1,F,K,C)|Q],
80 ['$t'(N,F,K,C)|Q], before_cut-before_cut) :- !,
81 c_eval(E, EE, N1, N2, Control), c_eval(E1, EE1, N2, N, Control),
82 c_equate(EE,EE1).
83 c_body(E=E1, Control,
84 ['$t'(N1,F,K,C)|Q],
85 ['$t'(N,F,K,C)|Q], after_cut-after_cut) :- !,
86 c_eval(E, EE, N1, N2, Control), c_eval(E1, EE1, N2, (EE = EE1,N), Control).
87 c_body(E is E1, Control,
88 ['$t'(N1,F,K,C)|Q],
89 ['$t'(N,F,K,C)|Q], Cut-Cut) :- !,
90 c_eval(E, EE, N1, N2, Control), c_eval(E1, EE1, N2, (EE is EE1,N), Control).
91 c_body('$chop'(Former,Later), Control, % later must be atomic
92 ['$t'(('r_subBegin'(Q,QF,QF1,_Sfin),FF),F,K,Control)|Q],
93 ['$t'(FF1,F,K,Control)|Q1],Cut) :- !,
94 Control = '$'(_CFin,CNow,_CEmpty), NC = '$'(_,CNow,_), % subtle code
95 c_body(Former,NC,['$t'(FF,_,_,NC)|QF1],['$t'((L1,FF1),_,_,NC)|QF2],Cut),
96 c_chop_later(Later, L1, Q, Q1, QF, QF2).
97 c_body((A,B), Control, Q, Q1, Cut-Cut1) :- !,
98 c_body(A, Control, Q, Q2, Cut-Cut2),
99 c_body(B, Control, Q2, Q1, Cut2-Cut1).
100 %c_body(empty, '$'(Fin,Now,empty),
101 % [Now,'$t'(N,F,K,'$'(Fin,Now,empty))|Q1],
102 % [Now,'$t'(N,F,K,'$'(Fin,Now,empty))|Q1], Cut) :- !, % strong next
103 c_body(empty, Control,
104 ['$t'(('r_empty'(Q),N),F,K,Control)|Q],
105 ['$t'(N,F,K,Control)|Q],Cut-Cut) :- !.
106 c_body(notEmpty, Control,
107 ['$t'(('r_notEmpty'(Q),N),F,K,Control)|Q],
108 ['$t'(N,F,K,Control)|Q],Cut-Cut) :- !.
109 c_body(length(L), Control,
110 ['$t'(N2,F,K,Control)|Q],
111 ['$t'(N,F,K,Control)|Q],Cut-Cut) :- !,
112 c_eval(L, LL, N2, ('r_length'(LL,Q),N), Control).
113 %% c_body(@true, C, Q, Q, Cut-Cut) :-!. % special optimize
114 c_body(next(true), _C, Q, Q, Cut-Cut) :-!.
115 c_body(@A, '$'(Fin,NowTime,notEmpty),
116 [Now|Q],
117 [Now,'$t'(N,F,K,'$'(Fin,NowTime,notEmpty))|Q1], Cut) :- !, % strong next
118 c_seperate_next(A, NextA),
119 c_body(NextA, _Control,
120 Q,
121 ['$t'(N,F,K,'$'(Fin,NowTime,notEmpty))|Q1], Cut).
122 c_body(next(A), _Control,
123 [Now|Q], [Now|Q1], Cut) :- !, % weak next
124 c_seperate_next(A, NextA),
125 c_body(NextA, _Control1, Q, Q1, Cut).
126 c_body(ifEmpty(A), Control, % fin don't care queue
127 [Now,'$t'(N,F,K,Control)|Q],[Now,'$t'(N,F1,K,Control)|Q],
128 Cut-Cut) :- !,
129 c_body(A, Control,
130 ['$t'(F,F2,_,Control)|_],
131 ['$t'(F2,F1,_,Control)|_] , after_cut-_).
132 c_body(ifNotEmpty(A), Control,
133 [Now,'$t'(N,F,K,Control)|Q],[Now,'$t'(N1,F,K1,Control1)|Q1],
134 Cut-Cut) :- !,
135 c_body(A, Control,
136 ['$t'(K ,_,_,Control),'$t'(N, _,K2,Control) |Q],
137 ['$t'(K2,_,_,Control),'$t'(N1,_,K1,Control1)|Q1] , after_cut-_).
138 c_body(A, Control, ['$t'(System,F,K,Control)|Q],
139 ['$t'(System1,F,K,Control)|Q], Cut) :-
140 c_system(A, System, System1, Control, Cut), !.
141 c_body(A, Control,
142 ['$t'((A1,Now),F,K,Control)|Q],
143 ['$t'(Now,F,K,Control)|Q1], Cut-Cut) :- !,
144 c_make_pred(A,A1,Q,Q1).
145
146 c_make_pred(X, XX, Q, T) :-
147 functor(X, F, A),
148 A1 is A+1, A2 is A+2,
149 functor(XX, F, A2),
150 c_copy_args(A, X, XX),
151 arg(A1, XX, Q), arg(A2, XX, T).
152
153 c_copy_args(0, _, _) :- !.
154 c_copy_args(K, X, XX) :-
155 arg(K, X, XK), arg(K, XX, XK), K1 is K-1, c_copy_args(K1, X, XX).
156
157 c_system(true,Q, Q, _, Cut-Cut) :- !.
158 c_system('r_read_value'(A,B),('r_read_value'(A1,B),Q), Q, _, Cut-Cut) :- !,
159 c_seperate_now(A,A1).
160 c_system(!, (!,Q), Q, _, _Cut-after_cut) :- !.
161 c_system(prolog(A), (call(A1),Q), Q, _, Cut-Cut) :- !, c_seperate_now(A,A1).
162 %% c_system(A<--B, Q, Q1, Control, Cut-Cut) :- !,
163 %% c_eval(B, V, Q, Q2, Control),
164 %% (A = '$CNT'(V),!,Q1=Q2 ; Q2 = (unifyAll(A,V),Q1)).
165 c_system(*A:=B, Q, Q1, Control, Cut-Cut) :- !,
166 '$'(_Fin,'$REF'(NowTime),_Empty)=Control,
167 c_eval(A, Name, Q, Q2, Control),
168 c_eval(B, Value, Q2, ('r_set_value'(Name,Value,NowTime),Q1), Control).
169 c_system(Op, Q, Q1, Control, Cut-Cut) :- n_predicate(Op,A,B,Op2,AA,BB),!,
170 c_eval(A, AA, Q, Q2, Control), c_eval(B, BB, Q2, (Op2,Q1), Control).
171 c_system(System,(System1,Q), Q, _, Cut-Cut) :- systemp(System),
172 c_seperate_now(System,System1).
173
174 % compile chop operator
175 %
176 % c_chop_later(Later, GenerateLater, Q, Q1, QF, QF1).
177
178 c_chop_later(Later, GenerateLater, Q, Q1, QF, QF1) :-
179
180 % 0r(X, '$'(Q,Q1,QF,QF1))
181
182 functor(Later, LH1, A),
183 A1 is A+1,
184 functor(GenerateLater, LH1, A1),
185 arg(A1, GenerateLater, '$'(Q,Q1,QF,QF1)),
186 c_skel_copy_arg(0, 0, A, Later, GenerateLater),
187
188 % 0r(X, '$'(Q, Q1, QF, QF1)) :- 'r_subFin'(QF, QF1),r(X, Q, Q1).
189
190 functor(Later0, LH1, A),
191 c_make_pred(Later0, Later1, QQ, QQ1),
192 functor(L2, LH1, A1),
193 arg(A1, L2, '$'(QQ,QQ1,QQF,QQF1)),
194 c_skel_copy_arg(0, 0, A, Later0, L2),
195 write_clause( (L2 :- 'r_subFin'(QQF,QQF1), Later1)),
196
197 % 0r(X, '$'(Q, Q1, QF, QF1)) :-
198 % 'r_subNotFin'(
199 % 0r(Xn,'$'(NQ,NQ1,NQF,NQF1)), '$'(NQ,NQ1,NQF,NQF1),
200 % '$'(Q, Q1, QF, QF1)).
201
202 functor(Later00, LH1, A),
203 functor(L3, LH1, A1),
204 arg(A1, L3, '$'(QQ,QQ1,QQF,QQF1)),
205 functor(L4, LH1, A1),
206 arg(A1, L4, '$'(NQQ,NQQ1,NQQF,NQQF1)),
207 c_seperate_next(Later00,Later00Next),
208 c_skel_copy_arg(0, 0, A, Later00Next, L4),
209 c_args(0,A,Later00, L3, Body,
210 'r_subNotFin'( L4, '$'(NQQ,NQQ1,NQQF,NQQF1),
211 QQ, QQ1, QQF, QQF1)),
212 write_clause(( L3 :- Body )).
213
214 %%