(...->...;...)
must be true or false at modelling time!
% DO NOT USE THIS IN A MODEL no_overlap(S1,D1,S2,D2) :- S1 #>= S2 + D2. no_overlap(S1,D1,S2,D2) :- S2 #>= S1 + D1. |
B{0,1}
which represents
the choice.
The actual choice can be then be taken in search code by choosing a
value for the variable. The model code must then be changed to observe
the decision variable, either using the delay facility of ECLiPSe:
delay no_overlap(S1,D1,S2,D2,B) if var(B). no_overlap(S1,D1,S2,D2,0) :- S1 #>= S2 + D2. no_overlap(S1,D1,S2,D2,1) :- S2 #>= S1 + D1. |
no_overlap(S1,D1,S2,D2,B) :- B :: 0..1, S1 + B*1000 #>= S2 + D2, S2 + (1-B)*1000 #>= S1 + D1. |
..., no_overlap(S1,D2,S2,D2) infers most, ... |
nos(Res1, Res2, Start1, Dur1, Start2, Dur2) :- ( Res1 #= Res2 -> % WRONG!!! no_overlap(Start1, Dur1, Start2, Dur2) ; true ) |
delay nos(Res1, Res2, _, _, _, _) if nonground([Res1,Res2]). nos(Res1, Res2, Start1, Dur1, Start2, Dur2) :- ( Res1 == Res2 -> no_overlap(Start1, Dur1, Start2, Dur2) ; true ). |
nos(Res1, Res2, Start1, Dur1, Start2, Dur2) :- #=(Res1, Res2, Share), cond_no_overlap(Start1, Dur1, Start2, Dur2, Share). delay cond_no_overlap(_,_,_,_,Share) if var(Share). cond_no_overlap(Start1, Dur1, Start2, Dur2, Share) :- ( Share == 1 -> no_overlap(Start1, Dur1, Start2, Dur2) ; true ). |