2013-05-16 10 views
5

OK, quindi sto provando a codificare questo semplice risolutore di sudoku per un progetto scolastico. Sto usando SWI - Prolog e sto usando la libreria clpfd.Prolog fd_domain non è definito

Il problema si presenta quando utilizzo il predicato domain/3. Non sta dando errori di sintassi, ma solo il programma restituisce "false" piuttosto che la soluzione effettiva.

Mi scusi per il mio Noobness, ma sono completamente nuovo al Prolog e alle lingue dichiarative.

Ecco il mio codice completo:

:- 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). 

la mia domanda:

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,_]). 

risposta

3

biblioteca SWI-Prolog (clpfd) non dispone di dominio/3.

Provate

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

e si dovrebbe correggere alcuni errore di battitura:

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

EDIT: Se si mantiene l' 'elenco di lista' di rappresentanza, si dovrebbe scrivere

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

ovviamente togliere il commento alla chiamata. Ho sbagliato a suggerire di fare.

EDIT: Poiché l'ingresso 'forme' i dati, adattare la variabile Solutions:

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 
    ... 

e aggiungere un'etichetta/1 prima visualizzazione:

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

dopo tutte queste correzioni, I 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

Grande! Ha funzionato .. Comunque ora ho il problema che sta restituendo false ... Qualche idea che cosa potrebbe causare il problema logico? – Cuta

+0

È difficile da dire, perché potrebbe essere un semplice refuso che invalida la logica. Cioè nei quadrati uno scambio di una variabile potrebbe rendere irrisolvibile un sudoku valido. Invece di fare tutte quelle brutte numerazioni 'a mano' vedi un risolutore come [questo] (http://www.swi-prolog.org/pldoc/doc_for?object=transpose/2) – CapelliC

+0

Scusa, forse ho trovato il problema: rimuovere 'valid_domain (Puzzle, 1,9),' – CapelliC