163 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/* time point constraints */
							 | 
						||
| 
								 | 
							
								% Thom Fruehwirth ECRC 1991-92, 931223, LMU 961028, 980312
							 | 
						||
| 
								 | 
							
								% 961105 Christian Holzbaur, SICStus mods
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library(chr)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								handler time_point.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								operator(700,xfy,'=<+').
							 | 
						||
| 
								 | 
							
								operator(700,xfy,'=<*').
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								constraints (=<+)/2, (=<*)/2.
							 | 
						||
| 
								 | 
							
								% A=<*Y=<*B means: time-point Y is between A and B which are positive numbers
							 | 
						||
| 
								 | 
							
								% C=<+Y-Z=<+D means: distance of timepoints Y and Z is between C and D whcih are positive numbers
							 | 
						||
| 
								 | 
							
								% start(X) means: time-point X has value zero
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								start(X):- 0=<*X=<*0.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inconsistent @
							 | 
						||
| 
								 | 
							
								A=<*X=<*B <=> A>B | fail.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								intersect @
							 | 
						||
| 
								 | 
							
								A=<*Y=<*B , C=<*Y=<*D <=> AC is max(A,C), BD is min(B,D), AC=<*Y=<*BD
							 | 
						||
| 
								 | 
							
								                         pragma already_in_heads.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								propagate_forward @
							 | 
						||
| 
								 | 
							
								A=<*Y=<*B,C=<+Y-Z=<+D ==> AC is A+C, BD is B+D, AC=<*Z=<*BD.
							 | 
						||
| 
								 | 
							
								propagate_backward @
							 | 
						||
| 
								 | 
							
								A=<*Y=<*B,C=<+Z-Y=<+D ==> AC is A-D, BD is B-C, AC=<*Z=<*BD.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% EXAMPLES using RANDOM GENERATOR ------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Park Miller rnd random generator
							 | 
						||
| 
								 | 
							
								% careful: 0,2147483647 is a fixpoint
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- setval( rnd, 2183).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								rand( X) :-
							 | 
						||
| 
								 | 
							
								        getval( rnd, X),
							 | 
						||
| 
								 | 
							
								        pm_randstep( X, Y),
							 | 
						||
| 
								 | 
							
								        setval( rnd, Y).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pm_randstep( State0, State1) :-
							 | 
						||
| 
								 | 
							
								        Hi is State0  // 44488,
							 | 
						||
| 
								 | 
							
								        Lo is State0 mod 44488,
							 | 
						||
| 
								 | 
							
								        Test is 48271*Lo - 3399*Hi,
							 | 
						||
| 
								 | 
							
								        ( Test > 0 -> State1=Test ; State1 is Test+2147483647 ).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pm_test :- pm_test( 10000, 1).
							 | 
						||
| 
								 | 
							
								pm_test( 0, S) :- !, S=399268537.
							 | 
						||
| 
								 | 
							
								pm_test( N, S) :-
							 | 
						||
| 
								 | 
							
								        N1 is N-1,
							 | 
						||
| 
								 | 
							
								        pm_randstep( S, T),
							 | 
						||
| 
								 | 
							
								        pm_test( N1, T).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% random example generator
							 | 
						||
| 
								 | 
							
								% M is number of constraints randomly generated
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test(M):- N is M+1,
							 | 
						||
| 
								 | 
							
									length(L,N),
							 | 
						||
| 
								 | 
							
								        getval( rnd, Seed),
							 | 
						||
| 
								 | 
							
								        print( redo_with(Seed)), nl,
							 | 
						||
| 
								 | 
							
									L=[X|_],
							 | 
						||
| 
								 | 
							
									start(X),
							 | 
						||
| 
								 | 
							
									gen_cnstr(L,1),
							 | 
						||
| 
								 | 
							
									all_cnstr(L,2).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gen_cnstr([],_).
							 | 
						||
| 
								 | 
							
								gen_cnstr([_],_).
							 | 
						||
| 
								 | 
							
								gen_cnstr([X,Y|L],N):- cnstr(N,A,B),
							 | 
						||
| 
								 | 
							
									        write(A=<+X-Y=<+B),nl,
							 | 
						||
| 
								 | 
							
								                A=<+X-Y=<+B,
							 | 
						||
| 
								 | 
							
								                gen_cnstr([Y|L],N).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cnstr(N,A,B):- rand(I), A is I mod (20*N), rand(J), B is J mod (20*N) + 10.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								all_cnstr([],_).
							 | 
						||
| 
								 | 
							
								all_cnstr([_],_).
							 | 
						||
| 
								 | 
							
								all_cnstr(L,N):-
							 | 
						||
| 
								 | 
							
									L=[_,_|_], random_list(L,L1), gen_cnstr(L1,N), M is N+1,
							 | 
						||
| 
								 | 
							
									all_cnstr(L1,M).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								random_list([],[]).
							 | 
						||
