
flatten([],[]).
flatten([X|Xs],Rs) :-
	flatten(Xs,R),
	append(X,R,Rs).

show([]).
show([X|Xs]) :-
	show_line(X),nl,
	show(Xs).

show_line([]).
show_line([X|Xs]) :-
	write(X),write(' '),
	show_line(Xs).

sudoku(P) :-
	sudoku(P,_).

sudoku(P,B) :-
	P = 
	  [ [X1,X2,X3,X4,X5,X6,X7,X8,X9],
		  [Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9],
		  [Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9],
		  [W1,W2,W3,W4,W5,W6,W7,W8,W9],
		  [A1,A2,A3,A4,A5,A6,A7,A8,A9],
		  [B1,B2,B3,B4,B5,B6,B7,B8,B9],
		  [C1,C2,C3,C4,C5,C6,C7,C8,C9],
		  [D1,D2,D3,D4,D5,D6,D7,D8,D9],
		  [E1,E2,E3,E4,E5,E6,E7,E8,E9] ],
	flatten(P,Xs),
	fd_domain(Xs,[1,2,3,4,5,6,7,8,9]),
	fd_all_different([X1,X2,X3,X4,X5,X6,X7,X8,X9]),
  fd_all_different([Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9]),
	fd_all_different([Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9]),
	fd_all_different([W1,W2,W3,W4,W5,W6,W7,W8,W9]),
	fd_all_different([A1,A2,A3,A4,A5,A6,A7,A8,A9]),
	fd_all_different([B1,B2,B3,B4,B5,B6,B7,B8,B9]),
	fd_all_different([C1,C2,C3,C4,C5,C6,C7,C8,C9]),
	fd_all_different([D1,D2,D3,D4,D5,D6,D7,D8,D9]),
	fd_all_different([E1,E2,E3,E4,E5,E6,E7,E8,E9]),

	fd_all_different([X1,Y1,Z1,W1,A1,B1,C1,D1,E1]),
	fd_all_different([X2,Y2,Z2,W2,A2,B2,C2,D2,E2]),
	fd_all_different([X3,Y3,Z3,W3,A3,B3,C3,D3,E3]),
	fd_all_different([X4,Y4,Z4,W4,A4,B4,C4,D4,E4]),
	fd_all_different([X5,Y5,Z5,W5,A5,B5,C5,D5,E5]),
	fd_all_different([X6,Y6,Z6,W6,A6,B6,C6,D6,E6]),
	fd_all_different([X7,Y7,Z7,W7,A7,B7,C7,D7,E7]),
	fd_all_different([X8,Y8,Z8,W8,A8,B8,C8,D8,E8]),
	fd_all_different([X9,Y9,Z9,W9,A9,B9,C9,D9,E9]),

	fd_all_different([X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3]),
	fd_all_different([X4,X5,X6,Y4,Y5,Y6,Z4,Z5,Z6]),
	fd_all_different([X7,X8,X9,Y7,Y8,Y9,Z7,Z8,Z9]),
	fd_all_different([W1,W2,W3,A1,A2,A3,B1,B2,B3]),
	fd_all_different([W4,W5,W6,A4,A5,A6,B4,B5,B6]),
	fd_all_different([W7,W8,W9,A7,A8,A9,B7,B8,B9]),
	fd_all_different([C1,C2,C3,D1,D2,D3,E1,E2,E3]),
	fd_all_different([C4,C5,C6,D4,D5,D6,E4,E5,E6]),
	fd_all_different([C7,C8,C9,D7,D8,D9,E7,E8,E9]),
	fd_labeling(Xs,[backtracks(B),variable_method(ff)]).


puzzle(pikachu,
	       [[1,_,5,_,_,3,_,6,_],
          [_,_,_,_,2,5,_,_,8],
          [4,_,_,_,8,_,5,_,_],
          [_,_,6,_,_,_,_,2,_],
          [_,_,1,4,_,6,9,_,_],
          [_,5,_,_,_,_,4,_,_],
          [_,_,8,_,9,_,_,_,7],
          [7,_,_,5,6,_,_,_,_],
          [_,1,_,8,_,_,6,_,3]]).

puzzle(diabolical,
         [[_,9,_,7,_,_,8,6,_],
          [_,3,1,_,_,5,_,2,_],
          [8,_,6,_,_,_,_,_,_],
          [_,_,7,_,5,_,_,_,6],
          [_,_,_,3,_,7,_,_,_],
          [5,_,_,_,1,_,7,_,_],
          [_,_,_,_,_,_,1,_,9],
          [_,2,_,6,_,_,3,5,_],
          [_,5,4,_,_,8,_,7,_]]).
