:- use_module(library(lists)). :- use_module(library(ordsets)). :- mode(1, allnum(-numset)). allnum([1,2,3,4,5,6,7,8,9]). :- mode(1, allpos(-posset)). allpos(PS) :- allcord(CS), findall((X,Y), (member(X,CS),member(Y,CS)), L), list_to_ord_set(L, PS). allcord([0,1,2,3,4,5,6,7,8]). :- mode(1, row(+pos, -posset)). :- mode(1, column(+pos, -posset)). :- mode(1, block(+pos, -posset)). row((_,Y), PS) :- allcord(CS), findall((X,Y), member(X,CS), PS). column((X,_), PS) :- allcord(CS), findall((X,Y), member(Y,CS), PS). box((X,Y), PS) :- X0 is (X // 3) * 3, X1 is X0 + 1, X2 is X0 + 2, Y0 is (Y // 3) * 3, Y1 is Y0 + 1, Y2 is Y0 + 2, findall((XX,YY), (member(XX,[X0,X1,X2]), member(YY,[Y0,Y1,Y2])), L), list_to_ord_set(L, PS). :- mode(1, singleton(-num, +numset)). :- mode(1, singleton(-pos, +posset)). singleton(X,[X]). :- mode(1, ord_intersection(+posset,+posset,-posset)). :- mode(1, ord_subtract(+posset,+posset,-posset)). :- mode(1, ord_union(+posset,+posset,-posset)). :- mode(1, ord_intersection(+numset,+numset,-numset)). :- mode(1, ord_subtract(+numset,+numset,-numset)). :- mode(1, ord_union(+numset,+numset,-numset)). :- mode(1, collectnum(+board, +posset, -numset)). collectnum(BOARD,PS,NS) :- findall(N, (member((X,Y,N), BOARD), member((X,Y), PS)), L), list_to_ord_set(L,NS). :- mode(1, collectpos(+board, +numset, -posset)). collectpos(BOARD,NS,PS) :- findall((X,Y), (member((X,Y,N), BOARD), member(N,NS)), L), list_to_ord_set(L,PS). :- mode(1, collectSafePos(+board,+num,-posset)). collectSafePos(BOARD,N,PS) :- allpos(AP), findall(P, (member(P,AP), safe(BOARD,N,P)), PS). :- mode(1, collectSafeNum(+board,+pos,-numset)). collectSafeNum(BOARD,P,NS) :- allnum(AN), findall(N, (member(N,AN), safe(BOARD,N,P)), NS). safe(BOARD,N,P) :- \+( unsafe(BOARD,N,P) ). unsafe(BOARD, _, (X,Y)) :- member((X,Y,_), BOARD). unsafe(BOARD, N, (X,_)) :- member((X,_,N), BOARD). unsafe(BOARD, N, (_,Y)) :- member((_,Y,N), BOARD). unsafe(BOARD, N, (X,Y)) :- box((X,Y),PS), member((X1,Y1),PS), member((X1,Y1,N),BOARD). :- mode(1, ((+pos) = (+pos))). :- mode(1, put(+board, +pos, -num)). :- determination(put/3, row/2). :- determination(put/3, column/2). :- determination(put/3, box/2). :- determination(put/3, singleton/2). :- determination(put/3, ord_intersection/3). :- determination(put/3, collectSafePos/3). :- determination(put/3, collectSafeNum/3). :- determination(put/3, '='/2). :- set(i,5). :- set(clauselength,5). :- set(noise,8). :- set(print,1). % :- mode(1,putA(+board, +pos, +num)). % putA(BOARD, P, N) :- % collectSafePos(BOARD,N,PS1), % column(P,PS2), % ord_intersection(PS1,PS2,PS), % singleton(P,PS). % putA(BOARD, P, N) :- % collectSafePos(BOARD,N,PS1), % row(P,PS2), % ord_intersection(PS1,PS2,PS), % singleton(P,PS). % putA(BOARD, P, N) :- % collectSafePos(BOARD,N,PS1), % block(P,PS2), % ord_intersection(PS1,PS2,PS), % singleton(P,PS). putA(A,B,C) :- collectSafeNum(A,B,D), singleton(C,D).