Es ist in Prolog zwar relativ straight forward, sowas zu formulieren, aber wenn der Suchraum exponentiell ist, dann wird der Interpreter auch exponentiell lang suchen...
Was extrem ineffizient ist, ist daß dein Programm (sehr oft) alle möglichen Kombinationen der Ziffern 1 bis 9 aufzählt und erst dann auf Ungleichheit testet. Besser ist sicher, zuerst mit dif/2 alle Constraints zuzusichern und erst dann die Variablen mit Werten zu belegen. dif/2 unterscheidet sich von =\= und anderen Ungleichheitsprädikaten darin, daß die Argumente noch nicht instanziiert sein müssen; wenn irgendwann später mal beide bekannt sind, wird erst verglichen. Damit schließt man schon während der Aufzählung möglichst früh ungünstige Konstellationen aus.
zahl(1). zahl(2). zahl(3).
zahl(4). zahl(5). zahl(6).
zahl(7). zahl(8). zahl(9).
unterschiedlich(A,B,C,D,E,F,G,H,I) :-
dif(A,B), dif(A,C), dif(A,D), dif(A,E), dif(A,F), dif(A,G), dif(A,H), dif(A,I),
dif(B,C), dif(B,D), dif(B,E), dif(B,F), dif(B,G), dif(B,H), dif(B,I),
dif(C,D), dif(C,E), dif(C,F), dif(C,G), dif(C,H), dif(C,I),
dif(D,E), dif(D,F), dif(D,G), dif(D,H), dif(D,I),
dif(E,F), dif(E,G), dif(E,H), dif(E,I),
dif(F,G), dif(F,H), dif(F,I),
dif(G,H), dif(G,I),
dif(H,I).
zahlen(A,B,C,D,E,F,G,H,I) :-
zahl(A), zahl(B), zahl(C),
zahl(D), zahl(E), zahl(F),
zahl(G), zahl(H), zahl(I).
sudoku( X11,X12,X13,X14,X15,X16,X17,X18,X19,
X21,X22,X23,X24,X25,X26,X27,X28,X29,
X31,X32,X33,X34,X35,X36,X37,X38,X39,
X41,X42,X43,X44,X45,X46,X47,X48,X49,
X51,X52,X53,X54,X55,X56,X57,X58,X59,
X61,X62,X63,X64,X65,X66,X67,X68,X69,
X71,X72,X73,X74,X75,X76,X77,X78,X79,
X81,X82,X83,X84,X85,X86,X87,X88,X89,
X91,X92,X93,X94,X95,X96,X97,X98,X99) :-
% zeilen
unterschiedlich(X11,X12,X13,X14,X15,X16,X17,X18,X19),
unterschiedlich(X21,X22,X23,X24,X25,X26,X27,X28,X29),
unterschiedlich(X31,X32,X33,X34,X35,X36,X37,X38,X39),
unterschiedlich(X41,X42,X43,X44,X45,X46,X47,X48,X49),
unterschiedlich(X51,X52,X53,X54,X55,X56,X57,X58,X59),
unterschiedlich(X61,X62,X63,X64,X65,X66,X67,X68,X69),
unterschiedlich(X71,X72,X73,X74,X75,X76,X77,X78,X79),
unterschiedlich(X81,X82,X83,X84,X85,X86,X87,X88,X89),
unterschiedlich(X91,X92,X93,X94,X95,X96,X97,X98,X99),
% spalten
unterschiedlich(X11,X21,X31,X41,X51,X61,X71,X81,X91),
unterschiedlich(X12,X22,X32,X42,X52,X62,X72,X82,X92),
unterschiedlich(X13,X23,X33,X43,X53,X63,X73,X83,X93),
unterschiedlich(X14,X24,X34,X44,X54,X64,X74,X84,X94),
unterschiedlich(X15,X25,X35,X45,X55,X65,X75,X85,X95),
unterschiedlich(X16,X26,X36,X46,X56,X66,X76,X86,X96),
unterschiedlich(X17,X27,X37,X47,X57,X67,X77,X87,X97),
unterschiedlich(X18,X28,X38,X48,X58,X68,X78,X88,X98),
unterschiedlich(X19,X29,X39,X49,X59,X69,X79,X89,X99),
% kaestchen
unterschiedlich(X11,X12,X13,X21,X22,X23,X31,X32,X33),
unterschiedlich(X14,X15,X16,X24,X25,X26,X34,X35,X36),
unterschiedlich(X17,X18,X19,X27,X28,X29,X37,X38,X39),
unterschiedlich(X41,X42,X43,X51,X52,X53,X61,X62,X63),
unterschiedlich(X44,X45,X46,X54,X55,X56,X64,X65,X66),
unterschiedlich(X47,X48,X49,X57,X58,X59,X67,X68,X69),
unterschiedlich(X71,X72,X73,X81,X82,X83,X91,X92,X93),
unterschiedlich(X74,X75,X76,X84,X85,X86,X94,X95,X96),
unterschiedlich(X77,X78,X79,X87,X88,X89,X97,X98,X99),
% alles zahlen
zahlen(X11,X12,X13,X14,X15,X16,X17,X18,X19),
zahlen(X21,X22,X23,X24,X25,X26,X27,X28,X29),
zahlen(X31,X32,X33,X34,X35,X36,X37,X38,X39),
zahlen(X41,X42,X43,X44,X45,X46,X47,X48,X49),
zahlen(X51,X52,X53,X54,X55,X56,X57,X58,X59),
zahlen(X61,X62,X63,X64,X65,X66,X67,X68,X69),
zahlen(X71,X72,X73,X74,X75,X76,X77,X78,X79),
zahlen(X81,X82,X83,X84,X85,X86,X87,X88,X89),
zahlen(X91,X92,X93,X94,X95,X96,X97,X98,X99).
Alles anzeigen
Das ist mit deinem Testfall ziemlich schnell: 429,041 inferences, 0.34 CPU in 0.38 seconds (89% CPU, 1261885 Lips)
Ob auch das Ergebnis stimmt, kann wer anderer überprüfen 
Hübscher wäre das ganze übrigens mit Listen, aber was soll's. Und auch mit Constraints, siehe 11.8 im SWI-Manual.