swi-prolog에서 이진 스도쿠 해결사를 작성하려고했습니다. (이진 스도쿠가 설명되어 있습니다 here)prolog 스도쿠 솔버의 글로벌 스택이 부족합니다
문제는 현재 글로벌 스택이 부족하다는 것입니다. 나는 그것보다 더 충분해야 2 기가 바이트주고있다. 결함이있는 알고리즘을 사용하고 있습니까? 저기 작은 퍼즐과 함께 글로벌 스택 오류의 부족으로 실행 피하기 위해 더 잘할 수있는 일이 있습니까?
조금 더 많은 정보 : 첫 번째 제한 조건을 적용한 4x4 퍼즐에 이미 6^4 가지 가능성이 있습니다. 당신이이 문제를 조회 할 수 있습니다 : 여기
problems(2,Field),binary_sudoku(Field).
코드 : 코드에 문제가 몇 가지가 있습니다
:-use_module(library(clpfd)).
valid_row(Row) :-
Row ins 0..1,
length(Row,L),
sum(Row,#=,L/2).
matrixNth1(Matr,X,Y,El) :-
nth1(Y,Matr,CurRow),
nth1(X,CurRow,El).
all_diff([]).
all_diff([X|Y]) :-
maplist(dif(X),Y),
all_diff(Y).
valid(_,1,1).
valid(Rows,1,Y) :-
length(Rows,Y).
valid(Rows,X,1) :-
length(Rows,X).
valid(Rows,X,X) :-
length(Rows,X).
valid(Rows,X,Y) :-
matrixNth1(Rows,X,Y,0).
valid(Rows,X,Y):-
AboveY is Y-1,
matrixNth1(Rows,X,AboveY,0).
valid(Rows,X,Y):-
BelowY is Y+1,
matrixNth1(Rows,X,BelowY,0).
valid(Rows,X,Y):-
LeftX is X-1,
matrixNth1(Rows,LeftX,Y,0).
valid(Rows,X,Y):-
RightX is X+1,
matrixNth1(Rows,RightX,Y,0).
binary_sudoku(Rows) :-
length(Rows,Height),
transpose(Rows,Cols),
length(Cols,Height),
maplist(valid_row,Rows),
foreach(between(1,Height,X),foreach(between(1,Height,Y),valid(Rows,X,Y))),
all_diff(Rows),all_diff(Cols).
problems(1,[[_,_],[_,_]]).
problems(2,[[_,_,_,_],[_,_,_,_],[_,_,_,_],[_,_,_,_]]).
어떻게 당신이 솔루션에 대한 쿼리하는? 이미 사용 가능한'all_different/1' 또는'all_distinct/1'을 사용하는 대신 자신의'all_diff'를 정의하는 이유는 무엇입니까? 왜 "모든 다른"제약 조건을 더 일찍 설정하지 않습니까? –
나는 이것이 내가 프롤로그에서 만든 첫 번째 것이라고 덧붙여 야했다. C에서 오는 clunky/magical 한 것 같다. .... 리스트를 원할 때 정수가 다른 것을 제약하기 때문에 all_distinct가 작동하지 않았다. 정수의 다른 것입니다. 상관없이 all_diff는 문제가 아니며 비 고유 행/열이있는 솔루션은 거의 없습니다. 그것은 내가 말할 수있는 한 내 이중 foreach 루프에 문제가 있습니다. – camel
2x2 보드의 솔루션을 얻으시겠습니까? 그것을 얻으려면 어떻게 질문합니까? –