Я пытаюсь написать простую программу, которая просто проверяет, является ли входная плата sudoku некорректным; то есть он имеет два одинаковых числа в строке, столбце или «в ящике». У меня нет проблем с частью строк и столбцов - задача довольно прямолинейная, которую я выполняю со следующим кодом (следует отметить, что «0» представляет собой квадрат, который не был заполнен):Создание sudoku 'boxes' из строк - пролог
:- 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 в конец подписок в row1 до тех пор, пока не достигнет строки (K * K).
К сожалению, я действительно не уверен, как это сделать? Есть ли BIP, который я могу использовать, что будет делать что-то в соответствии с тем, чтобы взять список и разбить его на X-списки по всей длине Y?
В противном случае любые идеи? Я знаю крошечный, но о петлях dowhile, и я полагаю, что они могут быть реализованы здесь, но я не совсем уверен, как я это сделаю? Большое спасибо за помощь!
Большое спасибо! Мне интересно, однако, если вы, возможно, поможете мне понять, что здесь происходит немного лучше? Кажется, что между всадниками, находящимися в пределах поисковика, возникает какая-то путаница! Однако, похоже, что Bs должен быть списком, содержащим список «блоков» (может быть, я что-то пропустил?), Но он всегда заканчивается как [[], [], [], []] , Любая идея, что может там происходить? Еще раз спасибо за помощь - я очень ценю это! – user1257768
Я добавил тестовый пример: см. Изменение – CapelliC