1:- module(anti_subst, [
2 anti_subst/3,
3 anti_subst/4,
4 expand_clause/4,
5 expand_head/6,
6 expand_atomic_goal/6
7 ]). 8
9:- use_module(reduce). 10
16period_args(X, A, B):- compound(X),
17 compound_name_arguments(X, '.', [A, B]).
21is_role(role(X, Y), X, Y):-!.
22is_role(X, A, B):- period_args(X, A, B).
23
40is_odict(X):- nonvar(X), X = {X0}, nonvar(X0),
41 key_value_pairs(X0).
43key_value_pairs((X, Y)):- nonvar(X), nonvar(Y),
44 key_value_pairs(X),
45 key_value_pairs(Y).
46key_value_pairs(K: _):- ground(K).
47
49mustbe_odict(X):- is_odict(X), !.
50mustbe_odict(X):- writeln("Open dict expected found:"), writeln(X).
51
54
76
77anti_subst(X, A, R):- once(anti_subst(X, A, R, [])).
78
79anti_subst(X, X, P, P):- (var(X); atomic(X)), !.
80anti_subst({X}, A, [{X0}-A|P], Q):- is_odict({X}), !, anti_subst(X, X0, P, Q).
81anti_subst(quote(X), X, R, R).
82anti_subst(nopac(X), X, R, R).
83anti_subst((X, Y), (X0, Y0), P, Q):-
84 anti_subst(X, X0, P, P0),
85 anti_subst(Y, Y0, P0, Q).
86anti_subst(M:X, M:A, P, Q):- anti_subst(X, A, P, Q).
87anti_subst(X, A, [Y-A|R], R):- anti_subst_rule(X, Y), !.
88anti_subst([X|Xs], [A|As], P, Q):- !,
89 anti_subst(X, A, P, P0),
90 anti_subst(Xs, As, P0, Q).
91anti_subst(X, X, P, P):- compound_name_arity(X, _, 0), !.
92anti_subst(X, A, P, Q):- X =..[H|Xs],
93 anti_subst(Xs, As, P, Q),
94 A =..[H|As].
95
97anti_subst_rule(is(X), arith_exp(X)).
98anti_subst_rule(X, pac(X0)):- normal_pac(X, X0).
99anti_subst_rule(X, Y):- period_args(X, A, B),
100 ( user:chk_odict -> Y = role(A, B)
101 ; Y = X
102 ).
107normal_pac(pred(X), pred(X)).
108normal_pac(pred(Vs, X), pred(Vs, X)).
109normal_pac(rec(F, Cs), rec(F, Cs)).
110normal_pac(rec(F, Vs, Cs), rec(F, Vs, Cs)).
111normal_pac(mrec(Defs), mrec(Defs)).
112normal_pac(mrec(Vs, Defs), mrec(Vs, Defs)).
113
114
115
129
130expand_clause(M:A, M0, P, Q):- M==[], !,
131 expand_clause(A, M0, P, Q).
132expand_clause(M:A, _, P, Q):- !, expand_clause(A, M, P, Q).
133expand_clause(:-(H, B), M, [:-(H0, B0)|P], Q):-!,
134 expand_head(H, M, H0, U, P, P0),
135 pac:expand_goal(B, M, V, P0, Q),
136 slim_goal((U, V), B0).
137expand_clause(H-->B, M, [C|P], Q):- !,
138 expand_head(H, M, H0, U, P, P0),
139 pac:expand_phrase(B, M, B0, P0, Q),
140 dcg_translate_rule((H0 --> {U}, B0), C).
141expand_clause(H, M, P, Q):- expand_clause( H:-true, M, P, Q).
147expand_atomic_goal(G, M, H, U, P, Q):-
148 anti_subst(G, G0, Aux),
149 attach_prefix(M, G0, H),
150 expand_aux(Aux, M, U0, P, Q),
151 slim_goal(U0, U).
164
165expand_head(H, M, NewH, U, P, Q):-
166 anti_subst(H, H0, Aux),
167 expand_aux(Aux, M, U, P, Q),
168 attach_prefix(M, H0, NewH).
176expand_aux([], _, true, P, P).
177expand_aux([X|Xs], M, (G0, G), P, Q):-
178 expand_aux_base(X, M, G0, P, P0),
179 expand_aux(Xs, M, G, P0, Q).
187expand_aux_base({X}-A, M, (G1, G0), P, Q):-
188 anti_subst(X, X0, Aux),
189 ( user:chk_odict
190 -> expand_dict:expand_dict({X0}, A, G0)
191 ; A = {X0}
192 ),
193 expand_aux(Aux, M, G1, P, Q).
194expand_aux_base(X-A, M, G, P, Q):- is_role(X, _, _), !,
195 pac:expand_dict_access(X, =, A, M, G, P, Q).
196expand_aux_base(pac(X)-A, M, true, P, Q):-
197 pac:expand_core(X, M, A, P, Q).
198expand_aux_base(arith_exp(E)-A, M, G, P, Q):-
199 anti_subst(E, E0, Aux),
200 expand_aux(Aux, M, G0, P, Q),
201 slim_goal((G0, A is E0), G)