Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sudoku with swi-prolog

4 views
Skip to first unread message

ents...@gmail.com

unread,
Nov 6, 2005, 8:26:32 PM11/6/05
to
hi folks,

it is 2 o'clock in the morning and i'm also trying to solve sudoku with
swi-prolog.

after a nice copy & paste - search & replace session, i think, i did i
finally. but now my nice little swi-prolog tells me, that sudoku/81 is
not defined. hmpf.

i can't manage it, to attach the source code as a file, so i will post
it here:

%sudoku with prolog

number(1).
number(2).
number(3).
number(4).
number(5).
number(6).
number(7).
number(8).
number(9).

sudoku(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,F1,F2,F3,F4,F5,F6,F7,F8,F9,G1,G2,G3,G4,G5,G6,G7,G8,G9,H1,H2,H3,H4,H5,H6,H7,H8,H9,I1,I2,I3,I4,I5,I6,I7,I8,I9):-

number(A1),
number(A2),
number(A3),
number(A4),
number(A5),
number(A6),
number(A7),
number(A8),
number(A9),

number(B1),
number(B2),
number(B3),
number(B4),
number(B5),
number(B6),
number(B7),
number(B8),
number(B9),

number(C1),
number(C2),
number(C3),
number(C4),
number(C5),
number(C6),
number(C7),
number(C8),
number(C9),

number(D1),
number(D2),
number(D3),
number(D4),
number(D5),
number(D6),
number(D7),
number(D8),
number(D9),

number(E1),
number(E2),
number(E3),
number(E4),
number(E5),
number(E6),
number(E7),
number(E8),
number(E9),

number(F1),
number(F2),
number(F3),
number(F4),
number(F5),
number(F6),
number(F7),
number(F8),
number(F9),

number(G1),
number(G2),
number(G3),
number(G4),
number(G5),
number(G6),
number(G7),
number(G8),
number(G9),

number(H1),
number(H2),
number(H3),
number(H4),
number(H5),
number(H6),
number(H7),
number(H8),
number(H9),

number(I1),
number(I2),
number(I3),
number(I4),
number(I5),
number(I6),
number(I7),
number(I8),
number(I9),

A1\=A2, A1\=A3, A1\=A4, A1\=A5, A1\=A6, A1\=A7, A1\=A8, A1\=A9,
A2\=A3, A2\=A4, A2\=A5, A2\=A6, A2\=A7, A2\=A8, A2\=A9,
A3\=A4, A3\=A5, A3\=A6, A3\=A7, A3\=A8, A3\=A9,
A4\=A5, A4\=A6, A4\=A7, A4\=A8, A4\=A9,
A5\=A6, A5\=A7, A5\=A8, A5\=A9,
A6\=A7, A6\=A8, A6\=A9,
A7\=A8, A7\=A9,
A8\=A9,

B1\=B2, B1\=B3, B1\=B4, B1\=B5, B1\=B6, B1\=B7, B1\=B8, B1\=B9,
B2\=B3, B2\=B4, B2\=B5, B2\=B6, B2\=B7, B2\=B8, B2\=B9,
B3\=B4, B3\=B5, B3\=B6, B3\=B7, B3\=B8, B3\=B9,
B4\=B5, B4\=B6, B4\=B7, B4\=B8, B4\=B9,
B5\=B6, B5\=B7, B5\=B8, B5\=B9,
B6\=B7, B6\=B8, B6\=B9,
B7\=B8, B7\=B9,
B8\=B9,

C1\=C2, C1\=C3, C1\=C4, C1\=C5, C1\=C6, C1\=C7, C1\=C8, C1\=C9,
C2\=C3, C2\=C4, C2\=C5, C2\=C6, C2\=C7, C2\=C8, C2\=C9,
C3\=C4, C3\=C5, C3\=C6, C3\=C7, C3\=C8, C3\=C9,
C4\=C5, C4\=C6, C4\=C7, C4\=C8, C4\=C9,
C5\=C6, C5\=C7, C5\=C8, C5\=C9,
C6\=C7, C6\=C8, C6\=C9,
C7\=C8, C7\=C9,
C8\=C9,

D1\=D2, D1\=D3, D1\=D4, D1\=D5, D1\=D6, D1\=D7, D1\=D8, D1\=D9,
D2\=D3, D2\=D4, D2\=D5, D2\=D6, D2\=D7, D2\=D8, D2\=D9,
D3\=D4, D3\=D5, D3\=D6, D3\=D7, D3\=D8, D3\=D9,
D4\=D5, D4\=D6, D4\=D7, D4\=D8, D4\=D9,
D5\=D6, D5\=D7, D5\=D8, D5\=D9,
D6\=D7, D6\=D8, D6\=D9,
D7\=D8, D7\=D9,
D8\=D9,

E1\=E2, E1\=E3, E1\=E4, E1\=E5, E1\=E6, E1\=E7, E1\=E8, E1\=E9,
E2\=E3, E2\=E4, E2\=E5, E2\=E6, E2\=E7, E2\=E8, E2\=E9,
E3\=E4, E3\=E5, E3\=E6, E3\=E7, E3\=E8, E3\=E9,
E4\=E5, E4\=E6, E4\=E7, E4\=E8, E4\=E9,
E5\=E6, E5\=E7, E5\=E8, E5\=E9,
E6\=E7, E6\=E8, E6\=E9,
E7\=E8, E7\=E9,
E8\=E9,

F1\=F2, F1\=F3, F1\=F4, F1\=F5, F1\=F6, F1\=F7, F1\=F8, F1\=F9,
F2\=F3, F2\=F4, F2\=F5, F2\=F6, F2\=F7, F2\=F8, F2\=F9,
F3\=F4, F3\=F5, F3\=F6, F3\=F7, F3\=F8, F3\=F9,
F4\=F5, F4\=F6, F4\=F7, F4\=F8, F4\=F9,
F5\=F6, F5\=F7, F5\=F8, F5\=F9,
F6\=F7, F6\=F8, F6\=F9,
F7\=F8, F7\=F9,
F8\=F9,

G1\=G2, G1\=G3, G1\=G4, G1\=G5, G1\=G6, G1\=G7, G1\=G8, G1\=G9,
G2\=G3, G2\=G4, G2\=G5, G2\=G6, G2\=G7, G2\=G8, G2\=G9,
G3\=G4, G3\=G5, G3\=G6, G3\=G7, G3\=G8, G3\=G9,
G4\=G5, G4\=G6, G4\=G7, G4\=G8, G4\=G9,
G5\=G6, G5\=G7, G5\=G8, G5\=G9,
G6\=G7, G6\=G8, G6\=G9,
G7\=G8, G7\=G9,
G8\=G9,

H1\=H2, H1\=H3, H1\=H4, H1\=H5, H1\=H6, H1\=H7, H1\=H8, H1\=H9,
H2\=H3, H2\=H4, H2\=H5, H2\=H6, H2\=H7, H2\=H8, H2\=H9,
H3\=H4, H3\=H5, H3\=H6, H3\=H7, H3\=H8, H3\=H9,
H4\=H5, H4\=H6, H4\=H7, H4\=H8, H4\=H9,
H5\=H6, H5\=H7, H5\=H8, H5\=H9,
H6\=H7, H6\=H8, H6\=H9,
H7\=H8, H7\=H9,
H8\=H9,

I1\=I2, I1\=I3, I1\=I4, I1\=I5, I1\=I6, I1\=I7, I1\=I8, I1\=I9,
I2\=I3, I2\=I4, I2\=I5, I2\=I6, I2\=I7, I2\=I8, I2\=I9,
I3\=I4, I3\=I5, I3\=I6, I3\=I7, I3\=I8, I3\=I9,
I4\=I5, I4\=I6, I4\=I7, I4\=I8, I4\=I9,
I5\=I6, I5\=I7, I5\=I8, I5\=I9,
I6\=I7, I6\=I8, I6\=I9,
I7\=I8, I7\=I9,
I8\=I9,

A1\=B1, A1\=C1, A1\=D1, A1\=E1, A1\=F1, A1\=G1, A1\=H1, A1\=I1,
B1\=C1, B1\=D1, B1\=E1, B1\=F1, B1\=G1, B1\=H1, B1\=I1,
C1\=D1, C1\=E1, C1\=F1, C1\=G1, C1\=H1, C1\=I1,
D1\=E1, D1\=F1, D1\=G1, D1\=H1, D1\=I1,
E1\=F1, E1\=G1, E1\=H1, E1\=I1,
F1\=G1, F1\=H1, F1\=I1,
G1\=H1, G1\=I1,
H1\=I1,

