入力数独ボードが現在正しくないかどうかをチェックするだけの簡単なプログラムを書こうとしています。つまり、行、列、または「ボックス」に同じ番号が2つあります。行と列の部分で問題が発生したことはありません。これは、次のコードで実行する非常に単純なタスクです(「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個のサブリストに分割し、row(K * K)に到達するまで、row2のK個のサブリストをrow1のサブリストの最後に追加します。
残念ながら、これを実現する方法が本当にわかりませんか?リストを取得し、それぞれの長さがYのXリストに分割するという方針に沿って何かを実行するために使用できるBIPはありますか?
そうでなければ、何かアイデアはありますか?私は小さなループについて知っています、そしてそれらはここで実装できると思います、しかし私はそれをどのように行うのか本当にわかりませんか?助けてくれてありがとう!