49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								% simple constraint solver for inequalities between variables
							 | 
						||
| 
								 | 
							
								% thom fruehwirth ECRC 950519, LMU 980207, 980311
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module( library(chr)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								handler leq.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								constraints leq/2.
							 | 
						||
| 
								 | 
							
								% X leq Y means variable X is less-or-equal to variable Y
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- op(500, xfx, leq).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								reflexivity  @ X leq X <=> true.
							 | 
						||
| 
								 | 
							
								antisymmetry @ X leq Y , Y leq X <=> X=Y.
							 | 
						||
| 
								 | 
							
								idempotence  @ X leq Y \ X leq Y <=> true.
							 | 
						||
| 
								 | 
							
								transitivity @ X leq Y , Y leq Z ==> X leq Z.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								% more efficient, less propagating version using pragma passive
							 | 
						||
| 
								 | 
							
								reflexivity  @ X leq X <=> true.
							 | 
						||
| 
								 | 
							
								antisymmetry @ X leq Y , Y leq X # Id <=> X=Y pragma passive(Id).
							 | 
						||
| 
								 | 
							
								idempotence  @ X leq Y # Id \ X leq Y <=> true pragma passive(Id).
							 | 
						||
| 
								 | 
							
								transitivity @ X leq Y # Id , Y leq Z ==> X leq Z pragma passive(Id).
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% this generates a circular leq-relation chain with N variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								time(N):-
							 | 
						||
| 
								 | 
							
									cputime(X),
							 | 
						||
| 
								 | 
							
									length(L,N),
							 | 
						||
| 
								 | 
							
									genleq(L,Last),
							 | 
						||
| 
								 | 
							
									L=[First|_],
							 | 
						||
| 
								 | 
							
									Last leq First,
							 | 
						||
| 
								 | 
							
									cputime( Now),
							 | 
						||
| 
								 | 
							
									Time is Now-X,
							 | 
						||
| 
								 | 
							
									write(N-Time), nl.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  genleq([Last],Last).
							 | 
						||
| 
								 | 
							
								  genleq([X,Y|Xs],Last):-
							 | 
						||
| 
								 | 
							
									X leq Y,
							 | 
						||
| 
								 | 
							
									genleq([Y|Xs],Last).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cputime( Ts) :- 
							 | 
						||
| 
								 | 
							
									statistics( runtime, [Tm,_]),
							 | 
						||
| 
								 | 
							
									Ts is Tm/1000.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% eof handler leq -----------------------------------------------
							 |