65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | % Slim Abdennadher, Thom fruehwirth, LMU, July 1998 | ||
|  | % Straightforward Fourier Solver for linear inequations | ||
|  | % may loop because of producing more and mor eredundant equations | ||
|  | % compare to gauss.pl and fougau.pl | ||
|  | 
 | ||
|  | :- use_module(library(chr)). | ||
|  | :- ['math-utilities.pl'].           % load auxiliary file | ||
|  | :- use_module( library(lists), [member/2, memberchk/2,select/3]). | ||
|  | 
 | ||
|  | handler gauss. | ||
|  | 
 | ||
|  | option(check_guard_bindings, on).  % for delete(X...)  | ||
|  | option(already_in_store, off). | ||
|  | option(already_in_heads, off). | ||
|  | 
 | ||
|  | operator(100,xfx,leq). | ||
|  | 
 | ||
|  | constraints (leq)/2. | ||
|  | 
 | ||
|  | redundant @  | ||
|  | [X*Coeff1|P1] leq C1 \ P leq C2 <=>  | ||
|  |         delete(X*Coeff2,P,P2),  | ||
|  |         is_div(Coeff2,Coeff1,C), | ||
|  | 	C < 0, | ||
|  |         mult_const(eq0(C1,P1),C,eq0(C1C,P1C)),   | ||
|  |         add_eq0(eq0(C2,P2),eq0(C1C,P1C),eq0(C3,P3)), | ||
|  | 	P3=[], 0 >= C3 | ||
|  |         | | ||
|  |         true. | ||
|  | 
 | ||
|  | propagate(X) @  | ||
|  | [X*Coeff1|P1] leq C1, P leq C2 ==>  | ||
|  |         delete(X*Coeff2,P,P2),  | ||
|  |         is_div(Coeff2,Coeff1,C),  | ||
|  |         C > 0  | ||
|  |         |  | ||
|  |         mult_const(eq0(C1,P1),C,eq0(C1C,P1C)),   | ||
|  |         add_eq0(eq0(C2,P2),eq0(C1C,P1C),eq0(C3,P3)), | ||
|  |         P3 leq C3. | ||
|  | 
 | ||
|  | zero @ [] leq C1 <=> 0 =< C1. | ||
|  | 
 | ||
|  | 
 | ||
|  | constraints {}/1.     | ||
|  | % curly brackets as wrapper to avoid name clash with built-in =:= etc. | ||
|  | 
 | ||
|  | split @ { C, Cs } <=> { C }, { Cs }. | ||
|  | 
 | ||
|  | normalize @ {A >= B} <=> {B =< A}.   	 | ||
|  | normalize @ {A =:= B} <=> {A >= B}, {B =< A}.   	 | ||
|  | normalize @ {A =< B} <=>  | ||
|  | 	normalize(A,B,Poly,Const),  | ||
|  | 	Poly leq Const.   	 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* | ||
|  | 
 | ||
|  | 3 * X + 2 * Y - 4 * (3 + Z) =:= 2 * (X - 3) + (Y + Z) * 7 ,       | ||
|  |         2 * (X + Y + Z) =:= 3 * (X - Y - Z) ,  | ||
|  |         5 * (X + Y) - 7 * X - Z =:= (2 + 1 + X) * 6. | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |