% latin_squares.mzn
include "globals.mzn";
int: n = 3;
set of int: N = 1..n;
array[N, N] of var N: X;
constraint :: "ADRows"
forall (i in N)
(alldifferent(X[i,..]) :: "AD(row \(i))"
);
constraint :: "ADCols"
forall (j in N)
(alldifferent(X[..,j]) :: "AD(col \(j))"
);
constraint :: "LLRows"
forall (i in 1..n-1)
(lex_less(X[i,..], X[i+1,..]) :: "LL(rows \(i) \(i+1))"
);
constraint :: "LGCols"
forall (j in 1..n-1)
(lex_greater(X[..,j], X[..,j+1]) :: "LG(cols \(j) \(j+1))"
);
solve satisfy;
output [ show2d(X) ];