annotate th.pl @ 4:f864bb4ba9a4 default tip

update tags
author convert-repo
date Fri, 07 Nov 2008 20:36:52 +0000
parents cfb7c6b24319
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
1 /*
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
2 Copyright (C) 1988,2005, Shinji Kono
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
3 Everyone is permitted to copy and distribute verbatim copies
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
4 of this license, but changing it is not allowed. You can also
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
5 use this wording to make the terms for other programs.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
6
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
7 send your comments to kono@ie.u-ryukyu.ac.jp
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
8 */
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
9
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
10 %% Tokio to Prolog compiler
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
11 %%
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
12 %% variable classification and head compile
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
13 %%
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
14 %%
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
15 %% Sat Jan 11 11:31:10 JST 1986
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
16 %% $Header$
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
17
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
18 c_equate(EE,EE) :-!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
19 c_equate('$CNT'(EE),EE) :-!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
20 c_equate(EE,'$CNT'(EE)) :-!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
21
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
22 %% variable separation for temporality
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
23
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
24 c_seperate(Var,Now,Next) :- Var = '$TMP'(_,Now,Next),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
25 c_seperate(Var,Var,'$CNT'(Var1)) :- Var = '$CNT'(Var1),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
26 c_seperate(Var,Now,Next) :- Var = '$NOW'(Var1,Now),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
27 c_seperate(Var1,Now,Next).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
28 c_seperate(Var,Now,Next) :- Var = '$NXT'(Var1,Next),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
29 c_seperate(Var1,Now,Next).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
30 c_seperate(Atomic,Atomic,Atomic) :- atomic(Atomic),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
31 c_seperate(Op, Op1, Op2) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
32 functor(Op, H, N),functor(Op1, H, N),functor(Op2, H, N),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
33 c_seperate_arg(0, N, Op, Op1, Op2).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
34
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
35 c_seperate_arg(N, N, _, _, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
36 c_seperate_arg(M, N, Op, Op1, Op2) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
37 M1 is M+1,arg(M1, Op, A), arg(M1, Op1, A1),arg(M1, Op2, A2),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
38 c_seperate(A,A1,A2),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
39 c_seperate_arg(M1, N, Op, Op1, Op2).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
40
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
41
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
42 c_seperate_now(Var,Now) :- Var = '$NOW'(_,Now),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
43 c_seperate_now(Var,Var) :- Var = '$CNT'(_Var1),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
44 c_seperate_now(Var,Now) :- Var = '$TMP'(_,Now,_Next),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
45 c_seperate_now(Var,Now) :- Var = '$NXT'(Var1,Next),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
46 c_seperate(Var1,Now,Next).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
47 c_seperate_now(Atomic,Atomic) :- atomic(Atomic),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
48 c_seperate_now(Op, Op1) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
49 functor(Op, H, N),functor(Op1, H, N),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
50 c_seperate_now_arg(0, N, Op, Op1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
51
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
52 c_seperate_now_arg(N, N, _, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
53 c_seperate_now_arg(M, N, Op, Op1) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
54 M1 is M+1,arg(M1, Op, A), arg(M1, Op1, A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
55 c_seperate_now(A,A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
56 c_seperate_now_arg(M1, N, Op, Op1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
57
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
58 c_seperate_next(Var,Next) :- Var = '$NXT'(_,Next),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
59 c_seperate_next(Var,'$CNT'(Var1)) :- Var = '$CNT'(Var1),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
60 c_seperate_next(Var,Next) :- Var = '$TMP'(_,_Now,Next),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
61 c_seperate_next(Var,Next) :- Var = '$NOW'(Var1,Now),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
62 c_seperate(Var1,Now,Next).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
63 c_seperate_next(Atomic,Atomic) :- atomic(Atomic),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
64 c_seperate_next(Op, Op1) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
65 functor(Op, H, N),functor(Op1, H, N),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
66 c_seperate_next_arg(0, N, Op, Op1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
67
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
68 c_seperate_next_arg(N, N, _, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
69 c_seperate_next_arg(M, N, Op, Op1) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
70 M1 is M+1,arg(M1, Op, A), arg(M1, Op1, A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
71 c_seperate_next(A,A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
72 c_seperate_next_arg(M1, N, Op, Op1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
73
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
74 % c_unify(Original_argument, Generated_argument, Unification_code, ItsBase,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
75 % Level).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
76 % Tokio has same problem as ghc. f(X,X) must be comipled into
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
77 % f(X, Y) :- unify(X, Y).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
78 c_unify(X, Y, Q, Q, _) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
79 var(X), !, X= '$REF'(Y). % mark X as "used!"
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
80 c_unify('$REF'(X), Y, (unifyAll(X, Y),Q), Q, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
81 % c_unify('$CNT'(X), X, Q, Q, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
82 c_unify('$CNT'(X), Y, (uconst(Y,X),Q), Q, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
83 c_unify('$TMP'(Org,Now,Next), Org1, Q1, Q, L) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
84 c_nownext(Org, Org1, Now, Next, Q1, Q, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
85 c_unify('$NOW'(Org,Now), Org1, Q1, Q, L) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
86 c_now(Org, Org1, Now, Q1, Q, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
87 c_unify('$NXT'(Org,Next), Org1, Q1, Q, L) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
88 c_next(Org, Org1, Next, Q1, Q, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
89 c_unify([], X, (unil(X),Q), Q, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
90 c_unify(A, X, (uatom(X, A),Q), Q, _) :- atomic(A), !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
91 c_unify(X, Y, (unifyAll(X, Y),Q), Q, 0) :- !. % Stop expansion at given level
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
92 c_unify([H|T], X, (ulist(X, H0, T0), Q1), Q, L) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
93 L1 is L-1, c_unify(H, H0, Q1, Q2, L1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
94 c_unify(T, T0, Q2, Q, L1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
95 c_unify(S, X, Q1, Q, L) :- % compile unification
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
96 functor(S, F, A), A < 4, !, functor(S0, F, A),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
97 make_skel_name(F, Us, A),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
98 c_skel(Us, S0, X, F, A, Q1, Q2, L),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
99 L1 is L-1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
100 c_unify_args(0, A, S, S0, Q2, Q, L1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
101 c_unify(S, X, (uskel(X, S0), Q1), Q, L) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
102 L1 is L-1, functor(S, F, A), functor(S0, F, A),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
103 c_unify_args(0, A, S, S0, Q1, Q, L1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
104
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
105 c_unify_args(N, N, _, _, Q, Q, _) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
106 c_unify_args(K, N, S, X, Q1, Q, L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
107 K1 is K+1, arg(K1, S, SK), arg(K1, X, XK),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
108 c_unify(SK, XK, Q1, Q2, L),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
109 c_unify_args(K1, N, S, X, Q2, Q, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
110
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
111 % compile skelton unifications
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
112 %
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
113 % f(_,_,_) ---> 'r_f3'
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
114
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
115 make_skel_name(F, U, A) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
116 name(A, AL), name(F, FL),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
117 % concatenate(["'r_",FL,AL,"'"], UL),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
118 concatenate(["r_",FL,AL], UL), %%%%%%%%%%%%%%%%%
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
119 name(U, UL).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
120
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
121 concatenate([],[]).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
122 concatenate([H|T],X) :- concatenate(T,X1),append(H,X1,X).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
123
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
124 c_skel(U, S, X, _F, A, (Uc,Q), Q, _L) :- recorded('$uskel',U,_),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
125 A1 is A+1, functor(Uc, U, A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
126 arg(1, Uc, X),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
127 c_skel_copy_arg(0, 1, A1, S, Uc).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
128 c_skel(U, S, X, F, A, (Uc,Q), Q, _L) :- recordz('$uskel',U,_),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
129 A1 is A+1, functor(Uc, U, A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
130 arg(1, Uc, X),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
131 c_skel_copy_arg(0, 1, A1, S, Uc),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
132 functor(U1, U, A1), functor(Us, F, A),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
133 c_skel_copy_arg(0, 1, A1, Us, U1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
134 arg(1, U1, Us),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
135 write_clause((U1 :- !)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
136 functor(U2, U, A1), functor(Us2, F, A), functor(Un, U, A1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
137 c_skel_copy_arg_tmp(0, 1, A1, Us2, U2, Un),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
138 arg(1, U2, '$t'(Us2, N)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
139 arg(1, Un, N),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
140 write_clause((U2 :- Un)).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
141
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
142
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
143 c_skel_copy_arg(_L, N, N, _A, _B) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
144 c_skel_copy_arg(L, N, M, A, B) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
145 L1 is L+1, N1 is N+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
146 arg(L1, A, Arg), arg(N1, B, Arg),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
147 c_skel_copy_arg(L1, N1, M, A, B).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
148
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
149 c_skel_copy_arg_tmp(_L, N, N, _A, _B, _C) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
150 c_skel_copy_arg_tmp(L, N, M, A, B, C) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
151 L1 is L+1, N1 is N+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
152 arg(L1, A, Now), arg(N1, B, '$t'(Now,Next)), arg(N1, C, Next),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
153 c_skel_copy_arg_tmp(L1, N1, M, A, B, C).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
154 % optimiser check variables
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
155 % now only referenced unifyNow
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
156 % next only referenced unifyNext
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
157 % both referenced unifyNowNext
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
158 %
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
159 % if already referenced then product unifyAll code
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
160 %
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
161 % c_now/next(Org, Modyfied, Now/Next, Q1, Q),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
162
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
163 c_nownext(Org, Org1, Now, Next, (unifyNowNext(Org1,Now,Next1),Q1), Q, L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
164 var(Org),!,Org = '$REF'(Org1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
165 c_unify(Next,Next1, Q1, Q, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
166 c_nownext('$REF'(O2), O, _Now, _Next, (unifyAll(O2,O),Q), Q, _L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
167
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
168 c_now(Var, Var1, Now, (unifyNow(Var1,Now), Q), Q, _L) :- var(Var),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
169 Var = '$REF'(Var1).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
170 c_now('$REF'(O2), O, _Now, (unifyAll(O2,O),Q), Q, _L) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
171 c_now('$TMP'(O,Now,Next), O1, Now, Q, Q1, L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
172 c_nownext(O, O1, Now, Next, Q, Q1, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
173
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
174 c_next(Var, Var, Next, (unifyNext(Var1,Next1), Q), Q1, L) :- var(Var),!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
175 Var = '$REF'(Var1),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
176 c_unify(Next,Next1, Q, Q1, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
177 c_next('$REF'(O2), O, _Next, (unifyAll(O2,O),Q), Q, _L) :- !.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
178 c_next('$TMP'(O,Now,Next), O1, Next, Q, Q1, L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
179 c_nownext(O, O1, Now, Next, Q, Q1, L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
180
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
181
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
182 % c_opt(Before, After, Optimized_or_not)
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
183 c_opt(X,X,0) :- var(X),!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
184 c_opt((true, X), Y, 1) :- !, c_opt(X, Y, _).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
185 c_opt((X0, true), X, 1) :- !, c_opt(X0, X, _).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
186 c_opt((X0, Y0), R, C) :- !,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
187 c_opt(X0, X1, CX), c_opt(Y0, Y1, CY), C0 is CX\/CY,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
188 ( C0 =:= 0, !, C is C0, R = (X1, Y1);
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
189 c_opt((X1, Y1), R, C) ). % X1/Y1 may be optimized to 'true'
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
190 c_opt(X, X, 0).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
191
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
192 /* end of compiler */