/* Global constraint minimum_modulo in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Cminimum_modulo.html """ Constraint minimum_modulo(MIN,VARIABLES,M) Purpose MIN is a minimum value of the collection of domain variables VARIABLES according to the following partial ordering: (X mod M) < (Y mod M). Example (6,<9, 1, 7, 6, 5>, 3) (9,<9, 1, 7, 6, 5>, 3) The minimum_modulo constraints hold since MIN is respectively set to values 6 and 9, where 6 mod 3=0 and 9 mod 3=0 are both less than or equal to all the expressions 9 mod 3=0, 1 mod 3=1, 7 mod 3=1, 6 mod 3=0, and 5 mod 3=2. """ 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 = 5, Variables = new_list(N), Variables :: 1..9, TMin :: 1..9, M :: 2..9, Variables = [9,1,7,6,5], % TMin #= 6, % TMin #= 9, M #= 3, minimum_modulo(TMin, Variables, M), Vars = Variables ++ [TMin,M], solve(Vars), println(variables=Variables), println(tmin=TMin), println(m=M), nl, fail, nl. go => true. minimum_modulo(TMin,Variables,M) => N = Variables.len, U = fd_max_array(Variables), ModArray = new_list(N), ModArray :: 0..U, ModMin :: 0..U, foreach(I in 1..N) ModArray[I] #= Variables[I] mod M end, ModMin #= min(ModArray), sum([ModArray[I] #= ModMin #/\ TMin #= Variables[I] : I in 1..N]) #>= 1. fd_max_array(X) = max([fd_max(V) : V in X]).