/* Global constraint among_interval in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Camong_interval.html """ NVAR is the number of variables of the collection VARIABLES taking a value that is located within interval [LOW, UP]. Example (3,〈4,5,8,4,1〉,3,5) The among_interval constraint holds since we have 3 values, namely 4, 5 and 4 that are situated within interval [3, 5]. """ 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, X = new_list(N), X :: 1..8, NVar :: 0..N, Low :: 1..N, Up :: 1..N, X = [4,5,8,4,1], % Low #= 3, % Up #= 5, NVar #= 3, among_interval(NVar, X, Low, Up), Vars = X ++ [NVar,Low,Up], solve(Vars), println(x=X), println(nvar=NVar), println(low=Low), println(up=Up), nl, fail, nl. go => true. among_interval(NVar, X, Low, Upper) => Low #<= Upper, NVar #= sum([X[I] #>= Low #/\ X[I] #<= Upper : I in 1..X.len]).