我正在尝试编写一个简单的程序来检查输入数独板当前是否不正确;即它在一行、一列或“框”中有两个相同的数字。我在行和列部分没有遇到任何问题 - 一个相当简单的任务,我使用以下代码完成(应该注意,'0' 表示尚未填充的正方形):
:- use_module(library(clpfd)).
%Takes a matrix, determines if any row has repeating numbers
check([H|T]):-
all_diff(H),
check(T).
check([]).
%takes a list, checks if it contains repetitions other than '0'.
all_diff([]).
all_diff([X|Xs]) :-
( X = 0 ->
all_diff(Xs)
;
\+memberchk(X, Xs),
all_diff(Xs)
).
consistent(Rows):-
check(Rows), %verify rows are free of repeats
transpose(Rows,Columns), %L1 represents columns
check(Columns), %verify all columns are free of repeats
[H|T] = Rows,
length(H,M),
K is integer(sqrt(M)). %this will give me dimensions of each box (KxK)
但是,我不太清楚如何生成将代表 KxK“框”的列表(其中 K 是行长的平方根)。我得到了 K 的值,我想我想按照将 row1 划分为 K 个子列表的方式做一些事情,然后将 row2 的 K 个子列表附加到 row1 的子列表的末尾,直到我到达 row(K*K)。
不幸的是,我真的不知道如何去做这件事?有没有我可以使用的 BIP 来做一些事情,比如获取一个列表并将其分解为 X 列表,每个列表长度为 Y?
否则,有什么想法吗?我知道一个很小但关于dowhile循环的东西,我想它们可以在这里实现,但我也不确定我会怎么做?非常感谢你的帮忙!