declare
proc {Sudoku P ?Grid}
%% Creo la lista di 9 elementi, tutti UNBOUND inizialmente
Grid = {List.make 9}
%% Popola ogni elemento di Grid con un'altra lista, aventi 9 elementi con valore 1#9 (range di valori ammissibili del sudoku)
{List.forAll Grid proc {$ Row} Row = {FD.list 9 1#9} end}
%% Vincoli RIGA
for I in 1..9 do
{FD.distinct {Nth Grid I}} %% Nth estrae l'iesimo elemento da Grid, la distinct verifica che non si ripetano elementi
end
%% Vincoli COLONNA
for J in 1..9 do
{FD.distinct {List.map Grid fun {$ Row}
{Nth Row J}
end
}
}
end
%% Vincoli BLOCCO
for BI in 0..2 do
for BJ in 0..2 do
Block = for I in 1..3 collect:Collect do
for J in 1..3 do
{Collect {Nth {Nth Grid (3*BI+I)} (3*BJ+J)}}
end
end
in
{FD.distinct Block}
end
end
%% Vincoli sui Valori
{List.forAllInd P
proc {$ Y R}
Row = {Nth Grid Y}
in
{List.forAllInd R
proc {$ X I}
if {Not {IsFree I}} then
{Nth Row X} :: I
end
end
}
end
}
{FD.distribute ff {Flatten Grid}} %% la FD accetta solo LISTE semplici, e non liste di liste, quindi uso la Flatten su Grid
end
declare
Puzzle=[
[_ _ _ 6 _ _ _ _ 4]
[8 _ _ _ _ _ _ 7 _]
[_ _ 5 _ _ 9 _ _ 3]
[_ _ _ 8 _ _ 2 _ 1]
[_ 9 _ _ _ _ _ 6 _]
[4 _ 6 _ _ 3 _ _ _]
[1 _ _ 2 _ _ 5 _ _]
[_ 7 _ _ _ _ _ _ 8]
[3 _ _ _ _ 4 _ _ _]
]
{Browse {Search.base.one proc{$ Sol} {Sudoku Puzzle Sol} end}}
ZGVjbGFyZQpwcm9jIHtTdWRva3UgUCA/R3JpZH0KICAgJSUgQ3JlbyBsYSBsaXN0YSBkaSA5IGVsZW1lbnRpLCB0dXR0aSBVTkJPVU5EIGluaXppYWxtZW50ZQogICBHcmlkID0ge0xpc3QubWFrZSA5fQogICAlJSBQb3BvbGEgb2duaSBlbGVtZW50byBkaSBHcmlkIGNvbiB1bidhbHRyYSBsaXN0YSwgYXZlbnRpIDkgZWxlbWVudGkgY29uIHZhbG9yZSAxIzkgKHJhbmdlIGRpIHZhbG9yaSBhbW1pc3NpYmlsaSBkZWwgc3Vkb2t1KQogICB7TGlzdC5mb3JBbGwgR3JpZCBwcm9jIHskIFJvd30gUm93ID0ge0ZELmxpc3QgOSAxIzl9IGVuZH0KICAgJSUgVmluY29saSBSSUdBCiAgIGZvciBJIGluIDEuLjkgZG8KICAgICAge0ZELmRpc3RpbmN0IHtOdGggR3JpZCBJfX0gJSUgTnRoIGVzdHJhZSBsJ2llc2ltbyBlbGVtZW50byBkYSBHcmlkLCBsYSBkaXN0aW5jdCB2ZXJpZmljYSBjaGUgbm9uIHNpIHJpcGV0YW5vIGVsZW1lbnRpCiAgIGVuZAogICAlJSBWaW5jb2xpIENPTE9OTkEKICAgZm9yIEogaW4gMS4uOSBkbwogICAgICB7RkQuZGlzdGluY3Qge0xpc3QubWFwIEdyaWQgZnVuIHskIFJvd30KCQkJCSAgICAge050aCBSb3cgSn0KCQkJCSAgZW5kCgkJICAgfQogICAgICB9CiAgIGVuZAogICAlJSBWaW5jb2xpIEJMT0NDTwogICBmb3IgQkkgaW4gMC4uMiBkbwogICAgICBmb3IgQkogaW4gMC4uMiBkbwoJIEJsb2NrID0gZm9yIEkgaW4gMS4uMyBjb2xsZWN0OkNvbGxlY3QgZG8KCQkgICAgZm9yIEogaW4gMS4uMyBkbwoJCSAgICAgICB7Q29sbGVjdCB7TnRoIHtOdGggR3JpZCAoMypCSStJKX0gKDMqQkorSil9fQoJCSAgICBlbmQKCQkgZW5kCiAgICAgIGluCgkge0ZELmRpc3RpbmN0IEJsb2NrfQogICAgICBlbmQKICAgZW5kCiAgICUlIFZpbmNvbGkgc3VpIFZhbG9yaQogICB7TGlzdC5mb3JBbGxJbmQgUAogICAgcHJvYyB7JCBZIFJ9CiAgICAgICBSb3cgPSB7TnRoIEdyaWQgWX0KICAgIGluCiAgICAgICB7TGlzdC5mb3JBbGxJbmQgUgoJcHJvYyB7JCBYIEl9CgkgICBpZiB7Tm90IHtJc0ZyZWUgSX19IHRoZW4KCSAgICAgIHtOdGggUm93IFh9IDo6IEkKCSAgIGVuZAoJZW5kCiAgICAgICB9CiAgICBlbmQKICAgfQogICB7RkQuZGlzdHJpYnV0ZSBmZiB7RmxhdHRlbiBHcmlkfX0gJSUgbGEgRkQgYWNjZXR0YSBzb2xvIExJU1RFIHNlbXBsaWNpLCBlIG5vbiBsaXN0ZSBkaSBsaXN0ZSwgcXVpbmRpIHVzbyBsYSBGbGF0dGVuIHN1IEdyaWQKZW5kCmRlY2xhcmUKUHV6emxlPVsKCVtfIF8gXyA2IF8gXyBfIF8gNF0KCVs4IF8gXyBfIF8gXyBfIDcgX10KCVtfIF8gNSBfIF8gOSBfIF8gM10KCVtfIF8gXyA4IF8gXyAyIF8gMV0KCVtfIDkgXyBfIF8gXyBfIDYgX10KCVs0IF8gNiBfIF8gMyBfIF8gX10KCVsxIF8gXyAyIF8gXyA1IF8gX10KCVtfIDcgXyBfIF8gXyBfIF8gOF0KCVszIF8gXyBfIF8gNCBfIF8gX10KICAgICAgIF0Ke0Jyb3dzZSB7U2VhcmNoLmJhc2Uub25lIHByb2N7JCBTb2x9IHtTdWRva3UgUHV6emxlIFNvbH0gZW5kfX0=
Mozart Compiler 1.4.0 (20080704) playing Oz 3
%%% feeding file prog.oz
%********************* binding analysis error *******************
%**
%** variable FD not introduced
%**
%** in file "./prog.oz", line 6, column 41
%********************* binding analysis error *******************
%**
%** variable FD not introduced
%**
%** in file "./prog.oz", line 9, column 7
%********************* binding analysis error *******************
%**
%** variable FD not introduced
%**
%** in file "./prog.oz", line 13, column 7
%********************* binding analysis error *******************
%**
%** variable FD not introduced
%**
%** in file "./prog.oz", line 28, column 3
%********************* binding analysis error *******************
%**
%** variable FD not introduced
%**
%** in file "./prog.oz", line 45, column 4
%** ------------------ rejected (5 errors)