【发布时间】:2016-09-07 17:36:56
【问题描述】:
我正在尝试一个序言问题,说明如下:
幻方是由不同数字(1 到 9 之间)组成的 3×3 矩阵,使得所有行和列的总和都相同(但不一定是对角线)。例如:
2 7 6
9 5 1
4 3 8
是一个魔方。
我们将 Prolog 中的正方形表示为 3 × 3 矩阵,即列表 [R1, R2, R3] 的列表,其中每个 R_i 是三个数字的列表。例如,
上述幻方的表示是
[[2,7,6],[9,5,1],[4,3,8]]
定义一个谓词 magic/1 来测试一个地面 3 × 3 矩阵(即 其中所有条目都是数字)是一个魔方。
我是通过以下方式做到这一点的,如果我在考试中也这样做,我很确定这是允许的,但对我来说这似乎是一种 hack:
magic([[A,B,C], [D,E,F], [G,H,I]]) :-
Y is A + B + C,
Y is D + E + F,
Y is G + H + I,
Y is A + D + G,
Y is B + E + H,
Y is C + F + I.
我想要的方法是递归遍历外部列表中的每个列表,然后总结。对于外部列表中的每个列表,它们的总和应该是相同的值(我认为 15 实际上是这个“神奇”矩阵的唯一可能的解决方案)。同样,我对列做同样的事情(取每个列表的第一个、第二个和第三个并分别加起来)。但是,我不完全确定如何做后者,因为我没有经常使用列表列表。如果有人能就如何一般地完成这类计算给出一个简洁的解决方案,我将不胜感激。
谢谢
【问题讨论】: