65 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								% 980312 Thom Fruehwirth, LMU
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(chr)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								handler scheduling.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								option(check_guard_bindings, on).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								constraints leq/2, optimize/0.
							 | 
						||
| 
								 | 
							
								% leq(X+N,Y) means: task X starts at least N time units before task Y
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% assumes leq-relation is non-circular
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								redundant @ leq(N,Y), leq(M,Y) <=> M=<N | leq(N,Y).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% optimize gives smallest possible value to a variable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								optimize @  optimize#Id \ leq(X,Y) <=> 
							 | 
						||
| 
								 | 
							
									ground(X),var(Y),findall_constraints(Y,leq(_,Y),L),L=[]
							 | 
						||
| 
								 | 
							
								        | 
							 | 
						||
| 
								 | 
							
									Y is X 
							 | 
						||
| 
								 | 
							
								        pragma passive(Id).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% classical example --------------------------------------
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								build_house([Start,A,B,C,D,E,F,G,H,I,J,End]) :-
							 | 
						||
| 
								 | 
							
									leq(Start+0,A),
							 | 
						||
| 
								 | 
							
									leq(A+7,B),
							 | 
						||
| 
								 | 
							
									leq(A+7,D),
							 | 
						||
| 
								 | 
							
									leq(B+3,C),
							 | 
						||
| 
								 | 
							
									leq(C+1,E),
							 | 
						||
| 
								 | 
							
									leq(D+8,E),
							 | 
						||
| 
								 | 
							
									leq(C+1,G),
							 | 
						||
| 
								 | 
							
									leq(D+8,G),
							 | 
						||
| 
								 | 
							
									leq(D+8,F),
							 | 
						||
| 
								 | 
							
									leq(C+1,F),
							 | 
						||
| 
								 | 
							
									leq(F+1,H),
							 | 
						||
| 
								 | 
							
									leq(H+3,I),
							 | 
						||
| 
								 | 
							
									leq(G+1,J),
							 | 
						||
| 
								 | 
							
									leq(E+2,J),
							 | 
						||
| 
								 | 
							
									leq(I+2,J),
							 | 
						||
| 
								 | 
							
									leq(J+1,End),
							 | 
						||
| 
								 | 
							
									optimize,
							 | 
						||
| 
								 | 
							
									Start=0.	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								| ?- build_house([Start,A,B,C,D,E,F,G,H,I,J,End]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A = 0,
							 | 
						||
| 
								 | 
							
								B = 7,
							 | 
						||
| 
								 | 
							
								C = 10,
							 | 
						||
| 
								 | 
							
								D = 7,
							 | 
						||
| 
								 | 
							
								E = 15,
							 | 
						||
| 
								 | 
							
								F = 15,
							 | 
						||
| 
								 | 
							
								G = 15,
							 | 
						||
| 
								 | 
							
								H = 16,
							 | 
						||
| 
								 | 
							
								I = 19,
							 | 
						||
| 
								 | 
							
								J = 21,
							 | 
						||
| 
								 | 
							
								End = 22,
							 | 
						||
| 
								 | 
							
								Start = 0,
							 | 
						||
| 
								 | 
							
								optimize ? 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								% end of handler scheduling
							 |