A2\=B2, A2\=C2, A2\=D2, A2\=E2, A2\=F2, A2\=G2, A2\=H2, A2\=I2,
B2\=C2, B2\=D2, B2\=E2, B2\=F2, B2\=G2, B2\=H2, B2\=I2,
C2\=D2, C2\=E2, C2\=F2, C2\=G2, C2\=H2, C2\=I2,
D2\=E2, D2\=F2, D2\=G2, D2\=H2, D2\=I2,
E2\=F2, E2\=G2, E2\=H2, E2\=I2,
F2\=G2, F2\=H2, F2\=I2,
G2\=H2, G2\=I2,
H2\=I2,

A3\=B3, A3\=C3, A3\=D3, A3\=E3, A3\=F3, A3\=G3, A3\=H3, A3\=I3,
B3\=C3, B3\=D3, B3\=E3, B3\=F3, B3\=G3, B3\=H3, B3\=I3,
C3\=D3, C3\=E3, C3\=F3, C3\=G3, C3\=H3, C3\=I3,
D3\=E3, D3\=F3, D3\=G3, D3\=H3, D3\=I3,
E3\=F3, E3\=G3, E3\=H3, E3\=I3,
F3\=G3, F3\=H3, F3\=I3,
G3\=H3, G3\=I3,
H3\=I3,

A4\=B4, A4\=C4, A4\=D4, A4\=E4, A4\=F4, A4\=G4, A4\=H4, A4\=I4,
B4\=C4, B4\=D4, B4\=E4, B4\=F4, B4\=G4, B4\=H4, B4\=I4,
C4\=D4, C4\=E4, C4\=F4, C4\=G4, C4\=H4, C4\=I4,
D4\=E4, D4\=F4, D4\=G4, D4\=H4, D4\=I4,
E4\=F4, E4\=G4, E4\=H4, E4\=I4,
F4\=G4, F4\=H4, F4\=I4,
G4\=H4, G4\=I4,
H4\=I4,

A5\=B5, A5\=C5, A5\=D5, A5\=E5, A5\=F5, A5\=G5, A5\=H5, A5\=I5,
B5\=C5, B5\=D5, B5\=E5, B5\=F5, B5\=G5, B5\=H5, B5\=I5,
C5\=D5, C5\=E5, C5\=F5, C5\=G5, C5\=H5, C5\=I5,
D5\=E5, D5\=F5, D5\=G5, D5\=H5, D5\=I5,
E5\=F5, E5\=G5, E5\=H5, E5\=I5,
F5\=G5, F5\=H5, F5\=I5,
G5\=H5, G5\=I5,
H5\=I5,

A6\=B6, A6\=C6, A6\=D6, A6\=E6, A6\=F6, A6\=G6, A6\=H6, A6\=I6,
B6\=C6, B6\=D6, B6\=E6, B6\=F6, B6\=G6, B6\=H6, B6\=I6,
C6\=D6, C6\=E6, C6\=F6, C6\=G6, C6\=H6, C6\=I6,
D6\=E6, D6\=F6, D6\=G6, D6\=H6, D6\=I6,
E6\=F6, E6\=G6, E6\=H6, E6\=I6,
F6\=G6, F6\=H6, F6\=I6,
G6\=H6, G6\=I6,
H6\=I6,

A7\=B7, A7\=C7, A7\=D7, A7\=E7, A7\=F7, A7\=G7, A7\=H7, A7\=I7,
B7\=C7, B7\=D7, B7\=E7, B7\=F7, B7\=G7, B7\=H7, B7\=I7,
C7\=D7, C7\=E7, C7\=F7, C7\=G7, C7\=H7, C7\=I7,
D7\=E7, D7\=F7, D7\=G7, D7\=H7, D7\=I7,
E7\=F7, E7\=G7, E7\=H7, E7\=I7,
F7\=G7, F7\=H7, F7\=I7,
G7\=H7, G7\=I7,
H7\=I7,

A8\=B8, A8\=C8, A8\=D8, A8\=E8, A8\=F8, A8\=G8, A8\=H8, A8\=I8,
B8\=C8, B8\=D8, B8\=E8, B8\=F8, B8\=G8, B8\=H8, B8\=I8,
C8\=D8, C8\=E8, C8\=F8, C8\=G8, C8\=H8, C8\=I8,
D8\=E8, D8\=F8, D8\=G8, D8\=H8, D8\=I8,
E8\=F8, E8\=G8, E8\=H8, E8\=I8,
F8\=G8, F8\=H8, F8\=I8,
G8\=H8, G8\=I8,
H8\=I8,

A9\=B9, A9\=C9, A9\=D9, A9\=E9, A9\=F9, A9\=G9, A9\=H9, A9\=I9,
B9\=C9, B9\=D9, B9\=E9, B9\=F9, B9\=G9, B9\=H9, B9\=I9,
C9\=D9, C9\=E9, C9\=F9, C9\=G9, C9\=H9, C9\=I9,
D9\=E9, D9\=F9, D9\=G9, D9\=H9, D9\=I9,
E9\=F9, E9\=G9, E9\=H9, E9\=I9,
F9\=G9, F9\=H9, F9\=I9,
G9\=H9, G9\=I9,
H9\=I9,

A1\=B2, A1\=C2, A1\=B3, A1\=C3,
B1\=A2, B1\=C2, B1\=A3, B1\=C3,
C1\=A2, C1\=B2, C1\=A3, C1\=B3,
A2\=B3, A2\=C3,
B2\=A3, B2\=C3,
C2\=A3, C2\=B3,

A4\=B5, A4\=C5, A4\=B6, A4\=C6,
B4\=A5, B4\=C5, B4\=A6, B4\=C6,
C4\=A5, C4\=B5, C4\=A6, C4\=B6,
A5\=B6, A5\=C6,
B5\=A6, B5\=C6,
C5\=A6, C5\=B6,

A7\=B8, A7\=C8, A7\=B9, A7\=C9,
B7\=A8, B7\=C8, B7\=A9, B7\=C9,
C7\=A8, C7\=B8, C7\=A9, C7\=B9,
A8\=B9, A8\=C9,
B8\=A9, B8\=C9,
C8\=A9, C8\=B9,

D1\=E2, D1\=F2, D1\=E3, D1\=F3,
E1\=D2, E1\=F2, E1\=D3, E1\=F3,
F1\=D2, F1\=E2, F1\=D3, F1\=E3,
D2\=E3, D2\=F3,
E2\=D3, E2\=F3,
F2\=D3, F2\=E3,

D4\=E5, D4\=F5, D4\=E6, D4\=F6,
E4\=D5, E4\=F5, E4\=D6, E4\=F6,
F4\=D5, F4\=E5, F4\=D6, F4\=E6,
D5\=E6, D5\=F6,
E5\=D6, E5\=F6,
F5\=D6, F5\=E6,

D7\=E8, D7\=F8, D7\=E9, D7\=F9,
E7\=D8, E7\=F8, E7\=D9, E7\=F9,
F7\=D8, F7\=E8, F7\=D9, F7\=E9,
D8\=E9, D8\=F9,
E8\=D9, E8\=F9,
F8\=D9, F8\=E9,

G1\=H2, G1\=I2, G1\=H3, G1\=I3,
H1\=G2, H1\=I2, H1\=G3, H1\=I3,
I1\=G2, I1\=H2, I1\=G3, I1\=H3,
G2\=H3, G2\=I3,
H2\=G3, H2\=I3,
I2\=G3, I2\=H3,

G4\=H5, G4\=I5, G4\=H6, G4\=I6,
H4\=G5, H4\=I5, H4\=G6, H4\=I6,
I4\=G5, I4\=H5, I4\=G6, I4\=H6,
G5\=H6, G5\=I6,
H5\=G6, H5\=I6,
I5\=G6, I5\=H6,

G7\=H8, G7\=I8, G7\=H9, G7\=I9,
H7\=G8, H7\=I8, H7\=G9, H7\=I9,
I7\=G8, I7\=H8, I7\=G9, I7\=H9,
G8\=H9, G8\=I9,
H8\=G9, H8\=I9,
I8\=G9, I8\=H9,

% that's it ;)
% now the numbers:

B1=8,
C1=1,
D1=7,
G1=3,
H1=4,

A2=6,
B2=4,
E2=3,
H2=2,
I2=5,

A3=2,
D3=6,
F3=1,
I3=9,

A4=3,
C4=9,
E4=2,
G4=8,

A5=1,
B5=7,
D5=8,
F5=3,
H5=5,
I5=4,

A6=8,
C6=4,
E6=7,
G6=6,

A7=5,
D7=2,
F7=7,
I7=3,

A8=4,
B8=9,
E8=1,
H8=6,
I8=7,

