/* Global constraint arith_sliding in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Carith_sliding.html """ Enforce for all sequences of variables var1, var2, ..., vari of the VARIABLES collection to have (var1+var2+...+vari) RELOP VALUE. Example ( < var-0, var-0, var-1, var-2, var-0, var-0, var--3 >, <, 4 ) The arith_sliding constraint holds since all the following seven inequalities hold: * 0 < 4, * 0+0 <4, * 0+0+1 <4, * 0+0+1+2 <4, * 0+0+1+2+0 <4, * 0+0+1+2+0+0 <4, * 0+0+1+2+0+0-3 <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. go ?=> X = [0,0,1,2,0,0,-3], % X = new_list(7), % X :: -3..3, Z :: 0..9, arith_sliding(X,#=<,Z), solve([Z]), println(Z), fail, nl. go => true. go2 => X = new_list(7), X :: [-2,-1,1,2], Z :: 0..4, increasing(X), arith_sliding(X,#>,Z), solve(X++[Z]), println(x=X), println(z=Z), fail, nl. arith_sliding(X, Relop, Z) => foreach(I in 1..X.length) S #= sum([X[J] : J in 1..I]), call(Relop,S,Z) end. increasing(X) => foreach(I in 2..X.length) X[I-1] #=< X[I] end.