| 
								 | 
							
								random_list([N|L],R):- rand(X), 0 is (X mod 3), !, random_list(L,R).
							 | 
						||
| 
								 | 
							
								random_list([N|L],[N|R]):- random_list(L,R).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								% More Examples
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- start(X),3=<+X-Y=<+10,4=<+Y-Z=<+5.  
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								0=<*X=<*0,
							 | 
						||
| 
								 | 
							
								3=<+X-Y=<+10,
							 | 
						||
| 
								 | 
							
								3=<*Y=<*10,
							 | 
						||
| 
								 | 
							
								4=<+Y-Z=<+5,
							 | 
						||
| 
								 | 
							
								7=<*Z=<*15 ?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- start(E),
							 | 
						||
| 
								 | 
							
								10 =<+ E - F =<+ 20,
							 | 
						||
| 
								 | 
							
								10 =<+ H - G =<+ 20,
							 | 
						||
| 
								 | 
							
								30 =<+ F - G =<+ 40,
							 | 
						||
| 
								 | 
							
								40 =<+ H - I =<+ 50,
							 | 
						||
| 
								 | 
							
								60 =<+ E - I =<+ 70.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								0=<*E=<*0,
							 | 
						||
| 
								 | 
							
								10=<+E-F=<+20,
							 | 
						||
| 
								 | 
							
								10=<*F=<*20,
							 | 
						||
| 
								 | 
							
								10=<+H-G=<+20,
							 | 
						||
| 
								 | 
							
								30=<+F-G=<+40,
							 | 
						||
| 
								 | 
							
								40=<+H-I=<+50,
							 | 
						||
| 
								 | 
							
								60=<+E-I=<+70,
							 | 
						||
| 
								 | 
							
								60=<*I=<*70,
							 | 
						||
| 
								 | 
							
								20=<*H=<*30,
							 | 
						||
| 
								 | 
							
								40=<*G=<*50 ?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- start(E),
							 | 
						||
| 
								 | 
							
								10 =<+ E - F =<+ 20,
							 | 
						||
| 
								 | 
							
								10 =<+ H - G =<+ 20,
							 | 
						||
| 
								 | 
							
								30 =<+ F - G =<+ 40,
							 | 
						||
| 
								 | 
							
								40 =<+ H - I =<+ 50,
							 | 
						||
| 
								 | 
							
								60 =<+ E - I =<+ 120.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								0=<*E=<*0,
							 | 
						||
| 
								 | 
							
								10=<+E-F=<+20,
							 | 
						||
| 
								 | 
							
								10=<*F=<*20,
							 | 
						||
| 
								 | 
							
								10=<+H-G=<+20,
							 | 
						||
| 
								 | 
							
								30=<+F-G=<+40,
							 | 
						||
| 
								 | 
							
								40=<*G=<*60,
							 | 
						||
| 
								 | 
							
								20=<*H=<*50,
							 | 
						||
| 
								 | 
							
								40=<+H-I=<+50,
							 | 
						||
| 
								 | 
							
								60=<*I=<*100,
							 | 
						||
| 
								 | 
							
								60=<+E-I=<+120 ? 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- start(E),
							 | 
						||
| 
								 | 
							
								10 =<+ E - F =<+ 20,
							 | 
						||
| 
								 | 
							
								10 =<+ H - G =<+ 20,
							 | 
						||
| 
								 | 
							
								30 =<+ F - G =<+ 40,
							 | 
						||
| 
								 | 
							
								40 =<+ H - I =<+ 50,
							 | 
						||
| 
								 | 
							
								50 =<+ E - I =<+ 60.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								0=<*E=<*0,
							 | 
						||
| 
								 | 
							
								10=<+E-F=<+20,
							 | 
						||
| 
								 | 
							
								10=<+H-G=<+20,
							 | 
						||
| 
								 | 
							
								30=<+F-G=<+40,
							 | 
						||
| 
								 | 
							
								40=<+H-I=<+50,
							 | 
						||
| 
								 | 
							
								50=<+E-I=<+60,
							 | 
						||
| 
								 | 
							
								60=<*I=<*60,
							 | 
						||
| 
								 | 
							
								20=<*H=<*20,
							 | 
						||
| 
								 | 
							
								40=<*G=<*40,
							 | 
						||
| 
								 | 
							
								10=<*F=<*10 ? 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- start(A),14.3=<+A-B=<+17.5, 14.3=<+A-B=<+16.3, 12.2=<+B-C=<+14.5.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								14.3=<+A-B=<+17.5,
							 | 
						||
| 
								 | 
							
								0.0=<*A=<*0.0,
							 | 
						||
| 
								 | 
							
								14.3=<+A-B=<+16.3,
							 | 
						||
| 
								 | 
							
								14.3=<*B=<*16.3,
							 | 
						||
| 
								 | 
							
								12.2=<+B-C=<+14.5,
							 | 
						||
| 
								 | 
							
								26.5=<*C=<*30.8 ? 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 |