B9=2,
C9=3,
F9=6,
G9=5,
H9=1.

sorry for that, but i don't know how to do it in a different way.

i would be deeply grateful, if someone could explain to me, what i did
wrong.
i admit, my way of doing is not so stylish, like Neng-Fa Zhou did it,
but i'm just a student and in my it-course we solved these logicals and
we did it that way, so just wanted to try, whether it works or not.

nevertheless i thank everyone who will help me!

greetings from germany,

maddin

djame

unread,
Nov 6, 2005, 8:45:06 PM11/6/05
to
ents...@gmail.com a écrit :


Maybe because you try to redefine number/1 which already exists ?
replace number by my_number and add sudoku(.... all the 81 args) after
the H9=1 last line
something like
?- longlist_of_instanciation,sudoku( long list).
by the way, it's still hanging after 2 mn on my pIII 866mhz :)

I'm really curious.
Have you tried with some constraint domain solver ?

djame

unread,
Nov 6, 2005, 8:57:31 PM11/6/05
to
ents...@gmail.com a écrit :

I tried to run your program and first
you should replace number/1 by my_number, number/1 already exist
then when I consult the resulting file
sudoky doesn't seem to be parsed
do a listing/0, you'll see.

Message has been deleted

ents...@gmail.com

unread,
Nov 7, 2005, 4:53:34 AM11/7/05
to

djame schrieb:

>
> I tried to run your program and first
> you should replace number/1 by my_number, number/1 already exist
> then when I consult the resulting file
> sudoky doesn't seem to be parsed
> do a listing/0, you'll see.

that's right, but i've seen that before. the problem is, why does
prolog not parse sudoku/81 ?
usually it should, shouldn't it?
do u have any idea?
very curios...

maddin

Rainer Hahnekamp

unread,
Nov 8, 2005, 12:41:46 PM11/8/05
to
Hi,
I've also written my own version of sudoku. In my opinion it is very
different from the one posted above so I would appreciate it if you
could give me some comments - especially on the programming style
because I am not sure if I am using prolog the way it is meant to be:

data(['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',
'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9',
'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7', 'G8', 'G9',
'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8', 'H9',
'I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8', 'I9']).


element(1). element(2). element(3).
element(4). element(5). element(6).
element(7). element(8). element(9).


set(Position, Value, [H|L1], [H|L2], CurPosition) :-
CurPosition \= Position,
NextPosition is CurPosition + 1,
set(Position, Value, L1, L2, NextPosition).
set(Position, Value, [_|L], [Value|L], Position).
set(_, _, [], _).

do :-
data(Data),
fillOut(1, Data, X, Data),
output(1, X),
!.

output(_, []).
output(Position, [H|L]) :-
X is Position mod 9,
X = 0,
write(H), writeln(' '),
NewPosition is Position + 1,
output(NewPosition, L).
output(Position, [H|L]) :-
X is Position mod 9,
X > 0,
write(H), write(' '),
NewPosition is Position + 1,
output(NewPosition, L).

fillOut(_, ResultList, ResultList, []).
fillOut(Position, List, ResultList, [Element|L]) :-
not(number(Element)),
element(X),
isPossible(X, Position, List),
set(Position, X, List, NewList, 1),
NewPosition is Position + 1,
fillOut(NewPosition, NewList, ResultList, L).
fillOut(Position, List, ResultList, [Element|L]) :-
number(Element),
NewPosition is Position + 1,
fillOut(NewPosition, List, ResultList, L).

isPossible(Value, Position, List) :-
getHorizontal(Position, List, Horiz),
not(member(Value, Horiz)),
getVertical(Position, List, Vertical),
not(member(Value, Vertical)),
getArea(Position, List, Area),
not(member(Value, Area)).

getHorizontal(Position, List, Horiz) :-
calcHoriz(Position, NewPosition),
Start is NewPosition - 1,
goForward(List, NewList, Start),
getForward(NewList, Horiz, 9).
getVertical(Position, List, [X1, X2, X3, X4, X5, X6, X7, X8, X9]) :-
calcVert(Position, NewPosition),
Start is NewPosition - 1,
goForward(List, [X1|List1], Start),
goForward(List1, [X2|List2], 8),
goForward(List2, [X3|List3], 8),
goForward(List3, [X4|List4], 8),
goForward(List4, [X5|List5], 8),
goForward(List5, [X6|List6], 8),
goForward(List6, [X7|List7], 8),
goForward(List7, [X8|List8], 8),
goForward(List8, [X9|_], 8).

getArea(Position, List, [X1, X2, X3, X4, X5, X6, X7, X8, X9]) :-
calcArea(Position, NewPosition),
Start is NewPosition - 1,
goForward(List, [X1|[X2|[X3|List1]]], Start),
goForward(List1, [X4|[X5|[X6|List2]]], 6),
goForward(List2, [X7|[X8|[X9|_]]], 6).


getForward(_, [], 0).
getForward([H|L1], [H|L2], Counter) :-
NewCounter is Counter - 1,
getForward(L1, L2, NewCounter).

goForward(Rest, Rest, 0).
goForward([_|L1], Rest, Step) :-
NewStep is Step - 1,
goForward(L1, Rest, NewStep).

calcHoriz(X, BeginX) :-
BeginX is X - (X-1) mod 9.
calcVert(X, BeginX) :-
Row is (X - 1) // 9,
BeginX is X - Row * 9.
calcArea(P, BeginP) :-
%X - Part
X is (P - 1) mod 3,
%Y - Part
Row is (P - 1) // 9,
Y is 9 * (Row mod 3),
BeginP is P - X - Y.

Musashi

unread,
Nov 8, 2005, 12:46:22 PM11/8/05
to
I wrote a Sudoku solver (targeted for a specific puzzle)
about a month ago in SWI Prolog (which
has come a long long way over a long
period of time, wonderful work Jan).

One thing that saved some work was using
a list function that removed each item from
the list as it was tried. If it worked fine, if not,
backtracking of course automatically puts it back.

I made each row of the puzzle a prolog list
so the first row is
[A11,A12,A13...A19]
and the second row is
[B11,B12,.........B19]
... etc.

Hence, when using a List function that removes each item
from itself, you can use this to take care
of all the row duplicate checks (i.e. each item
in the list will only be used once, guaranteed row
number uniquness).
Hence, the only remaining checks to be made
are for column duplications or for duplications
within the 9, 3x3 sub arrays.

Will post my code if you are interested.

Jim Pannozzi

<ents...@gmail.com> wrote in message
news:1131326792....@f14g2000cwb.googlegroups.com...

maddin

unread,
Nov 10, 2005, 3:17:30 AM11/10/05
to
hey guys,

unfortunately i don't like lists at all. but i think that your solution
Rainer is much more complicatet than my. but ok, i'm glad to see, that
there more solutions, than only my and i'm very impressed you're
familiar with lists. as i said, unfortunately i'm not.
but for those who are interested in my way of solving this problem i
will post the correction a friend gave me when i told him that i've
tried to solve sudoku with prolog.

so here is it:

zahl( 1 ).
zahl( 2 ).
zahl( 3 ).
zahl( 4 ).
zahl( 5 ).
zahl( 6 ).
zahl( 7 ).
zahl( 8 ).
zahl( 9 ).

sudoku(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, F1, F2, F3, F4, F5, F6, F7,
F8, F9, G1, G2, G3, G4, G5, G6, G7, G8, G9, H1, H2, H3, H4, H5, H6, H7,
H8, H9, I1, I2, I3, I4, I5, I6, I7, I8, I9) :-

A3=2,
D3=6,
F3=1,
I3=9,

A4=3,
C4=9,
E4=2,
G4=8,

A6=8,
C6=4,
E6=7,
G6=6,

A7=5,
D7=2,
F7=7,
I7=3,

B9=2,
C9=3,
F9=6,
G9=5,
H9=1,


zahl(A1) , zahl(A2) , A1\=A2 ,
zahl(A3) , A1\=A3 , A2\=A3 ,
zahl(A4) , A1\=A4 , A2\=A4 , A3\=A4 ,
zahl(A5) , A1\=A5 , A2\=A5 , A3\=A5 , A4\=A5 ,
zahl(A6) , A1\=A6 , A2\=A6 , A3\=A6 , A4\=A6 , A5\=A6 ,
zahl(A7) , A1\=A7 , A2\=A7 , A3\=A7 , A4\=A7 , A5\=A7 , A6\=A7 ,
zahl(A8) , A1\=A8 , A2\=A8 , A3\=A8 , A4\=A8 , A5\=A8 , A6\=A8 , A7\=A8
,
zahl(A9) , A1\=A9 , A2\=A9 , A3\=A9 , A4\=A9 , A5\=A9 , A6\=A9 , A7\=A9
, A8\=A9,

