/* Global constraint maximum_modulo in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Cmaximum_modulo.html """ Constraint maximum_modulo(MAX,VARIABLES,M) Purpose MAX is a maximum value of the collection of domain variables VARIABLES according to the following partial ordering: (X mod M) <(Y mod M). Example (5, <9, 1, 7, 6, 5>, 3) The maximum_modulo constraint holds since its first argument MAX is set to value 5, where 5 mod 3=2 is greater than or equal to all the expressions 9 mod 3=0, 1 mod 3=1, 7 mod 3=1 and 6 mod 3=0. """ 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, TMax :: 1..9, M :: 1..9, Variables = [9,1,7,6,5], % Variables = [2,3,4,5,6], % TMax #= 5, M #= 3, maximum_modulo(TMax, Variables, M), Vars = Variables ++ [TMax, M], solve(Vars), println(variables=Variables), println(tmax=TMax), println(m=M), nl, fail, nl. go => true. maximum_modulo(TMax, Variables,M) => N = Variables.len, U = fd_max_array(Variables), ModArray = new_list(N), ModArray :: 0..U, ModMax :: 0..U, foreach(I in 1..N) ModArray[I] #= Variables[I] mod M end, ModMax #= max(ModArray), sum([ModArray[I] #= ModMax #/\ TMax #= Variables[I] : I in 1..N]) #>= 1. % % Maximum domain value in array X % fd_max_array(X) = max([fd_max(V) : V in X]).