/* Benjamin Franklin's 8x8 Magic Square in Picat. Problem formulation from the Formula One model: http://www.f1compiler.com/samples/Franklin%27s%208x8%20Magic%20Square.f1.html """ In 2006 in the article published online by the Proceedings of the Royal Society "Enumerating the bent diagonal squares of Dr Benjamin Franklin FRS" by Daniel Schindel, Matthew Rempel and Peter Loly the authors showed there are 1,105,920 variations of his magic square. (http://www.physics.umanitoba.ca/news/loly_paper.pdf) """ Also, see e.g. http://www.mathpages.com/home/kmath155.htm The following is a simple translation of the F1 model to Picat (via MiniZinc). Note: I have not checked that this model generates exactly 1,105,920 solutions. 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 ?=> magic_square(A), foreach(Row in A) println(Row) end, nl, fail, nl. go => true. go2 => Count = count_all(magic_square(_A)), println(count=Count), nl. magic_square(A) => N = 8, Sum = 260, Sum2 = Sum div 2, % an array of 64 variables of an 8x8 square A = [[A1, A2, A3, A4, A5, A6, A7, A8], [B1, B2, B3, B4, B5, B6, B7, B8], [C1, C2, C3, C4, C5, C6, C7, C8], [D1, D2, D3, D4, D5, D6, D7, D8], [E1, E2, E3, E4, E5, E6, E7, E8], [F1, F2, F3, F4, F5, F6, F7, F8], [G1, G2, G3, G4, G5, G6, G7, G8], [H1, H2, H3, H4, H5, H6, H7, H8]], A :: 1..64, foreach(I in 1..N) all_different([A[I,J] : J in 1..N]) end, foreach(J in 1..N) all_different([A[I,J] : I in 1..N]) end, % constraints to remove symmetries. these have nothing to do % with the Benjamin Franklin's constraints. A1 #> A8, A1 #> H1, A1 #> H8, A8 #> H1, % half rows and half columns (32 constraints) A1 + A2 + A3 + A4 #= Sum2, B1 + B2 + B3 + B4 #= Sum2, C1 + C2 + C3 + C4 #= Sum2, D1 + D2 + D3 + D4 #= Sum2, A1 + B1 + C1 + D1 #= Sum2, A2 + B2 + C2 + D2 #= Sum2, A3 + B3 + C3 + D3 #= Sum2, A4 + B4 + C4 + D4 #= Sum2, A5 + A6 + A7 + A8 #= Sum2, B5 + B6 + B7 + B8 #= Sum2, C5 + C6 + C7 + C8 #= Sum2, D5 + D6 + D7 + D8 #= Sum2, A5 + B5 + C5 + D5 #= Sum2, A6 + B6 + C6 + D6 #= Sum2, A7 + B7 + C7 + D7 #= Sum2, A8 + B8 + C8 + D8 #= Sum2, E1 + F1 + G1 + H1 #= Sum2, E2 + F2 + G2 + H2 #= Sum2, E3 + F3 + G3 + H3 #= Sum2, E4 + F4 + G4 + H4 #= Sum2, E1 + E2 + E3 + E4 #= Sum2, F1 + F2 + F3 + F4 #= Sum2, G1 + G2 + G3 + G4 #= Sum2, H1 + H2 + H3 + H4 #= Sum2, E5 + E6 + E7 + E8 #= Sum2, F5 + F6 + F7 + F8 #= Sum2, G5 + G6 + G7 + G8 #= Sum2, H5 + H6 + H7 + H8 #= Sum2, E5 + F5 + G5 + H5 #= Sum2, E6 + F6 + G6 + H6 #= Sum2, E7 + F7 + G7 + H7 #= Sum2, E8 + F8 + G8 + H8 #= Sum2, % bent diagonals (8 constraints for each directions) % 8 7 6 5 4 3 2 1 % 7 6 5 4 3 2 1 8 % 6 5 4 3 2 1 8 7 % 5 4 3 2 1 8 7 6 % 5 4 3 2 1 8 7 6 % 6 5 4 3 2 1 8 7 % 7 6 5 4 3 2 1 8 % 1 7 6 5 4 3 2 1 % < A8 + B7 + C6 + D5 + E5 + F6 + G7 + H8 #= Sum, A7 + B6 + C5 + D4 + E4 + F5 + G6 + H7 #= Sum, A6 + B5 + C4 + D3 + E3 + F4 + G5 + H6 #= Sum, A5 + B4 + C3 + D2 + E2 + F3 + G4 + H5 #= Sum, A4 + B3 + C2 + D1 + E1 + F2 + G3 + H4 #= Sum, A3 + B2 + C1 + D8 + E8 + F1 + G2 + H3 #= Sum, A2 + B1 + C8 + D7 + E7 + F8 + G1 + H2 #= Sum, A1 + B8 + C7 + D6 + E6 + F7 + G8 + H1 #= Sum, % the four entries in every 2x2 subsquare sum to 130. % 8x8 #= 64 constraints A1 + A2 + B1 + B2 #= Sum2, A2 + A3 + B2 + B3 #= Sum2, A3 + A4 + B3 + B4 #= Sum2, A4 + A5 + B4 + B5 #= Sum2, A5 + A6 + B5 + B6 #= Sum2, A6 + A7 + B6 + B7 #= Sum2, A7 + A8 + B7 + B8 #= Sum2, A8 + A1 + B8 + B1 #= Sum2, % wrAp B1 + B2 + C1 + C2 #= Sum2, B2 + B3 + C2 + C3 #= Sum2, B3 + B4 + C3 + C4 #= Sum2, B4 + B5 + C4 + C5 #= Sum2, B5 + B6 + C5 + C6 #= Sum2, B6 + B7 + C6 + C7 #= Sum2, B7 + B8 + C7 + C8 #= Sum2, B8 + B1 + C8 + C1 #= Sum2, % wrAp C2 + C3 + D2 + D3 #= Sum2, C3 + C4 + D3 + D4 #= Sum2, C4 + C5 + D4 + D5 #= Sum2, C5 + C6 + D5 + D6 #= Sum2, C6 + C7 + D6 + D7 #= Sum2, C7 + C8 + D7 + D8 #= Sum2, C8 + C1 + D8 + D1 #= Sum2, % wrAp D1 + D2 + E1 + E2 #= Sum2, D2 + D3 + E2 + E3 #= Sum2, D3 + D4 + E3 + E4 #= Sum2, D4 + D5 + E4 + E5 #= Sum2, D5 + D6 + E5 + E6 #= Sum2, D6 + D7 + E6 + E7 #= Sum2, D7 + D8 + E7 + E8 #= Sum2, D8 + D1 + E8 + E1 #= Sum2, % wrAp E1 + E2 + F1 + F2 #= Sum2, E2 + E3 + F2 + F3 #= Sum2, E3 + E4 + F3 + F4 #= Sum2, E4 + E5 + F4 + F5 #= Sum2, E5 + E6 + F5 + F6 #= Sum2, E6 + E7 + F6 + F7 #= Sum2, E7 + E8 + F7 + F8 #= Sum2, E8 + E1 + F8 + F1 #= Sum2, % wrAp F1 + F2 + G1 + G2 #= Sum2, F2 + F3 + G2 + G3 #= Sum2, F3 + F4 + G3 + G4 #= Sum2, F4 + F5 + G4 + G5 #= Sum2, F5 + F6 + G5 + G6 #= Sum2, F6 + F7 + G6 + G7 #= Sum2, F7 + F8 + G7 + G8 #= Sum2, F8 + F1 + G8 + G1 #= Sum2, % wrAp G1 + G2 + H1 + H2 #= Sum2, G2 + G3 + H2 + H3 #= Sum2, G3 + G4 + H3 + H4 #= Sum2, G4 + G5 + H4 + H5 #= Sum2, G5 + G6 + H5 + H6 #= Sum2, G6 + G7 + H6 + H7 #= Sum2, G7 + G8 + H7 + H8 #= Sum2, G8 + G1 + H8 + H1 #= Sum2, % wrAp H1 + H2 + A1 + A2 #= Sum2, H2 + H3 + A2 + A3 #= Sum2, H3 + H4 + A3 + A4 #= Sum2, H4 + H5 + A4 + A5 #= Sum2, H5 + H6 + A5 + A6 #= Sum2, H6 + H7 + A6 + A7 #= Sum2, H7 + H8 + A7 + A8 #= Sum2, H8 + H1 + A8 + A1 #= Sum2, % wrAp % bent diagonals (8 constraints for each directions) % 1 8 7 6 6 7 8 1 % 2 1 8 7 7 8 1 2 % 3 2 1 8 8 1 2 3 % 4 3 2 1 1 2 3 4 % 5 4 3 2 2 3 4 5 % 6 5 4 3 3 4 5 6 % 7 6 5 4 4 5 6 7 % 8 7 6 5 5 6 7 8 % \/ A1 + B2 + C3 + D4 + D5 + C6 + B7 + A8 #= Sum, B1 + C2 + D3 + E4 + E5 + D6 + C7 + B8 #= Sum, C1 + D2 + E3 + F4 + F5 + E6 + D7 + C8 #= Sum, D1 + E2 + F3 + G4 + G5 + F6 + E7 + D8 #= Sum, E1 + F2 + G3 + H4 + H5 + G6 + F7 + E8 #= Sum, F1 + G2 + H3 + A4 + A5 + H6 + G7 + F8 #= Sum, G1 + H2 + A3 + B4 + B5 + A6 + H7 + G8 #= Sum, H1 + A2 + B3 + C4 + C5 + B6 + A7 + H8 #= Sum, % bent diagonals (8 constraints for each directions) % 8 7 6 5 5 6 7 8 % 7 6 5 4 4 5 6 7 % 6 5 4 3 3 4 5 6 % 5 4 3 2 2 3 4 5 % 4 3 2 1 1 2 3 4 % 3 2 1 8 8 1 2 3 % 2 1 8 7 7 8 1 2 % 1 8 7 6 6 7 8 1 % , H1 + G2 + F3 + E4 + E5 + F6 + G7 + H8 #= Sum, G1 + F2 + E3 + D4 + D5 + E6 + F7 + G8 #= Sum, F1 + E2 + D3 + C4 + C5 + D6 + E7 + F8 #= Sum, E1 + D2 + C3 + B4 + B5 + C6 + D7 + E8 #= Sum, D1 + C2 + B3 + A4 + A5 + B6 + C7 + D8 #= Sum, C1 + B2 + A3 + H4 + H5 + A6 + B7 + C8 #= Sum, B1 + A2 + H3 + G4 + G5 + H6 + A7 + B8 #= Sum, A1 + H2 + G3 + F4 + F5 + G6 + H7 + A8 #= Sum, % bent diagonals (8 constraints for each directions) % 1 2 3 4 5 6 7 8 % 8 1 2 3 4 5 6 7 % 7 8 1 2 3 4 5 6 % 6 7 8 1 2 3 4 5 % 6 7 8 1 2 3 4 5 % 7 8 1 2 3 4 5 6 % 8 1 2 3 4 5 6 7 % 1 2 3 4 5 6 7 8 % #> A1 + B2 + C3 + D4 + E4 + F3 + G2 + H1 #= Sum, A2 + B3 + C4 + D5 + E5 + F4 + G3 + H2 #= Sum, A3 + B4 + C5 + D6 + E6 + F5 + G4 + H3 #= Sum, A4 + B5 + C6 + D7 + E7 + F6 + G5 + H4 #= Sum, A5 + B6 + C7 + D8 + E8 + F7 + G6 + H5 #= Sum, A6 + B7 + C8 + D1 + E1 + F8 + G7 + H6 #= Sum, A7 + B8 + C1 + D2 + E2 + F1 + G8 + H7 #= Sum, A8 + B1 + C2 + D3 + E3 + F2 + G1 + H8 #= Sum, solve(A.vars).