zahl(B1) , zahl(B2) , B1\=B2 , A1\=B1 , A2\=B2 ,
zahl(B3) , B1\=B3 , B2\=B3 , A3\=B3 ,
zahl(B4) , B1\=B4 , B2\=B4 , B3\=B4 , A4\=B4 ,
zahl(B5) , B1\=B5 , B2\=B5 , B3\=B5 , B4\=B5 , A5\=B5 ,
zahl(B6) , B1\=B6 , B2\=B6 , B3\=B6 , B4\=B6 , B5\=B6 , A6\=B6 ,
zahl(B7) , B1\=B7 , B2\=B7 , B3\=B7 , B4\=B7 , B5\=B7 , B6\=B7 ,
A7\=B7 ,
zahl(B8) , B1\=B8 , B2\=B8 , B3\=B8 , B4\=B8 , B5\=B8 , B6\=B8 , B7\=B8
, A8\=B8 ,
zahl(B9) , B1\=B9 , B2\=B9 , B3\=B9 , B4\=B9 , B5\=B9 , B6\=B9 , B7\=B9
, B8\=B9, A9\=B9 ,

zahl(C1) , zahl(C2) , C1\=C2 , A1\=C1 , B1\=C1 , A2\=C2 , B2\=C2 ,
zahl(C3) , C1\=C3 , C2\=C3 , A3\=C3 , B3\=C3 ,
zahl(C4) , C1\=C4 , C2\=C4 , C3\=C4 , A4\=C4 , B4\=C4 ,
zahl(C5) , C1\=C5 , C2\=C5 , C3\=C5 , C4\=C5 , A5\=C5 , B5\=C5 ,
zahl(C6) , C1\=C6 , C2\=C6 , C3\=C6 , C4\=C6 , C5\=C6 , A6\=C6 ,
B6\=C6 ,
zahl(C7) , C1\=C7 , C2\=C7 , C3\=C7 , C4\=C7 , C5\=C7 , C6\=C7 ,
A7\=C7 , B7\=C7 ,
zahl(C8) , C1\=C8 , C2\=C8 , C3\=C8 , C4\=C8 , C5\=C8 , C6\=C8 , C7\=C8
, A8\=C8 , B8\=C8 ,
zahl(C9) , C1\=C9 , C2\=C9 , C3\=C9 , C4\=C9 , C5\=C9 , C6\=C9 , C7\=C9
, C8\=C9, A9\=C9 , B9\=C9 ,

zahl(D1) , zahl(D2) , D1\=D2 , A1\=D1 , B1\=D1 , C1\=D1 , A2\=D2 ,
B2\=D2 , C2\=D2 ,
zahl(D3) , D1\=D3 , D2\=D3 , A3\=D3 , B3\=D3 , C3\=D3 ,
zahl(D4) , D1\=D4 , D2\=D4 , D3\=D4 , A4\=D4 , B4\=D4 , C4\=D4 ,
zahl(D5) , D1\=D5 , D2\=D5 , D3\=D5 , D4\=D5 , A5\=D5 , B5\=D5 ,
C5\=D5 ,
zahl(D6) , D1\=D6 , D2\=D6 , D3\=D6 , D4\=D6 , D5\=D6 , A6\=D6 ,
B6\=D6 , C6\=D6 ,
zahl(D7) , D1\=D7 , D2\=D7 , D3\=D7 , D4\=D7 , D5\=D7 , D6\=D7 ,
A7\=D7 , B7\=D7 , C7\=D7 ,
zahl(D8) , D1\=D8 , D2\=D8 , D3\=D8 , D4\=D8 , D5\=D8 , D6\=D8 , D7\=D8
, A8\=D8 , B8\=D8 , C8\=D8 ,
zahl(D9) , D1\=D9 , D2\=D9 , D3\=D9 , D4\=D9 , D5\=D9 , D6\=D9 , D7\=D9
, D8\=D9, A9\=D9 , B9\=D9 , C9\=D9 ,

zahl(E1) , zahl(E2) , E1\=E2 , A1\=E1 , B1\=E1 , C1\=E1 , D1\=E1 ,
A2\=E2 , B2\=E2 , C2\=E2 , D2\=E2 ,
zahl(E3) , E1\=E3 , E2\=E3 , A3\=E3 , B3\=E3 , C3\=E3 , D3\=E3 ,
zahl(E4) , E1\=E4 , E2\=E4 , E3\=E4 , A4\=E4 , B4\=E4 , C4\=E4 ,
D4\=E4 ,
zahl(E5) , E1\=E5 , E2\=E5 , E3\=E5 , E4\=E5 , A5\=E5 , B5\=E5 ,
C5\=E5 , D5\=E5 ,
zahl(E6) , E1\=E6 , E2\=E6 , E3\=E6 , E4\=E6 , E5\=E6 , A6\=E6 ,
B6\=E6 , C6\=E6 , D6\=E6 ,
zahl(E7) , E1\=E7 , E2\=E7 , E3\=E7 , E4\=E7 , E5\=E7 , E6\=E7 ,
A7\=E7 , B7\=E7 , C7\=E7 , D7\=E7 ,
zahl(E8) , E1\=E8 , E2\=E8 , E3\=E8 , E4\=E8 , E5\=E8 , E6\=E8 , E7\=E8
, A8\=E8 , B8\=E8 , C8\=E8 , D8\=E8 ,
zahl(E9) , E1\=E9 , E2\=E9 , E3\=E9 , E4\=E9 , E5\=E9 , E6\=E9 , E7\=E9
, E8\=E9, A9\=E9 , B9\=E9 , C9\=E9 , D9\=E9 ,

zahl(F1) , zahl(F2) , F1\=F2 , A1\=F1 , B1\=F1 , C1\=F1 , D1\=F1 ,
E1\=F1 , A2\=F2 , B2\=F2 , C2\=F2 , D2\=F2 , E2\=F2 ,
zahl(F3) , F1\=F3 , F2\=F3 , A3\=F3 , B3\=F3 , C3\=F3 , D3\=F3 ,
E3\=F3 ,
zahl(F4) , F1\=F4 , F2\=F4 , F3\=F4 , A4\=F4 , B4\=F4 , C4\=F4 ,
D4\=F4 , E4\=F4 ,
zahl(F5) , F1\=F5 , F2\=F5 , F3\=F5 , F4\=F5 , A5\=F5 , B5\=F5 ,
C5\=F5 , D5\=F5 , E5\=F5 ,
zahl(F6) , F1\=F6 , F2\=F6 , F3\=F6 , F4\=F6 , F5\=F6 , A6\=F6 ,
B6\=F6 , C6\=F6 , D6\=F6 , E6\=F6 ,
zahl(F7) , F1\=F7 , F2\=F7 , F3\=F7 , F4\=F7 , F5\=F7 , F6\=F7 ,
A7\=F7 , B7\=F7 , C7\=F7 , D7\=F7 , E7\=F7 ,
zahl(F8) , F1\=F8 , F2\=F8 , F3\=F8 , F4\=F8 , F5\=F8 , F6\=F8 , F7\=F8
, A8\=F8 , B8\=F8 , C8\=F8 , D8\=F8 , E8\=F8 ,
zahl(F9) , F1\=F9 , F2\=F9 , F3\=F9 , F4\=F9 , F5\=F9 , F6\=F9 , F7\=F9
, F8\=F9, A9\=F9 , B9\=F9 , C9\=F9 , D9\=F9 , E9\=F9 ,

zahl(G1) , zahl(G2) , G1\=G2 , A1\=G1 , B1\=G1 , C1\=G1 , D1\=G1 ,
E1\=G1 , F1\=G1 , A2\=G2 , B2\=G2 , C2\=G2 , D2\=G2 , E2\=G2 , F2\=G2 ,
zahl(G3) , G1\=G3 , G2\=G3 , A3\=G3 , B3\=G3 , C3\=G3 , D3\=G3 ,
E3\=G3 , F3\=G3 ,
zahl(G4) , G1\=G4 , G2\=G4 , G3\=G4 , A4\=G4 , B4\=G4 , C4\=G4 ,
D4\=G4 , E4\=G4 , F4\=G4 ,
zahl(G5) , G1\=G5 , G2\=G5 , G3\=G5 , G4\=G5 , A5\=G5 , B5\=G5 ,
C5\=G5 , D5\=G5 , E5\=G5 , F5\=G5 ,
zahl(G6) , G1\=G6 , G2\=G6 , G3\=G6 , G4\=G6 , G5\=G6 , A6\=G6 ,
B6\=G6 , C6\=G6 , D6\=G6 , E6\=G6 , F6\=G6 ,
zahl(G7) , G1\=G7 , G2\=G7 , G3\=G7 , G4\=G7 , G5\=G7 , G6\=G7 ,
A7\=G7 , B7\=G7 , C7\=G7 , D7\=G7 , E7\=G7 , F7\=G7 ,
zahl(G8) , G1\=G8 , G2\=G8 , G3\=G8 , G4\=G8 , G5\=G8 , G6\=G8 , G7\=G8
, A8\=G8 , B8\=G8 , C8\=G8 , D8\=G8 , E8\=G8 , F8\=G8 ,
zahl(G9) , G1\=G9 , G2\=G9 , G3\=G9 , G4\=G9 , G5\=G9 , G6\=G9 , G7\=G9
, G8\=G9, A9\=G9 , B9\=G9 , C9\=G9 , D9\=G9 , E9\=G9 , F9\=G9 ,

