2013-05-16 20 views
5

OK, also versuche ich diesen einfachen Sudoku-Löser für ein Schulprojekt zu programmieren. Ich verwende SWI - Prolog und verwende die Bibliothek clpfd.Prolog fd_domain ist undefiniert

Das Problem tritt auf, wenn ich Domäne/3-Prädikat verwende. Es gibt keine Syntaxfehler whatsover, nur das Programm gibt "falsches" anstatt die tatsächliche Lösung zurück.

Entschuldigung für meine Noobness, aber ich bin völlig neu in Prolog und deklarativen Sprachen.

Hier ist mein vollständiger Code:

:- use_module(library(clpfd)). 

sudoku(Solution,Puzzle):- 

    Solution = Puzzle, 
    Solution =[[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]], 

    valid_domain(Puzzle,1,9), 

    %Squares 

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


    %Rows 

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

    %Columns 

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

    valid([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Sqr1, Sqr2, Sqr3, Sqr4, Sqr5, Sqr6, Sqr7, Sqr8, Sqr9]), 

    show([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9]). 

valid_domain(List, Min, Max):- 
    domain(List, Min, Max). %HERE IS THE ERROR% 

valid([]). 
valid([H|T]):- 
all_different(H), 
valid(T). 

show([]). 
show([H,T]):- 
    show_row(H), 
    write('|'), nl, 
    show(T). 

show_row([]). 
show_row([H,T]):- 
    write('|'), 
    write(H), 
    show_row(T). 

Meine Suche:

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

Antwort

3

SWI-Prolog-Bibliothek (clpfd) keine Domain/3.

Versuchen

valid_domain(List, Min, Max):- 
    List ins Min..Max. 

und Sie sollten einige Tippfehler korrigieren:

show([H|T]):- 
... 
show_row([H|T]):- 
... 

EDIT: Wenn Sie die 'Liste der Liste' Darstellung halten, sollten Sie schreiben

valid_domain(List, Min, Max) :- 
    flatten(List, Temp), Temp ins Min..Max. 

natürlich, den Anruf auskommentieren. Ich habe mich geirrt und vorgeschlagen, es zu tun.

EDIT: Da der Eingang 'Formen' die Daten, passen die variable Lösungen:

sudoku(Solution,Puzzle):- 
    Solution = Puzzle, 
    Solution = 
    [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 
    ], 

    Solution ins 1..9, 

    %Squares 
    ... 

und Label/1 vor der Anzeige hinzufügen:

... 
    label(Solution), 
    show([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9]). 

nach diesen alle Korrekturen, ich get

|4|8|7|3|5|1|9|6|2| 
|9|1|5|4|2|6|7|8|3| 
|2|3|6|7|8|9|5|4|1| 
|3|9|4|8|1|5|6|2|7| 
|1|6|2|9|7|4|3|5|8| 
|5|7|8|2|6|3|1|9|4| 
|6|4|3|1|9|8|2|7|5| 
|7|5|1|6|4|2|8|3|9| 
|8|2|9|5|3|7|4|1|6| 
+0

Großartig! Das hat funktioniert .. Aber jetzt habe ich das Problem, dass es falsch zurückkehrt ... Irgendeine Idee, was könnte das logische Problem verursachen? – Cuta

+0

Es ist schwer zu sagen, denn es könnte ein einfacher Tippfehler sein, der die Logik ungültig macht. I.e. In Quadraten könnte ein Tausch einer Variablen ein gültiges Sudoku unlösbar machen. Anstatt all diese hässliche Nummerierung 'von Hand' zu tun, siehe einen Solver wie [this] ( – CapelliC

+0

) Sorry, vielleicht habe ich das Problem gefunden: entferne 'valid_domain (Puzzle, 1,9),' – CapelliC