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 ?
|
||
|
|
||
|
*/
|