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