true.

weekday(mo). 
weekday(tu).
weekday(we).
weekday(th).
weekday(fr).
weekday(sa).
weekday(su).

succday(mo,tu).
succday(tu,we).
succday(we,th).
succday(th,fr).
succday(fr,sa).
succday(sa,su).
succday(su,mo).

shift(nite).
shift(day).
shift(aft).
shift(off).

emp(1).
emp(2).
emp(3).
emp(4).
emp(5).
emp(6).
emp(7).
emp(8).
emp(9).

succemp(1,2).
succemp(2,3).
succemp(3,4).
succemp(4,5).
succemp(5,6).
succemp(6,7).
succemp(7,8).
succemp(8,9).
succemp(9,1).

succnum(0,1).
succnum(1,2).
succnum(2,3).
succnum(3,4).
succnum(4,5).
succnum(5,6).
succnum(6,7).
succnum(7,8).
succnum(8,9).



succfield(Emp,Day, Emp, Sday) :- emp(Emp), succday(Day,Sday), Day!=su.
succfield(Emp,su, Semp, mo) :- succemp(Emp,Semp).

plan(Emp,Day,day) v plan(Emp,Day,nite) v plan(Emp,Day,aft) v plan(Emp,Day,off)  
 :-  emp(Emp), weekday(Day).

:- plan(Emp,Day,X), plan(Emp,Day,Y),  X!=Y.

count(Day,Shift,1,1) :- plan(1,Day,Shift).
count(Day,Shift,1,0) :- not plan(1,Day,Shift), weekday(Day), shift(Shift).
count(Day,Shift,Emp,Count) :- plan(Emp,Day,Shift), Emp!=1, succemp(Pemp,Emp),
                              count(Day,Shift,Pemp,Num), succnum(Num,Count).

count(Day,Shift,Emp,Count) :- weekday(Day), emp(Emp), shift(Shift), Emp!=1,
                              not plan(Emp,Day,Shift), 
                              succemp(Pemp,Emp),
                              count(Day,Shift,Pemp,Count).

:- count(Day,Shift,Emp,3), Shift!=off.
:- count(Day,Shift,Emp,4), Shift!=off.
:- count(Day,Shift,Emp,5), Shift!=off.
:- count(Day,Shift,Emp,6), Shift!=off.
:- count(Day,Shift,Emp,7), Shift!=off.
:- count(Day,Shift,Emp,8), Shift!=off.
:- count(Day,Shift,Emp,9), Shift!=off.
:- count(su,day,Emp,2).
:- count(su,aft,Emp,2).

tot(Day,Shift,Count) :- count(Day,Shift,9,Count).

:- require(Day,Shift,Numb), not tot(Day,Shift,Numb).

require(su,day,1) :- true.
require(su,aft,1) :- true.
require(su,nite,2) :- true.

require(Day,Shift,2) :- weekday(Day), shift(Shift), Day!=su, Shift!=off.


forbidden3(nite,off,day).
forbidden3(nite,off,aft).
forbidden3(aft,off,day).
forbidden2(nite,day).
forbidden2(nite,aft).
forbidden2(aft,day).

:- plan(Emp1,Day1,Shift1), plan(Emp2,Day2,Shift2), succfield(Emp1,Day1,Emp2,Day2),
   forbidden2(Shift1,Shift2).

:- plan(Emp1,Day1,Shift1), plan(Emp2,Day2,Shift2), plan(Emp3,Day3,Shift3),
   succfield(Emp1,Day1,Emp2,Day2), 
   succfield(Emp2,Day2,Emp3,Day3), 
   forbidden3(Shift1,Shift2,Shift3).



blocktype(Emp,Day,Shift,1):-succfield(Emp1,Day1,Emp,Day), 
                            plan(Emp1,Day1,Shift1),
                            plan(Emp,Day,Shift), Shift!=Shift1.

blocktype(Emp,Day,Shift,Count):-succfield(Emp1,Day1,Emp,Day), 
                            plan(Emp1,Day1,Shift),
                            plan(Emp,Day,Shift), blocktype(Emp1,Day1,Shift,Count1),
                            succnum(Count1,Count).



blocklength(Shift,Length):-succfield(Emp,Day,Emp1,Day1), 
                            plan(Emp1,Day1,Shift1),
                            plan(Emp,Day,Shift), Shift!=Shift1,
                            blocktype(Emp,Day,Shift,Length).


workfield(Emp,Day) :- plan(Emp,Day,Shift), Shift!=off.

workcount(Emp,Day,1) :- succfield(Emp1,Day1,Emp,Day), 
                        workfield(Emp,Day), plan(Emp1,Day1,off).
workcount(Emp,Day,Count) :- succfield(Emp1,Day1,Emp,Day), 
                            workfield(Emp1,Day1), 
                            workfield(Emp,Day),
                            workcount(Emp1,Day1,Count1),
                            succnum(Count1,Count).

worklength(Length):- succfield(Emp,Day,Emp1,Day1), 
                            workfield(Emp,Day), 
                            plan(Emp1,Day1,off),
                            workcount(Emp,Day,Length).


:- blocklength(day,1).


:- blocktype(Emp,Day,day,7).

 

:- blocklength(aft,1).

:- blocktype(Emp,Day,aft,6).


:- blocklength(nite,1).

:- blocktype(Emp,Day,nite,5).

:- blocklength(off,1).





:-workcount(Emp,Day,7).


:- blocktype(Emp,Day,off,5).


:- worklength(1).
:- worklength(2).
:- worklength(3).
