zahl(H1) , zahl(H2) , H1\=H2 , A1\=H1 , B1\=H1 , C1\=H1 , D1\=H1 ,
E1\=H1 , F1\=H1 , G1\=H1 , A2\=H2 , B2\=H2 , C2\=H2 , D2\=H2 , E2\=H2 ,
F2\=H2 , G2\=H2 ,
zahl(H3) , H1\=H3 , H2\=H3 , A3\=H3 , B3\=H3 , C3\=H3 , D3\=H3 ,
E3\=H3 , F3\=H3 , G3\=H3 ,
zahl(H4) , H1\=H4 , H2\=H4 , H3\=H4 , A4\=H4 , B4\=H4 , C4\=H4 ,
D4\=H4 , E4\=H4 , F4\=H4 , G4\=H4 ,
zahl(H5) , H1\=H5 , H2\=H5 , H3\=H5 , H4\=H5 , A5\=H5 , B5\=H5 ,
C5\=H5 , D5\=H5 , E5\=H5 , F5\=H5 , G5\=H5 ,
zahl(H6) , H1\=H6 , H2\=H6 , H3\=H6 , H4\=H6 , H5\=H6 , A6\=H6 ,
B6\=H6 , C6\=H6 , D6\=H6 , E6\=H6 , F6\=H6 , G6\=H6 ,
zahl(H7) , H1\=H7 , H2\=H7 , H3\=H7 , H4\=H7 , H5\=H7 , H6\=H7 ,
A7\=H7 , B7\=H7 , C7\=H7 , D7\=H7 , E7\=H7 , F7\=H7 , G7\=H7 ,
zahl(H8) , H1\=H8 , H2\=H8 , H3\=H8 , H4\=H8 , H5\=H8 , H6\=H8 , H7\=H8
, A8\=H8 , B8\=H8 , C8\=H8 , D8\=H8 , E8\=H8 , F8\=H8 , G8\=H8 ,
zahl(H9) , H1\=H9 , H2\=H9 , H3\=H9 , H4\=H9 , H5\=H9 , H6\=H9 , H7\=H9
, H8\=H9 , A9\=H9 , B9\=H9 , C9\=H9 , D9\=H9 , E9\=H9 , F9\=H9 ,
G9\=H9 ,

zahl(I1) , zahl(I2) , I1\=I2 , A1\=I1 , B1\=I1 , C1\=I1 , D1\=I1 ,
E1\=I1 , F1\=I1 , G1\=I1 , H1\=I1 , A2\=I2 , B2\=I2 , C2\=I2 , D2\=I2
, E2\=I2 , F2\=I2 , G2\=I2 , H2\=I2 ,
zahl(I3) , I1\=I3 , I2\=I3 , A3\=I3 , B3\=I3 , C3\=I3 , D3\=I3 ,
E3\=I3 , F3\=I3 , G3\=I3 , H3\=I3 ,
zahl(I4) , I1\=I4 , I2\=I4 , I3\=I4 , A4\=I4 , B4\=I4 , C4\=I4 ,
D4\=I4 , E4\=I4 , F4\=I4 , G4\=I4 , H4\=I4 ,
zahl(I5) , I1\=I5 , I2\=I5 , I3\=I5 , I4\=I5 , A5\=I5 , B5\=I5 ,
C5\=I5 , D5\=I5 , E5\=I5 , F5\=I5 , G5\=I5 , H5\=I5 ,
zahl(I6) , I1\=I6 , I2\=I6 , I3\=I6 , I4\=I6 , I5\=I6 , A6\=I6 ,
B6\=I6 , C6\=I6 , D6\=I6 , E6\=I6 , F6\=I6 , G6\=I6 , H6\=I6 ,
zahl(I7) , I1\=I7 , I2\=I7 , I3\=I7 , I4\=I7 , I5\=I7 , I6\=I7 ,
A7\=I7 , B7\=I7 , C7\=I7 , D7\=I7 , E7\=I7 , F7\=I7 , G7\=I7 , H7\=I7 ,
zahl(I8) , I1\=I8 , I2\=I8 , I3\=I8 , I4\=I8 , I5\=I8 , I6\=I8 , I7\=I8
, A8\=I8 , B8\=I8 , C8\=I8 , D8\=I8 , E8\=I8 , F8\=I8 , G8\=I8 ,
H8\=I8 ,
zahl(I9) , I1\=I9 , I2\=I9 , I3\=I9 , I4\=I9 , I5\=I9 , I6\=I9 , I7\=I9
, I8\=I9, A9\=I9 , B9\=I9 , C9\=I9 , D9\=I9 , E9\=I9 , F9\=I9 ,
G9\=I9 , H9\=I9 ,

% unoptimized

% zahl(A1), zahl(A2), zahl(A3), zahl(A4), zahl(A5), zahl(A6), zahl(A7),
zahl(A8), zahl(A9),
% zahl(B1), zahl(B2), zahl(B3), zahl(B4), zahl(B5), zahl(B6), zahl(B7),
zahl(B8), zahl(B9),
% zahl(C1), zahl(C2), zahl(C3), zahl(C4), zahl(C5), zahl(C6), zahl(C7),
zahl(C8), zahl(C9),
% zahl(D1), zahl(D2), zahl(D3), zahl(D4), zahl(D5), zahl(D6), zahl(D7),
zahl(D8), zahl(D9),
% zahl(E1), zahl(E2), zahl(E3), zahl(E4), zahl(E5), zahl(E6), zahl(E7),
zahl(E8), zahl(E9),
% zahl(F1), zahl(F2), zahl(F3), zahl(F4), zahl(F5), zahl(F6), zahl(F7),
zahl(F8), zahl(F9),
% zahl(G1), zahl(G2), zahl(G3), zahl(G4), zahl(G5), zahl(G6), zahl(G7),
zahl(G8), zahl(G9),
% zahl(H1), zahl(H2), zahl(H3), zahl(H4), zahl(H5), zahl(H6), zahl(H7),
zahl(H8), zahl(H9),
% zahl(I1), zahl(I2), zahl(I3), zahl(I4), zahl(I5), zahl(I6), zahl(I7),
zahl(I8), zahl(I9),

% A1\=A2, A1\=A3, A1\=A4, A1\=A5, A1\=A6, A1\=A7, A1\=A8, A1\=A9,
% A2\=A3, A2\=A4, A2\=A5, A2\=A6, A2\=A7, A2\=A8, A2\=A9,
% A3\=A4, A3\=A5, A3\=A6, A3\=A7, A3\=A8, A3\=A9,
% A4\=A5, A4\=A6, A4\=A7, A4\=A8, A4\=A9,
% A5\=A6, A5\=A7, A5\=A8, A5\=A9,
% A6\=A7, A6\=A8, A6\=A9,
% A7\=A8, A7\=A9,
% A8\=A9,

% B1\=B2, B1\=B3, B1\=B4, B1\=B5, B1\=B6, B1\=B7, B1\=B8, B1\=B9,
% B2\=B3, B2\=B4, B2\=B5, B2\=B6, B2\=B7, B2\=B8, B2\=B9,
% B3\=B4, B3\=B5, B3\=B6, B3\=B7, B3\=B8, B3\=B9,
% B4\=B5, B4\=B6, B4\=B7, B4\=B8, B4\=B9,
% B5\=B6, B5\=B7, B5\=B8, B5\=B9,
% B6\=B7, B6\=B8, B6\=B9,
% B7\=B8, B7\=B9,
% B8\=B9,

