% F - Finally some sudoku from IPSC
%
% dlv -pfilter=sud sudoku_ipsc.dlv input.dlv
%
% sud(S,R,C,N)
%   N is at position R,C in sudoku S
%
% input should contain:
%  s(S) for each sudoku
%  some sud(S,R,C,N)
%  color(S1,R1,C1,S2,R2,C2)  saying that S1,R1,C1 and S2,R2,C2 have the same color

#maxint=9.

% coordinates
c(R) :- #int(R), 0<=R, R<=8.

% at any position is one on 0..9
% not very general, but efficient
sud(S,R,C,1) v sud(S,R,C,2) v sud(S,R,C,3) v
sud(S,R,C,4) v sud(S,R,C,5) v sud(S,R,C,6) v
sud(S,R,C,7) v sud(S,R,C,8) v sud(S,R,C,9) :-
	s(S),c(R),c(C).

% rows and columns
:- sud(S,R,C1,N), sud(S,R,C2,N), C1!=C2.
:- sud(S,R1,C,N), sud(S,R2,C,N), R1!=R2.

% squares
:- sud(S,R1,C1,N), sud(S,R2,C2,N), C1!=C2,
	div(R1,3,W1), div(R2,3,W1), div(C1,3,W2), div(C2,3,W2).
:- sud(S,R1,C1,N), sud(S,R2,C2,N), R1!=R2,
	div(R1,3,W1), div(R2,3,W1), div(C1,3,W2), div(C2,3,W2).

% same colors have same numbers
:- color(S1,R1,C1,S2,R2,C2), sud(S1,R1,C1,N1), sud(S2,R2,C2,N2), N1!=N2.

% grr, dlv doesn't have div
% per DLV manual:
div(X,Y,Z) :- XminusDelta = Y*Z, X=XminusDelta + Delta, Delta<Y.
