/* Global constraint min_index (and the extension min_index_val) in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Cmin_index.html """ min_index(MIN_INDEX,VARIABLES) Purpose MIN_INDEX is the index of the variables corresponding to the minimum value of the collection of variables VARIABLES. Example ( 2,< index−1 var-3, index-2 var-2, index-3 var-7, index-4 var-2, index-5 var-6 > ) ( 4,< index-1 var-3, index-2 var-2, index-3 var-7, index-4 var-2, index-5 var-6 > ) The attribute var=2 of the second and fourth items of the collection VARIABLES is the minimum value over values 3,2,7,2,6. Consequently, both min_index constraints hold since their first arguments MIN_INDEX are respectively set to 2 and 4. """ 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. % % min_index/2 % go ?=> N = 5, Variables = new_list(N), Variables :: 1..7, MinInd :: 1..N, Variables = [3,2,7,2,6], min_index(MinInd, Variables), Vars = Variables ++ [MinInd], solve(Vars), println(variables=Variables), println(minInd=MinInd), nl, fail, nl. go => true. % % min_index_val/3 % go2 ?=> N = 5, Variables = new_list(N), Variables :: 1..7, MinInd :: 1..N, MinVal :: 1..7, Variables = [3,2,7,2,6], min_index_val(MinInd, Variables, MinVal), Vars = Variables ++ [MinInd,MinVal], solve(Vars), println(variables=Variables), println(minInd=MinInd), println(minval=MinVal), nl, fail, nl. go2 => true. % I assume that the indices are ordered and unique min_index(MI, X) => MinX #= min(X), sum([X[I] #= MinX #/\ MI #= I : I in 1..X.len]) #>= 1. % % An extension of max_index: also returns the maximum value % min_index_val(MI, X, Val) => MinX #= min(X), sum([X[I] #= MinX #/\ MI #= I #/\ Val #= X[I] : I in 1..X.len]) #>= 1.