% C1\=C2, C1\=C3, C1\=C4, C1\=C5, C1\=C6, C1\=C7, C1\=C8, C1\=C9,
% C2\=C3, C2\=C4, C2\=C5, C2\=C6, C2\=C7, C2\=C8, C2\=C9,
% C3\=C4, C3\=C5, C3\=C6, C3\=C7, C3\=C8, C3\=C9,
% C4\=C5, C4\=C6, C4\=C7, C4\=C8, C4\=C9,
% C5\=C6, C5\=C7, C5\=C8, C5\=C9,
% C6\=C7, C6\=C8, C6\=C9,
% C7\=C8, C7\=C9,
% C8\=C9,

% D1\=D2, D1\=D3, D1\=D4, D1\=D5, D1\=D6, D1\=D7, D1\=D8, D1\=D9,
% D2\=D3, D2\=D4, D2\=D5, D2\=D6, D2\=D7, D2\=D8, D2\=D9,
% D3\=D4, D3\=D5, D3\=D6, D3\=D7, D3\=D8, D3\=D9,
% D4\=D5, D4\=D6, D4\=D7, D4\=D8, D4\=D9,
% D5\=D6, D5\=D7, D5\=D8, D5\=D9,
% D6\=D7, D6\=D8, D6\=D9,
% D7\=D8, D7\=D9,
% D8\=D9,

% E1\=E2, E1\=E3, E1\=E4, E1\=E5, E1\=E6, E1\=E7, E1\=E8, E1\=E9,
% E2\=E3, E2\=E4, E2\=E5, E2\=E6, E2\=E7, E2\=E8, E2\=E9,
% E3\=E4, E3\=E5, E3\=E6, E3\=E7, E3\=E8, E3\=E9,
% E4\=E5, E4\=E6, E4\=E7, E4\=E8, E4\=E9,
% E5\=E6, E5\=E7, E5\=E8, E5\=E9,
% E6\=E7, E6\=E8, E6\=E9,
% E7\=E8, E7\=E9,
% E8\=E9,

% F1\=F2, F1\=F3, F1\=F4, F1\=F5, F1\=F6, F1\=F7, F1\=F8, F1\=F9,
% F2\=F3, F2\=F4, F2\=F5, F2\=F6, F2\=F7, F2\=F8, F2\=F9,
% F3\=F4, F3\=F5, F3\=F6, F3\=F7, F3\=F8, F3\=F9,
% F4\=F5, F4\=F6, F4\=F7, F4\=F8, F4\=F9,
% F5\=F6, F5\=F7, F5\=F8, F5\=F9,
% F6\=F7, F6\=F8, F6\=F9,
% F7\=F8, F7\=F9,
% F8\=F9,

% G1\=G2, G1\=G3, G1\=G4, G1\=G5, G1\=G6, G1\=G7, G1\=G8, G1\=G9,
% G2\=G3, G2\=G4, G2\=G5, G2\=G6, G2\=G7, G2\=G8, G2\=G9,
% G3\=G4, G3\=G5, G3\=G6, G3\=G7, G3\=G8, G3\=G9,
% G4\=G5, G4\=G6, G4\=G7, G4\=G8, G4\=G9,
% G5\=G6, G5\=G7, G5\=G8, G5\=G9,
% G6\=G7, G6\=G8, G6\=G9,
% G7\=G8, G7\=G9,
% G8\=G9,

% H1\=H2, H1\=H3, H1\=H4, H1\=H5, H1\=H6, H1\=H7, H1\=H8, H1\=H9,
% H2\=H3, H2\=H4, H2\=H5, H2\=H6, H2\=H7, H2\=H8, H2\=H9,
% H3\=H4, H3\=H5, H3\=H6, H3\=H7, H3\=H8, H3\=H9,
% H4\=H5, H4\=H6, H4\=H7, H4\=H8, H4\=H9,
% H5\=H6, H5\=H7, H5\=H8, H5\=H9,
% H6\=H7, H6\=H8, H6\=H9,
% H7\=H8, H7\=H9,
% H8\=H9,

% I1\=I2, I1\=I3, I1\=I4, I1\=I5, I1\=I6, I1\=I7, I1\=I8, I1\=I9,
% I2\=I3, I2\=I4, I2\=I5, I2\=I6, I2\=I7, I2\=I8, I2\=I9,
% I3\=I4, I3\=I5, I3\=I6, I3\=I7, I3\=I8, I3\=I9,
% I4\=I5, I4\=I6, I4\=I7, I4\=I8, I4\=I9,
% I5\=I6, I5\=I7, I5\=I8, I5\=I9,
% I6\=I7, I6\=I8, I6\=I9,
% I7\=I8, I7\=I9,
% I8\=I9,


% A1\=B1, A1\=C1, A1\=D1, A1\=E1, A1\=F1, A1\=G1, A1\=H1, A1\=I1,
% B1\=C1, B1\=D1, B1\=E1, B1\=F1, B1\=G1, B1\=H1, B1\=I1,
% C1\=D1, C1\=E1, C1\=F1, C1\=G1, C1\=H1, C1\=I1,
% D1\=E1, D1\=F1, D1\=G1, D1\=H1, D1\=I1,
% E1\=F1, E1\=G1, E1\=H1, E1\=I1,
% F1\=G1, F1\=H1, F1\=I1,
% G1\=H1, G1\=I1,
% H1\=I1,

% A2\=B2, A2\=C2, A2\=D2, A2\=E2, A2\=F2, A2\=G2, A2\=H2, A2\=I2,
% B2\=C2, B2\=D2, B2\=E2, B2\=F2, B2\=G2, B2\=H2, B2\=I2,
% C2\=D2, C2\=E2, C2\=F2, C2\=G2, C2\=H2, C2\=I2,
% D2\=E2, D2\=F2, D2\=G2, D2\=H2, D2\=I2,
% E2\=F2, E2\=G2, E2\=H2, E2\=I2,
% F2\=G2, F2\=H2, F2\=I2,
% G2\=H2, G2\=I2,
% H2\=I2,

% A3\=B3, A3\=C3, A3\=D3, A3\=E3, A3\=F3, A3\=G3, A3\=H3, A3\=I3,
% B3\=C3, B3\=D3, B3\=E3, B3\=F3, B3\=G3, B3\=H3, B3\=I3,
% C3\=D3, C3\=E3, C3\=F3, C3\=G3, C3\=H3, C3\=I3,
% D3\=E3, D3\=F3, D3\=G3, D3\=H3, D3\=I3,
% E3\=F3, E3\=G3, E3\=H3, E3\=I3,
% F3\=G3, F3\=H3, F3\=I3,
% G3\=H3, G3\=I3,
% H3\=I3,

% A4\=B4, A4\=C4, A4\=D4, A4\=E4, A4\=F4, A4\=G4, A4\=H4, A4\=I4,
% B4\=C4, B4\=D4, B4\=E4, B4\=F4, B4\=G4, B4\=H4, B4\=I4,
% C4\=D4, C4\=E4, C4\=F4, C4\=G4, C4\=H4, C4\=I4,
% D4\=E4, D4\=F4, D4\=G4, D4\=H4, D4\=I4,
% E4\=F4, E4\=G4, E4\=H4, E4\=I4,
% F4\=G4, F4\=H4, F4\=I4,
% G4\=H4, G4\=I4,
% H4\=I4,

% A5\=B5, A5\=C5, A5\=D5, A5\=E5, A5\=F5, A5\=G5, A5\=H5, A5\=I5,
% B5\=C5, B5\=D5, B5\=E5, B5\=F5, B5\=G5, B5\=H5, B5\=I5,
% C5\=D5, C5\=E5, C5\=F5, C5\=G5, C5\=H5, C5\=I5,
% D5\=E5, D5\=F5, D5\=G5, D5\=H5, D5\=I5,
% E5\=F5, E5\=G5, E5\=H5, E5\=I5,
% F5\=G5, F5\=H5, F5\=I5,
% G5\=H5, G5\=I5,
% H5\=I5,

% A6\=B6, A6\=C6, A6\=D6, A6\=E6, A6\=F6, A6\=G6, A6\=H6, A6\=I6,
% B6\=C6, B6\=D6, B6\=E6, B6\=F6, B6\=G6, B6\=H6, B6\=I6,
% C6\=D6, C6\=E6, C6\=F6, C6\=G6, C6\=H6, C6\=I6,
% D6\=E6, D6\=F6, D6\=G6, D6\=H6, D6\=I6,
% E6\=F6, E6\=G6, E6\=H6, E6\=I6,
% F6\=G6, F6\=H6, F6\=I6,
% G6\=H6, G6\=I6,
% H6\=I6,

