56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | % solving linear polynomial equations by variable elimination a la Gauss | ||
|  | % thom fruehwirth 910610,911213,920124,930602,931223, 980311 | ||
|  | % 961107 christian holzbaur for SICStus CHR  | ||
|  | % complete for equalities, leaves equalities implicit, slow | ||
|  | % may loop if variables of the equations are unified | ||
|  | 
 | ||
|  | :- use_module(library(chr)). | ||
|  | :- ensure_loaded('math-utilities').		% load auxiliary file | ||
|  | 
 | ||
|  | handler gauss. | ||
|  | 
 | ||
|  | option(check_guard_bindings, on).  % for delete(X...) in rule eliminate | ||
|  | 
 | ||
|  | operator(100,xfx,equals). | ||
|  | 
 | ||
|  | constraints (equals)/2. | ||
|  | % Poly equals Const, where Poly is list of monomials Variable*Coefficient  | ||
|  | 
 | ||
|  | eliminate(X) @  | ||
|  | [X*Coeff1|P1] equals C1 \ P equals C2 <=> delete(X*Coeff2,P,P2) |  | ||
|  | 	is_div(Coeff2,Coeff1,C),  | ||
|  | 	mult_const(eq0(C1,P1),C,eq0(C1C,P1C)),	 | ||
|  |         add_eq0(eq0(C2,P2),eq0(C1C,P1C),eq0(C3,P3)), | ||
|  | 	P3 equals C3. | ||
|  | 
 | ||
|  | 
 | ||
|  | constraints {}/1.     | ||
|  | % curly brackets as wrapper to avoid name clash with built-in =:= | ||
|  | 
 | ||
|  | split @ { C, Cs } <=> { C }, { Cs }. | ||
|  | 
 | ||
|  | normalize @ {A =:= B} <=>  | ||
|  | 	normalize(A,B,Poly,Const),  | ||
|  | 	Poly equals Const.   	 | ||
|  | 
 | ||
|  | 
 | ||
|  | /* | ||
|  | % uses math_portray pretty print defined in math-utilities.pl | ||
|  | 
 | ||
|  | ?- {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}. | ||
|  | 
 | ||
|  | -(6*Z)=:=6, | ||
|  | -(35*Y)=:= -23, | ||
|  | X=:= -1.7142857142857144 ?  | ||
|  | 
 | ||
|  | ?- {3 * X + 2 * Y - 4 * (3 + Z) =:= 2 * (X - 3) + (Y + Z) * 7 ,       | ||
|  |     2 * (X + Y + Z) =:= 3 * (X - Y - Z)}. | ||
|  | 
 | ||
|  | -(6*Z)=:=6, | ||
|  | -(5*Y)+X=:= -5 ? | ||
|  | */ | ||
|  | 
 | ||
|  | /* end of file gauss.chr ------------------------------------------------*/ |