【问题标题】:Prolog: Finding all 3x3 magic squares without using clp(FD)Prolog:在不使用 clp(FD) 的情况下查找所有 3x3 幻方
【发布时间】:2015-09-16 14:07:10
【问题描述】:

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

引用English wikipedia:

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

这是一个示例解决方案:

8 1 6
3 5 7
4 9 2

不使用library(clpfd),我如何编写一个能找到所有解决方案的 Prolog 程序?

【问题讨论】:

  • 你可以使用 SWI-Prolog 和库 clfpd 吗?

标签: prolog magic-square


【解决方案1】:

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

【讨论】:

  • 我在 carre(L) 中描述了你想要的东西,我让 Prolog 给我所有在 square(L) 中的解决方案。现在,什么是 L(in carre):它由在 1 和 9(谓词 init)之间选择的 9 个变量组成,我说所有的和都是 15。Prolog 使用回溯解决了这个问题。
猜你喜欢
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多