检查二维数组中每一行和每一列中的重复值

时间:2019-05-15 09:42:50

标签: prolog

我正在阅读PrologHitori上的一个游戏的PDF注释,我看到了以下代码

abr([]).
abr([_]):-!.
abr([C, C|Cs]):- C \= 0, abr([C|Cs]).
abr([C1, C2|Cs]):- C1 \= C2, abr([C2|Cs]).

abs([]):- !.
abs([Cs|Css]):- abr(Cs), !, abs(Css).

ab(P):- transpose(C, Ccol), abs(C), abs(Ccol).

P arg代表2D数组及其初始值

-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1

以及P每次都会更改其值,因此它可以测试是否可以用zero替换元素

实际上我无法获得以上代码,但我认为它会检查将元素更改为zero的有效性

所以我的问题是上面的代码做什么?

1 个答案:

答案 0 :(得分:0)

首先,ab谓词的变量应为C而不是P

ab/1谓词采用以下形式的整数平方矩阵作为输入:

[[0, 4, 0], [2, 0, 8], [3, 6, 9]]

如果任何行或列中都没有两个连续的0,则返回true。这一定与Hitori规则有关:“黑细胞不能相邻,尽管它们可以彼此成对角线。”