/* Drinking game problem in Picat. From Marriott & Stuckey "Programming with Constraints", excercise page 184, drinking game Must drink if the time is divisible with 5 or 7 if there was no drinking the last 8 minutes. Result: drinking = [0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0] drinking_times = [5,14,25,35,45,55,65,75,84,95] numDrinks = 10 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> N = 100, % 100 time slots Drinking = new_list(N), % 1 if drinking time, 0 if not Drinking :: 0..1, Last8Min = new_list(N), Last8Min :: 0..8, NumDrinks #= sum(Drinking), foreach(T in 1..N) Last8Min[T] #= sum([Drinking[I] : I in max(T-8,1)..max(T-1,1)]) end, foreach(T in 1..N) ((T mod 5 #= 0 #\/ T mod 7 #= 0) #/\ Last8Min[T] #= 0) #<=> Drinking[T] #= 1 end, Vars = Drinking ++ Last8Min ++ [NumDrinks], solve(Vars), println(drinking=Drinking), println(drinking_times=[T : T in 1..N, Drinking[T] == 1]), % println(last8Min=Last8Min), println(numDrinks=NumDrinks), nl, fail, nl. go => true.