% A7\=B7, A7\=C7, A7\=D7, A7\=E7, A7\=F7, A7\=G7, A7\=H7, A7\=I7,
% B7\=C7, B7\=D7, B7\=E7, B7\=F7, B7\=G7, B7\=H7, B7\=I7,
% C7\=D7, C7\=E7, C7\=F7, C7\=G7, C7\=H7, C7\=I7,
% D7\=E7, D7\=F7, D7\=G7, D7\=H7, D7\=I7,
% E7\=F7, E7\=G7, E7\=H7, E7\=I7,
% F7\=G7, F7\=H7, F7\=I7,
% G7\=H7, G7\=I7,
% H7\=I7,

% A8\=B8, A8\=C8, A8\=D8, A8\=E8, A8\=F8, A8\=G8, A8\=H8, A8\=I8,
% B8\=C8, B8\=D8, B8\=E8, B8\=F8, B8\=G8, B8\=H8, B8\=I8,
% C8\=D8, C8\=E8, C8\=F8, C8\=G8, C8\=H8, C8\=I8,
% D8\=E8, D8\=F8, D8\=G8, D8\=H8, D8\=I8,
% E8\=F8, E8\=G8, E8\=H8, E8\=I8,
% F8\=G8, F8\=H8, F8\=I8,
% G8\=H8, G8\=I8,
% H8\=I8,

% A9\=B9, A9\=C9, A9\=D9, A9\=E9, A9\=F9, A9\=G9, A9\=H9, A9\=I9,
% B9\=C9, B9\=D9, B9\=E9, B9\=F9, B9\=G9, B9\=H9, B9\=I9,
% C9\=D9, C9\=E9, C9\=F9, C9\=G9, C9\=H9, C9\=I9,
% D9\=E9, D9\=F9, D9\=G9, D9\=H9, D9\=I9,
% E9\=F9, E9\=G9, E9\=H9, E9\=I9,
% F9\=G9, F9\=H9, F9\=I9,
% G9\=H9, G9\=I9,
% H9\=I9,

.

my friend said, that it will solve sudoku after 7 seconds and then also
7 seconds later prolog will tell you, that there are no more solutions.
maybe this is just the 'noob-method' because i don't make any use of
lists, but thats the way i learned how to solve such problems (like
these logicals).

keep in mind: solving it with pen and paper makes you even prouder,
than with brute-force power!

have fun with solving,

maddin

Mats

unread,
Nov 10, 2005, 5:21:09 AM11/10/05
to
Folks,

The Sudoku puzzle is all about constraints. Here is a CLPFD
formulation, which is a minimally cleaned-up version of a demo program
that comes with SICStus Prolog. By the way, I recommend Helmut Simoni's
great paper "Sudoku as a Constraint Program", CP2005 Workshop on
Modelling and Reformulating Constraint Satisfaction Problems,
http://4c.ucc.ie/~brahim/cp05ws/

/*
* SICSTUS CLPFD DEMONSTRATION PROGRAM
* Purpose : Car Sequencing Problem
* Author : Mats Carlsson
* Adapted from code by Bjorn Carlson.
*
* The problem is to fill partially filled 9x9 squares of 81 squares
such that
* each row and column are permutations of [1,...,9], and each 3x3
square,
* where the leftmost column modulo 3 is 0, is a permutation of
[1,...,9].
*/
:- module(suudoku, [suudoku/1]).
:- use_module(library(lists), [append/3]).
:- use_module(library(clpfd)).

suudoku(P) :-
Rows = [R1,R2,R3,R4,R5,R6,R7,R8,R9],
problem(P, Rows),
append_all(Rows, Vars),
domain(Vars, 1, 9),
row_constraint(Rows),
column_constraint(R1, R2, R3, R4, R5, R6, R7, R8, R9),
block_constraint(R1, R2, R3),
block_constraint(R4, R5, R6),
block_constraint(R7, R8, R9),
(labeling([ff], Vars) -> true),
display_rows(Rows).

display_rows([]).
display_rows([[X1,X2,X3,X4,X5,X6,X7,X8,X9]|Rows]) :-
format('~d ~d ~d ~d ~d ~d ~d ~d ~d \n',
[X1,X2,X3,X4,X5,X6,X7,X8,X9]),
display_rows(Rows).

row_constraint([]).
row_constraint([R|Rt]) :-
all_distinct(R),
row_constraint(Rt).

column_constraint([], [], [], [], [], [], [], [], []).
column_constraint([X1|R1], [X2|R2], [X3|R3], [X4|R4], [X5|R5], [X6|R6],
[X7|R7], [X8|R8], [X9|R9]) :-
all_distinct([X1,X2,X3,X4,X5,X6,X7,X8,X9]),
column_constraint(R1, R2, R3, R4, R5, R6, R7, R8, R9).


block_constraint([], [], []).
block_constraint([X1,X2,X3|R1], [X4,X5,X6|R2], [X7,X8,X9|R3]) :-
all_distinct([X1,X2,X3,X4,X5,X6,X7,X8,X9]),
block_constraint(R1, R2, R3).

append_all([], []).
append_all([P|R], X) :-
append(P, Y, X),
append_all(R, Y).

problem(1, P) :- % shokyuu
P=[[1,_,_,8,_,4,_,_,_],
[_,2,_,_,_,_,4,5,6],
[_,_,3,2,_,5,_,_,_],
[_,_,_,4,_,_,8,_,5],
[7,8,9,_,5,_,_,_,_],
[_,_,_,_,_,6,2,_,3],
[8,_,1,_,_,_,7,_,_],
[_,_,_,1,2,3,_,8,_],
[2,_,5,_,_,_,_,_,9]].

problem(2, P) :- % shokyuu
P=[[_,_,2,_,3,_,1,_,_],
[_,4,_,_,_,_,_,3,_],
[1,_,5,_,_,_,_,8,2],
[_,_,_,2,_,_,6,5,_],
[9,_,_,_,8,7,_,_,3],
[_,_,_,_,4,_,_,_,_],
[8,_,_,_,7,_,_,_,4],
[_,9,3,1,_,_,_,6,_],
[_,_,7,_,6,_,5,_,_]].

problem(3, P) :- % chuukyuu
P=[[_,_,_,_,_,_,3,_,_],
[_,_,_,8,5,_,_,1,_],
[_,_,2,_,_,4,_,_,9],
[_,3,_,_,_,2,_,_,4],
[8,_,_,_,6,_,_,_,1],
[7,_,_,9,_,_,_,5,_],
[1,_,_,6,_,_,7,_,_],
[_,9,_,_,2,3,_,_,_],
[_,_,4,_,_,_,_,_,_]].

problem(4, P) :- % joukyuu
P=[[_,7,9,_,_,_,_,_,1],
[6,_,_,_,_,_,3,8,_],
[_,_,_,_,4,2,_,_,_],
[_,_,3,9,_,_,_,_,_],
[7,8,_,_,_,_,_,2,5],
[_,_,_,_,_,4,8,_,_],
[_,_,_,3,1,_,_,_,_],
[_,5,6,_,_,_,_,_,7],
[2,_,_,_,_,_,4,3,_]].

problem(5, P) :- % shokyuu; from Mr. Horai
P=[[_,5,_,7,_,1,_,4,_],
[7,_,3,_,_,_,1,_,2],
[_,8,_,4,_,6,_,9,_],
[9,_,4,_,6,_,8,_,3],
[_,_,_,8,_,7,_,_,_],
[1,_,8,_,5,_,6,_,9],
[_,1,_,6,_,3,_,8,_],
[5,_,6,_,_,_,7,_,1],
[_,3,_,5,_,9,_,2,_]].

problem(6, P) :- % Hard: suudoku2 99 (1989)
P=[[8,_,_,_,_,5,_,_,_],
[_,1,2,3,_,_,6,_,_],
[_,4,5,6,_,_,_,2,_],
[_,7,8,_,_,_,_,_,1],
[_,_,_,_,9,_,_,_,_],
[9,_,_,_,_,_,8,7,_],
[_,2,_,_,_,6,5,4,_],
[_,_,4,_,_,3,2,1,_],
[_,_,_,1,_,_,_,_,9]].

end_of_file.

| ?- suudoku(P).

1 5 6 8 9 4 3 2 7
9 2 8 7 3 1 4 5 6
4 7 3 2 6 5 9 1 8
3 6 2 4 1 7 8 9 5
7 8 9 3 5 2 6 4 1
5 1 4 9 8 6 2 7 3
8 3 1 5 4 9 7 6 2
6 9 7 1 2 3 5 8 4
2 4 5 6 7 8 1 3 9
P = 1 ? ;

7 8 2 4 3 5 1 9 6
6 4 9 8 2 1 7 3 5
1 3 5 7 9 6 4 8 2
3 7 4 2 1 9 6 5 8
9 6 1 5 8 7 2 4 3
5 2 8 6 4 3 9 7 1
8 5 6 9 7 2 3 1 4
2 9 3 1 5 4 8 6 7
4 1 7 3 6 8 5 2 9
P = 2 ? ;

