148 lines
3.8 KiB
Perl
148 lines
3.8 KiB
Perl
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
% clp(q,r) version 1.3.3 %
|
||
|
% %
|
||
|
% (c) Copyright 1992,1993,1994,1995 %
|
||
|
% Austrian Research Institute for Artificial Intelligence (OFAI) %
|
||
|
% Schottengasse 3 %
|
||
|
% A-1010 Vienna, Austria %
|
||
|
% %
|
||
|
% File: dump.pl %
|
||
|
% Author: Christian Holzbaur christian@ai.univie.ac.at %
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
/*
|
||
|
dump( +Target, ?NewVars, ?CodedAnswer)
|
||
|
|
||
|
where Target and NewVars are lists of variables of equal length and
|
||
|
CodedAnswer is the term representation of the projection of constraints
|
||
|
onto the target variables where the target variables are replaced by
|
||
|
the corresponding variables from NewVars.
|
||
|
*/
|
||
|
|
||
|
:- use_module( library(terms), [term_variables/2]).
|
||
|
|
||
|
:- use_module( library(assoc),
|
||
|
[
|
||
|
empty_assoc/1,
|
||
|
get_assoc/3,
|
||
|
put_assoc/4,
|
||
|
assoc_to_list/2
|
||
|
]).
|
||
|
|
||
|
dump( Target, NewVars, Constraints) :-
|
||
|
(
|
||
|
( proper_varlist( Target) ->
|
||
|
true
|
||
|
;
|
||
|
raise_exception(instantiation_error(dump(Target,NewVars,Constraints),1))
|
||
|
),
|
||
|
ordering( Target),
|
||
|
related_linear_vars( Target, All),
|
||
|
nonlin_crux( All, Nonlin),
|
||
|
project_attributes( Target, All),
|
||
|
related_linear_vars( Target, Again), % project drops/adds vars
|
||
|
all_attribute_goals( Again, Gs, Nonlin),
|
||
|
empty_assoc( D0),
|
||
|
mapping( Target, NewVars, D0,D1), % late (AVL suffers from put_atts)
|
||
|
copy( Gs, Copy, D1,_), % strip constraints
|
||
|
bb_put( copy, NewVars/Copy),
|
||
|
fail % undo projection
|
||
|
;
|
||
|
bb_delete( copy, NewVars/Constraints) % garbage collect
|
||
|
).
|
||
|
|
||
|
proper_varlist( X) :- var( X), !, fail.
|
||
|
proper_varlist( []).
|
||
|
proper_varlist( [X|Xs]) :-
|
||
|
var( X),
|
||
|
proper_varlist( Xs).
|
||
|
|
||
|
related_linear_vars( Vs, All) :-
|
||
|
empty_assoc( S0),
|
||
|
related_linear_sys( Vs, S0,Sys),
|
||
|
related_linear_vars( Sys, All, []).
|
||
|
|
||
|
related_linear_sys( [], S0,L0) :- assoc_to_list( S0, L0).
|
||
|
related_linear_sys( [V|Vs], S0,S2) :-
|
||
|
( get_atts( V, class(C)) ->
|
||
|
put_assoc( C, S0, C, S1)
|
||
|
;
|
||
|
S1 = S0
|
||
|
),
|
||
|
related_linear_sys( Vs, S1,S2).
|
||
|
|
||
|
related_linear_vars( []) --> [].
|
||
|
related_linear_vars( [S-_|Ss]) -->
|
||
|
{
|
||
|
class_allvars( S, Otl)
|
||
|
},
|
||
|
cpvars( Otl),
|
||
|
related_linear_vars( Ss).
|
||
|
|
||
|
cpvars( Xs) --> {var(Xs)}, !.
|
||
|
cpvars( [X|Xs]) -->
|
||
|
( {var(X)} -> [X] ; [] ),
|
||
|
cpvars( Xs).
|
||
|
|
||
|
nonlin_crux( All, Gss) :-
|
||
|
collect_nonlin( All, Gs, []), % destructive
|
||
|
this_linear_solver( Solver),
|
||
|
nonlin_strip( Gs, Solver, Gss).
|
||
|
|
||
|
nonlin_strip( [], _, []).
|
||
|
nonlin_strip( [M:What|Gs], Solver, Res) :-
|
||
|
( M == Solver ->
|
||
|
( What = {G} ->
|
||
|
Res = [G|Gss]
|
||
|
;
|
||
|
Res = [What|Gss]
|
||
|
)
|
||
|
;
|
||
|
Res = Gss
|
||
|
),
|
||
|
nonlin_strip( Gs, Solver, Gss).
|
||
|
|
||
|
all_attribute_goals( []) --> [].
|
||
|
all_attribute_goals( [V|Vs]) -->
|
||
|
dump_linear( V, toplevel),
|
||
|
dump_nonzero( V, toplevel),
|
||
|
all_attribute_goals( Vs).
|
||
|
|
||
|
mapping( [], [], D0,D0).
|
||
|
mapping( [T|Ts], [N|Ns], D0,D2) :-
|
||
|
put_assoc( T, D0, N, D1),
|
||
|
mapping( Ts, Ns, D1,D2).
|
||
|
|
||
|
copy( Term, Copy, D0,D1) :- var( Term),
|
||
|
( get_assoc( Term, D0, New) ->
|
||
|
Copy = New,
|
||
|
D1 = D0
|
||
|
;
|
||
|
put_assoc( Term, D0, Copy, D1)
|
||
|
).
|
||
|
copy( Term, Copy, D0,D1) :- nonvar( Term),
|
||
|
functor( Term, N, A),
|
||
|
functor( Copy, N, A),
|
||
|
copy( A, Term, Copy, D0,D1).
|
||
|
|
||
|
copy( 0, _, _, D0,D0) :- !.
|
||
|
copy( 1, T, C, D0,D1) :- !,
|
||
|
arg( 1, T, At1),
|
||
|
arg( 1, C, Ac1),
|
||
|
copy( At1, Ac1, D0,D1).
|
||
|
copy( 2, T, C, D0,D2) :- !,
|
||
|
arg( 1, T, At1),
|
||
|
arg( 1, C, Ac1),
|
||
|
copy( At1, Ac1, D0,D1),
|
||
|
arg( 2, T, At2),
|
||
|
arg( 2, C, Ac2),
|
||
|
copy( At2, Ac2, D1,D2).
|
||
|
copy( N, T, C, D0,D2) :-
|
||
|
arg( N, T, At),
|
||
|
arg( N, C, Ac),
|
||
|
copy( At, Ac, D0,D1),
|
||
|
N1 is N-1,
|
||
|
copy( N1, T, C, D1,D2).
|
||
|
|
||
|
end_of_file.
|