Prolog 序言:不使用clp(FD)查找所有3x3幻方

Prolog 序言:不使用clp(FD)查找所有3x3幻方,prolog,magic-square,Prolog,Magic Square,我想找到所有可能的3x3魔方 引述自: 幻方是不同数字(即每个数字使用一次)的排列,通常是整数,在方格中,每行、每列中的数字以及主对角线和次对角线中的数字加起来都是相同的数字 以下是一个示例解决方案: 816 357 4 9 2 如果不使用库(clpfd),我如何编写一个Prolog程序来查找所有解决方案?这里有一个使用SWI-Prolog但不使用clpfd的解决方案: square(L) :- setof(S, carre(S), L). carre(L) :- L = [[

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

引述自:

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

以下是一个示例解决方案:

816
357
4 9 2


如果不使用
库(clpfd)
,我如何编写一个Prolog程序来查找所有解决方案?

这里有一个使用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([], []).

以下是使用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([], []).

你能使用SWI Prolog和库clfpd吗?你能使用SWI Prolog和库clfpd吗?我在carre(L)中描述了你想要什么,我要求Prolog给我平方(L)中的所有解决方案。现在,什么是L(在carre中):它由9个变量组成,这些变量选择在1和9之间(谓词init),我说所有的和都是15。Prolog用回溯法解决了这个问题。我在carre(L)中描述了你想要什么,我要求Prolog用square(L)给出所有的解决方案。现在,什么是L(在carre中):它由9个变量组成,这些变量选择在1和9之间(谓词init),我说所有的和都是15。Prolog使用回溯解决了这个问题。