37
41
43
44:- module(clpqr_project,
45 [
46 drop_dep/1,
47 drop_dep_one/1,
48 make_target_indep/2,
49 project_attributes/2
50 ]). 51:- use_module(class,
52 [
53 class_allvars/2
54 ]). 55:- use_module(geler,
56 [
57 project_nonlin/3
58 ]). 59:- use_module(redund,
60 [
61 redundancy_vars/1,
62 systems/3
63 ]). 64:- use_module(ordering,
65 [
66 arrangement/2
67 ]). 68
74project_attributes(TargetVars,Cvas) :-
75 sort(TargetVars,Tvs), 76 sort(Cvas,Avs), 77 get_clp(TargetVars,CLP),
78 ( nonvar(CLP)
79 -> mark_target(Tvs),
80 project_nonlin(Tvs,Avs,NlReachable),
81 ( Tvs == []
82 -> drop_lin_atts(Avs)
83 ; redundancy_vars(Avs), 84 make_target_indep(Tvs,Pivots), 85 mark_target(NlReachable), 86 drop_dep(Avs),
87 fm_elim(CLP,Avs,Tvs,Pivots),
88 impose_ordering(Avs)
89 )
90 ; true
91 ).
92
93fm_elim(clpq,Avs,Tvs,Pivots) :- fourmotz_q:fm_elim(Avs,Tvs,Pivots).
94fm_elim(clpr,Avs,Tvs,Pivots) :- fourmotz_r:fm_elim(Avs,Tvs,Pivots).
95
96get_clp([],_).
97get_clp([H|T],CLP) :-
98 ( get_attr(H,clpqr_itf,Att)
99 -> arg(1,Att,CLP)
100 ; true
101 ),
102 get_clp(T,CLP).
103
107
108mark_target([]).
109mark_target([V|Vs]) :-
110 ( get_attr(V,clpqr_itf,Att)
111 -> setarg(9,Att,target)
112 ; true
113 ),
114 mark_target(Vs).
115
121make_target_indep(Ts,Ps) :- make_target_indep(Ts,[],Ps).
122
128
129make_target_indep([],Ps,Ps).
130make_target_indep([T|Ts],Ps0,Pst) :-
131 ( get_attr(T,clpqr_itf,AttT),
132 arg(1,AttT,CLP),
133 arg(2,AttT,type(Type)),
134 arg(4,AttT,lin([_,_|H])),
135 nontarget(H,Nt)
136 -> Ps1 = [T:Nt|Ps0],
137 get_attr(Nt,clpqr_itf,AttN),
138 arg(2,AttN,type(IndAct)),
139 arg(5,AttN,order(Ord)),
140 arg(6,AttN,class(Class)),
141 setarg(11,AttN,keep),
142 pivot(CLP,T,Class,Ord,Type,IndAct)
143 ; Ps1 = Ps0
144 ),
145 make_target_indep(Ts,Ps1,Pst).
146
152
153nontarget([l(V*_,_)|Vs],Nt) :-
154 ( get_attr(V,clpqr_itf,Att),
155 arg(9,Att,n),
156 arg(10,Att,n)
157 -> Nt = V
158 ; nontarget(Vs,Nt)
159 ).
160
164
165drop_dep(Vs) :-
166 var(Vs),
167 !.
168drop_dep([]).
169drop_dep([V|Vs]) :-
170 drop_dep_one(V),
171 drop_dep(Vs).
172
178
179drop_dep_one(V) :-
180 get_attr(V,clpqr_itf,Att),
181 Att = t(CLP,type(t_none),_,lin(Lin),order(OrdV),_,_,n,n,_,n),
182 \+ indep(CLP,Lin,OrdV),
183 !,
184 setarg(2,Att,n),
185 setarg(3,Att,n),
186 setarg(4,Att,n),
187 setarg(5,Att,n),
188 setarg(6,Att,n).
189drop_dep_one(_).
190
191indep(clpq,Lin,OrdV) :- store_q:indep(Lin,OrdV).
192indep(clpr,Lin,OrdV) :- store_r:indep(Lin,OrdV).
193
194pivot(clpq,T,Class,Ord,Type,IndAct) :- bv_q:pivot(T,Class,Ord,Type,IndAct).
195pivot(clpr,T,Class,Ord,Type,IndAct) :- bv_r:pivot(T,Class,Ord,Type,IndAct).
196
197renormalize(clpq,Lin,New) :- store_q:renormalize(Lin,New).
198renormalize(clpr,Lin,New) :- store_r:renormalize(Lin,New).
199
204
205drop_lin_atts([]).
206drop_lin_atts([V|Vs]) :-
207 get_attr(V,clpqr_itf,Att),
208 setarg(2,Att,n),
209 setarg(3,Att,n),
210 setarg(4,Att,n),
211 setarg(5,Att,n),
212 setarg(6,Att,n),
213 drop_lin_atts(Vs).
214
215impose_ordering(Cvas) :-
216 systems(Cvas,[],Sys),
217 impose_ordering_sys(Sys).
218
219impose_ordering_sys([]).
220impose_ordering_sys([S|Ss]) :-
221 arrangement(S,Arr), 222 arrange(Arr,S),
223 impose_ordering_sys(Ss).
224
225arrange([],_).
226arrange(Arr,S) :-
227 Arr = [_|_],
228 class_allvars(S,All),
229 order(Arr,1,N),
230 order(All,N,_),
231 renorm_all(All),
232 arrange_pivot(All).
233
234order(Xs,N,M) :-
235 var(Xs),
236 !,
237 N = M.
238order([],N,N).
239order([X|Xs],N,M) :-
240 ( get_attr(X,clpqr_itf,Att),
241 arg(5,Att,order(O)),
242 var(O)
243 -> O = N,
244 N1 is N+1,
245 order(Xs,N1,M)
246 ; order(Xs,N,M)
247 ).
248
253
254renorm_all(Xs) :-
255 var(Xs),
256 !.
257renorm_all([X|Xs]) :-
258 ( get_attr(X,clpqr_itf,Att),
259 arg(1,Att,CLP),
260 arg(4,Att,lin(Lin))
261 -> renormalize(CLP,Lin,New),
262 setarg(4,Att,lin(New)),
263 renorm_all(Xs)
264 ; renorm_all(Xs)
265 ).
266
271
272arrange_pivot(Xs) :-
273 var(Xs),
274 !.
275arrange_pivot([X|Xs]) :-
276 ( get_attr(X,clpqr_itf,AttX),
277 278 arg(1,AttX,CLP),
279 arg(2,AttX,type(t_none)),
280 arg(4,AttX,lin(Lin)),
281 arg(5,AttX,order(OrdX)),
282 Lin = [_,_,l(Y*_,_)|_],
283 get_attr(Y,clpqr_itf,AttY),
284 arg(2,AttY,type(IndAct)),
285 arg(5,AttY,order(OrdY)),
286 arg(6,AttY,clpqr_class(Class)),
287 compare(>,OrdY,OrdX)
288 -> pivot(CLP,X,Class,OrdY,t_none,IndAct),
289 arrange_pivot(Xs)
290 ; arrange_pivot(Xs)
291 )