158 lines
4.0 KiB
Perl
158 lines
4.0 KiB
Perl
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
% clp(q,r) version 1.3.2 %
|
||
|
% %
|
||
|
% (c) Copyright 1992,1993,1994,1995 %
|
||
|
% Austrian Research Institute for Artificial Intelligence (OFAI) %
|
||
|
% Schottengasse 3 %
|
||
|
% A-1010 Vienna, Austria %
|
||
|
% %
|
||
|
% File: redund.pl %
|
||
|
% Author: Christian Holzbaur christian@ai.univie.ac.at %
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
|
||
|
%
|
||
|
% redundancy removal (semantic definition)
|
||
|
%
|
||
|
% done:
|
||
|
% +) deal with active bounds
|
||
|
% +) indep t_[lu] -> t_none invalidates invariants (fixed)
|
||
|
%
|
||
|
|
||
|
%
|
||
|
% O(n^2), use sort later
|
||
|
%
|
||
|
systems( [], Si, Si).
|
||
|
systems( [V|Vs], Si, So) :-
|
||
|
( var(V), get_atts( V, class(C)),
|
||
|
not_memq( Si, C) ->
|
||
|
systems( Vs, [C|Si], So)
|
||
|
;
|
||
|
systems( Vs, Si, So)
|
||
|
).
|
||
|
|
||
|
not_memq( [], _).
|
||
|
not_memq( [Y|Ys], X) :-
|
||
|
X \== Y,
|
||
|
not_memq( Ys, X).
|
||
|
|
||
|
redundancy_systems( []).
|
||
|
redundancy_systems( [S|Sys]) :-
|
||
|
class_allvars( S, All),
|
||
|
redundancy_vs( All),
|
||
|
redundancy_systems( Sys).
|
||
|
|
||
|
redundancy_vars( Vs) :- !, redundancy_vs( Vs).
|
||
|
redundancy_vars( Vs) :-
|
||
|
statistics( runtime, [Start|_]),
|
||
|
redundancy_vs( Vs),
|
||
|
statistics( runtime, [End|_]),
|
||
|
Duration is End-Start,
|
||
|
format( user_error, "% Redundancy elimination took ~d msec~n", Duration).
|
||
|
|
||
|
|
||
|
%
|
||
|
% remove redundant bounds from variables
|
||
|
%
|
||
|
redundancy_vs( Vs) :- var( Vs), !.
|
||
|
redundancy_vs( []).
|
||
|
redundancy_vs( [V|Vs]) :-
|
||
|
( get_atts( V, [type(Type),strictness(Strict)]),
|
||
|
redundant( Type, V, Strict) ->
|
||
|
redundancy_vs( Vs)
|
||
|
;
|
||
|
redundancy_vs( Vs)
|
||
|
).
|
||
|
|
||
|
redundant( t_l(L), X, Strict) :-
|
||
|
detach_bounds( X), % drop temporarily
|
||
|
negate_l( Strict, L, X),
|
||
|
red_t_l.
|
||
|
redundant( t_u(U), X, Strict) :-
|
||
|
detach_bounds( X),
|
||
|
negate_u( Strict, U, X),
|
||
|
red_t_u.
|
||
|
redundant( t_lu(L,U), X, Strict) :-
|
||
|
strictness_parts( Strict, Sl, Su),
|
||
|
( put_atts( X, [type(t_u(U)),strictness(Su)]),
|
||
|
negate_l( Strict, L, X) ->
|
||
|
red_t_l,
|
||
|
( redundant( t_u(U), X, Strict) -> true ; true )
|
||
|
; put_atts( X, [type(t_l(L)),strictness(Sl)]),
|
||
|
negate_u( Strict, U, X) ->
|
||
|
red_t_u
|
||
|
;
|
||
|
true
|
||
|
).
|
||
|
redundant( t_L(L), X, Strict) :-
|
||
|
arith_eval( -L, Bound),
|
||
|
intro_at( X, Bound, t_none), % drop temporarily
|
||
|
detach_bounds( X),
|
||
|
negate_l( Strict, L, X),
|
||
|
red_t_L.
|
||
|
redundant( t_U(U), X, Strict) :-
|
||
|
arith_eval( -U, Bound),
|
||
|
intro_at( X, Bound, t_none), % drop temporarily
|
||
|
detach_bounds( X),
|
||
|
negate_u( Strict, U, X),
|
||
|
red_t_U.
|
||
|
redundant( t_Lu(L,U), X, Strict) :-
|
||
|
strictness_parts( Strict, Sl, Su),
|
||
|
( arith_eval( -L, Bound),
|
||
|
intro_at( X, Bound, t_u(U)),
|
||
|
put_atts( X, strictness(Su)),
|
||
|
negate_l( Strict, L, X) ->
|
||
|
red_t_l,
|
||
|
( redundant( t_u(U), X, Strict) -> true ; true )
|
||
|
; put_atts( X, [type(t_L(L)),strictness(Sl)]),
|
||
|
negate_u( Strict, U, X) ->
|
||
|
red_t_u
|
||
|
;
|
||
|
true
|
||
|
).
|
||
|
redundant( t_lU(L,U), X, Strict) :-
|
||
|
strictness_parts( Strict, Sl, Su),
|
||
|
( put_atts( X, [type(t_U(U)),strictness(Su)]),
|
||
|
negate_l( Strict, L, X) ->
|
||
|
red_t_l,
|
||
|
( redundant( t_U(U), X, Strict) -> true ; true )
|
||
|
; arith_eval( -U, Bound),
|
||
|
intro_at( X, Bound, t_l(L)),
|
||
|
put_atts( X, strictness(Sl)),
|
||
|
negate_u( Strict, U, X) ->
|
||
|
red_t_u
|
||
|
;
|
||
|
true
|
||
|
).
|
||
|
|
||
|
strictness_parts( Strict, Lower, Upper) :-
|
||
|
Lower is Strict /\ 2'10,
|
||
|
Upper is Strict /\ 2'01.
|
||
|
|
||
|
%
|
||
|
% encapsulation via \+ (unfolded to avoid metacall)
|
||
|
%
|
||
|
/**/
|
||
|
negate_l( 2'00, L, X) :- { L > X }, !, fail.
|
||
|
negate_l( 2'01, L, X) :- { L > X }, !, fail.
|
||
|
negate_l( 2'10, L, X) :- { L >= X }, !, fail.
|
||
|
negate_l( 2'11, L, X) :- { L >= X }, !, fail.
|
||
|
negate_l( _, _, _).
|
||
|
|
||
|
negate_u( 2'00, U, X) :- { U < X }, !, fail.
|
||
|
negate_u( 2'01, U, X) :- { U =< X }, !, fail.
|
||
|
negate_u( 2'10, U, X) :- { U < X }, !, fail.
|
||
|
negate_u( 2'11, U, X) :- { U =< X }, !, fail.
|
||
|
negate_u( _, _, _).
|
||
|
/**/
|
||
|
|
||
|
%
|
||
|
% profiling
|
||
|
%
|
||
|
red_t_l.
|
||
|
red_t_u.
|
||
|
red_t_L.
|
||
|
red_t_U.
|
||
|
|
||
|
|