1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | % % All interval problem in MiniZinc. % % Different approaches inspired by % http://www.dis.uniroma1.it/~tmancini/index.php?currItem=research.publications.webappendices.csplib2x.problemDetails&problemid=007 % % Also see % % % Model created by Hakan Kjellerstrand, hakank@gmail.com % See also my MiniZinc page: http://www.hakank.org/minizinc % % Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ int : n= 12; set of int : classes = 0 .. n - 1; set of int : differ = 1 .. n - 1; % Search space: The set of permutations of integer range [0..n-1] array [classes] of var classes: series; array [differ] of var differ: differences; solve satisfy ; constraint % C1: Each pitch class occurs exactly once forall(i,j in classes where i != j) ( series[i] != series[j] ) /\ % C2: Differences between neighbouring notes are all different % AUX: Addition of auxiliary predicates % Auxiliary predicate stores the interval between pairs of neighbouring notes forall(i in 1 .. n - 2) ( differences[i]= abs (series[i + 1] - series[i]) ) /\ forall(i,j in differ where i != j) ( differences[i] != differences[j] ) ; output [ show (series) ]; |