Prolog:在不使用clp(FD)的情况下查找所有3x3魔术方块

时间:2012-04-20 11:32:15

标签: prolog magic-square

我想找到所有可能的3x3魔方。

引自English wikipedia

  

魔方是一个不同数字的排列(即每个数字使用一次),通常是整数,在方格中,每行和每列中的数字,以及主对角线和次对角线中的数字,所有加起来相同的数字。

这是一个示例解决方案:

  

8 1 6
  3 5 7
  4 9 2

如何在不使用library(clpfd)的情况下编写能够找到所有解决方案的Prolog程序?

1 个答案:

答案 0 :(得分:3)

这是SWI-Prolog但不是clpfd的解决方案:

square(L) :-
    setof(S, carre(S), L).

carre(L) :-
    L = [[A, B, C],
         [D, E, F],
         [G, H, I]],
    flatten(L, LF),
    numlist(1,9, LN),
    init(LF, LN),
    15 is A + B + C,
    15 is D + E + F,
    15 is G + H + I,
    15 is A + D + G,
    15 is B + E + H,
    15 is C + F + I.

init([H|T], L) :-
    select(H, L, L1),
    init(T, L1).
init([], []).