which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| % 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 ------------------------------------------------*/
 |