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 ------------------------------------------------*/
							 |