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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |