87 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | % arc-consistency | ||
|  | % thom fruehwirth, ECRC 941128, LMU 980312 | ||
|  | 
 | ||
|  | :- use_module( library(chr)). | ||
|  | :- use_module( library(lists), [member/2]). | ||
|  | 
 | ||
|  |    delete( X, [X|L],  L). | ||
|  |    delete( Y, [X|Xs], [X|Xt]) :- | ||
|  | 	delete( Y, Xs, Xt). | ||
|  | 
 | ||
|  | handler arc. | ||
|  | 
 | ||
|  | constraints dom/2, con/3. | ||
|  | % dom(X,D) variable X can take values from finite domain D, a ground list | ||
|  | % con(C,X,Y) there is a constraint C between variables X and Y | ||
|  | 
 | ||
|  | dom(X,[Y]) ==> X=Y.  % only to make unique solutions visible as bindings | ||
|  | 
 | ||
|  | con(C,X,Y) \ dom(X,XD), dom(Y,YD) <=>  | ||
|  | 	reduce(x_y,X,XD,Y,YD,C, NYD), | ||
|  | 	reduce(y_x,Y,YD,X,XD,C, NXD),  | ||
|  | 	\+ (XD=NXD,YD=NYD) | ||
|  | 	|  | ||
|  |         dom(X,NXD),dom(Y,NYD). | ||
|  | 
 | ||
|  |   reduce(CXY,X,XD,Y,YD,C, NYD):-    % try to reduce domain by one element | ||
|  | 	delete(GY,YD,NYD1), | ||
|  | 	\+ (member(GX,XD),test(CXY,C,GX,GY)) | ||
|  |         -> reduce(CXY,X,XD,Y,NYD1,C, NYD) | ||
|  |         ; | ||
|  | 	YD=NYD. | ||
|  | 
 | ||
|  |     test(x_y,C,GX,GY):- | ||
|  |         test(C,GX,GY). | ||
|  |     test(y_x,C,GX,GY):-              | ||
|  |         test(C,GY,GX). | ||
|  | 
 | ||
|  | 
 | ||
|  | % An Instance: Santa Claus Example (in German) | ||
|  | 
 | ||
|  | example([anna-Anna,berta-Berta,carola-Carola,carl-Carl]):- | ||
|  | 	dom(Anna,[laetzchen,schlafmuetze,filzpantoffel]), | ||
|  | 	dom(Berta,[laetzchen,schlafmuetze,filzpantoffel]), | ||
|  | 	dom(Carola,[laetzchen,schlafmuetze,filzpantoffel]), | ||
|  | 	dom(Carl,[schlafmuetze,filzpantoffel]),		 | ||
|  | 	con(mehr_als,Carl,Anna), | ||
|  | 	con(mehr_als,Berta,Carl), | ||
|  | 	con(mehr_als,Berta,Carola), | ||
|  | 	con(mindestens_wie,Berta,Carola), | ||
|  | 	con(gleich_wie,Carl,Carola). | ||
|  | 
 | ||
|  | test(mehr_als,Geschenk,Geschenk1) :-  | ||
|  |     preis(Geschenk,Preis), | ||
|  |     preis(Geschenk1,Preis1), | ||
|  |     Preis > Preis1. | ||
|  | 
 | ||
|  | test(mindestens_wie,Geschenk,Geschenk1) :- | ||
|  |     preis(Geschenk,Preis), | ||
|  |     preis(Geschenk1,Preis1), | ||
|  |     Preis >= Preis1. | ||
|  | 
 | ||
|  | test(gleich_wie,Geschenk,Geschenk1) :- | ||
|  |     preis(Geschenk,Preis), | ||
|  |     preis(Geschenk1,Preis). | ||
|  | 
 | ||
|  | preis(laetzchen,10). | ||
|  | preis(schlafmuetze,20). | ||
|  | preis(filzpantoffel,30). | ||
|  | 
 | ||
|  | % eof handler arc ------------------------------------- | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |