neg_overlap(Start,Duration,Time,Bool1,Bool2) :-
% if Bool1 is 1 then the task with start time Start and duration
% Duration starts after time point Time
Max1 is maxdiff(Time,Start-1),
eplex:(Time $=< Start-1+(1-Bool1)*Max1),
% if Bool2 is 1 then the task with start time Start and duration
% Duration is completed before time point Time
Max2 is maxdiff(Start+Duration,Time),
eplex:(Time+(1-Bool2)*Max2 $>= Start+Duration).
eplex_constraints_3(T,S1,S2,S3,B1,N1B1,N2B1,B2,N1B2,N2B2) :-
% task 1 with duration 3 and task 2 with duration 5 are both
% completed before the start time of task 3
before(S1,3,S3),
before(S2,5,S3),
% task 1 with duration 3 either overlaps time point Time,
% starts after it or is completed before it
pos_overlap(S1,3,T,B1),
neg_overlap(S1,3,T,N1B1,N2B1),
eplex:(N1B1+N2B1 $= 1-B1),
% task 2 with duration 5 either overlaps time point Time,
% starts after it or is completed before it
pos_overlap(S2,5,T,B2),
neg_overlap(S2,5,T,N1B2,N2B2),
eplex:(N1B2+N2B2 $= 1-B2),
% exactly one of task 1 with duration 3 and task 2 with
% duration 5 overlaps time point Time
eplex:(B1+B2 $= 1).
hybrid4(Time, [S1,S2,S3], End) :-
% give the eplex cost variable some default bounds
ic:(End $:: -1.0Inf..1.0Inf),
% we must give the start time of task 3 and the non-overlap
% booleans ic bounds in order to suspend on changes to them
ic:(S3::1..20),
ic:([N1B1,N2B1,N1B2,N2B2]::0..1),
% setup the problem constraints
ic_constraints(Time,S1,S2,B1,B2),
eplex_constraints_3(Time,S1,S2,S3,B1,N1B1,N2B1,B2,N1B2,N2B2),
% perform the optimisation
both_opt(labeling([B1,N1B1,N2B1,B2,N1B2,N2B2,S1,S2]),min(S3),End).