4 5 8 2 9 1 3 6 7
3 7 9 8 5 6 4 1 2
6 1 2 3 7 4 5 8 9
9 3 6 5 1 2 8 7 4
8 2 5 4 6 7 9 3 1
7 4 1 9 3 8 2 5 6
1 8 3 6 4 9 7 2 5
5 9 7 1 2 3 6 4 8
2 6 4 7 8 5 1 9 3
P = 3 ? ;

4 7 9 8 6 3 2 5 1
6 1 2 5 9 7 3 8 4
5 3 8 1 4 2 6 7 9
1 2 3 9 8 5 7 4 6
7 8 4 6 3 1 9 2 5
9 6 5 2 7 4 8 1 3
8 4 7 3 1 9 5 6 2
3 5 6 4 2 8 1 9 7
2 9 1 7 5 6 4 3 8
P = 4 ? ;

6 5 9 7 2 1 3 4 8
7 4 3 9 8 5 1 6 2
2 8 1 4 3 6 5 9 7
9 7 4 1 6 2 8 5 3
3 6 5 8 9 7 2 1 4
1 2 8 3 5 4 6 7 9
4 1 2 6 7 3 9 8 5
5 9 6 2 4 8 7 3 1
8 3 7 5 1 9 4 2 6
P = 5 ? ;

8 6 9 2 7 5 1 3 4
7 1 2 3 4 9 6 8 5
3 4 5 6 1 8 9 2 7
4 7 8 5 6 2 3 9 1
2 3 1 8 9 7 4 5 6
9 5 6 4 3 1 8 7 2
1 2 7 9 8 6 5 4 3
6 9 4 7 5 3 2 1 8
5 8 3 1 2 4 7 6 9
P = 6 ? ;
no

Markus Triska

unread,
Nov 10, 2005, 6:15:43 AM11/10/05
to
Hi!

Mats wrote:

> * SICSTUS CLPFD DEMONSTRATION PROGRAM
> * Purpose : Car Sequencing Problem

Here is a version slightly modified to work with the CVS version of SWI
Prolog:

:- use_module(library(bounds)).
:- use_module(library(clp_distinct)).

suudoku(P) :-
Rows = [R1,R2,R3,R4,R5,R6,R7,R8,R9],
problem(P, Rows),
append_all(Rows, Vars),

vars_in(Vars, 1, 9),
Vars in 1..9,


Best regards,
Markus.

Martin Sondergaard

unread,
Nov 18, 2005, 10:14:53 AM11/18/05
to
<ents...@gmail.com> wrote in message
news:1131326792....@f14g2000cwb.googlegroups.com...
> hi folks,
>
> it is 2 o'clock in the morning and i'm also trying to solve sudoku with
> swi-prolog.
>
> after a nice copy & paste - search & replace session, i think, i did i
> finally. but now my nice little swi-prolog tells me, that sudoku/81 is
> not defined. hmpf.
>
> i can't manage it, to attach the source code as a file, so i will post
> it here:
>
> %sudoku with prolog
>
> number(1).
> number(2).
> number(3).
> number(4).
> number(5).
> number(6).
> number(7).
> number(8).
> number(9).
>
> sudoku(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,F1,F2,F3,F4,F5,F6,F7,F8,F9,G1,G2,G3,G4,G5,G6,G7,G8,G9,H1,H2,H3,H4,H5,H6,H7,H8,H9,I1,I2,I3,I4,I5,I6,I7,I8,I9):-
>


I think the problem is that you have used
a space between the word "suduku" and the "(".
This is a common error, for beginners in Prolog.

Also, I think there is a space between the ":" and the "-".
There should be a space before it instead.

Like this...

sudoku(A1, A2, ...etc... I9) :-

Thats the main problem.
Now I will look at the rest of your program...

Thats good.

I like the way you have laid that out,
its easy to see how it works.


I would normally prefer to put spaces around
the "\=" operator.
These spaces are not essential for SWI Prolog to work,
but you should normally use spaces,
they will make your code easier to read.
At least, they usually do.

Like this :

B1 \= B2, B1 \= B3, B1 \= B4, B1 \= B5, B1 \= B6, B1 \= B7, B1 \= B8, B1 \=
B9,


Thats all the horizontal lines done.
They all look correct to me.

Now the vertical lines...


Thats all the vertical lines done.
I think they were all correct.

But I think this bit is wrong...

> A1\=B2, A1\=C2, A1\=B3, A1\=C3,
> B1\=A2, B1\=C2, B1\=A3, B1\=C3,
> C1\=A2, C1\=B2, C1\=A3, C1\=B3,
> A2\=B3, A2\=C3,
> B2\=A3, B2\=C3,
> C2\=A3, C2\=B3,


You must have been trying to make the
9 squares in the top-left-hand corner
all have different numbers.

But I think that it is wrong.

I think that needs to be like this...

A1 \= A2, A1 \= A3,
A1 \= B1, A1 \= B2, A1 \= B3,
A1 \= C1, A1 \= C2, A1 \= C3,
A2 \= A1, A2 \= A3,
A2 \= B1, A2 \= B2, A2 \= B3,
A2 \= C1, A2 \= C2, A2 \= C3,
A3 \= ...etc.

B1\= A1, B1 \= A2,B1 \= A3,
B1 \= ...
B1 \= ...
B2 ...
...
B3 ...
...

C1 ...
C2 ...
C3 ... .

In the lines I have just written, there is some duplication of previous
lines, (e.g. "A1 \= A2" was done previously).
But if you keep these lines here, that will make it easier to read,
so that you can see if your code is correct.
It needs to be complete.

I think the rest of these are also wrong...


The next bit looks correct.


Thats good.


>
> sorry for that, but i don't know how to do it in a different way.
>


No, that is the right way to do it, that is a good design.
I'm very experienced with Prolog, and that is how I would do it.

If you try to do it using lists, it may get complicated,
and it may become harder to do. You might never get it working.
You method is good, it uses "pure" Prolog,
and is likely to work correctly.
Its good to get practice using pure Prolog;
get good at it before you start to use lists.

(One person posted a different solution to this thread,
which uses lists. It looks very complicated,
and will probably not work.)

Once you can use lists, you can make use of them sometimes,
if they will make things easier. But try to keep things simple.

Here is a predicate that you could define
that you could use in your sudoku program.
Its called "all_different/9".
It can be used like this...

?- all_different( 1, 2, 3, 4, 5, 6, 7, 8, 9 ).
yes

?- all_different( 1, 2, 1, 4, 5, 6, 7, 8, 9 ).
no

?-


You can use this predicate like this :

sudoku( ... ) :-
number(A1),
number(A2),
number(A3),
...etc...
all_different( A1, A2, A3, A4, A5, A6, A7, A8, A9 ),
all_different( B1, B2, B3, B4, B5, B6, B7, B8, B9 ),
all_different( C1, C2, C3, C4, C5, C6, C7, C8, C9 ),
...etc...
% Now the verticals.
all_different( A1, B1, B1, D1, E1, F1, G1, H1, I1 ),
all_different( A2, ...etc... ),
% Then the 3 by 3 squares.
all_different( A1, A2, A3, B1, B2, B3, C1, C2, C3 ),
...etc...
.

> i would be deeply grateful, if someone could explain to me, what i did
> wrong.

It was the space between "sudoku" and the "(".
This is a common error for beginners.

> i admit, my way of doing is not so stylish, like Neng-Fa Zhou did it,
> but i'm just a student and in my it-course we solved these logicals and
> we did it that way, so just wanted to try, whether it works or not.
>
> nevertheless i thank everyone who will help me!
>
> greetings from germany,
>
> maddin
>

Greetings from London, in the U.K.

--
Martin Sondergaard.


Jan Wielemaker

unread,
Nov 18, 2005, 11:06:20 AM11/18/05
to
On 2005-11-18, Martin Sondergaard <nob...@nospams.com> wrote:
> ?- all_different( 1, 2, 3, 4, 5, 6, 7, 8, 9 ).
> yes

If you use a list it becomes easy :-)

all_different(List) :-
sort(List, List2), % remove duplicates
same_length(List, List2).

same_length([], []).
same_length([_|T1], [_|T2]) :-
same_length(T1, T2).

--- Jan

Tom Breton

unread,
Nov 18, 2005, 6:08:32 PM11/18/05
to
Jan Wielemaker <j...@nospam.ct.xs4all.nl> writes:

Or perhaps a bit simpler:

all_different(List) :- is_set(List).

--
Tom Breton, the calm-eyed visionary

0 new messages