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
|