Я работаю над «Семью языками за семь недель» и просто пытаюсь заставить работать пример из книги. Он решает сетку мини-судоку (4x4).
Автор использует gprolog, но я использую swi-prolog (по какой-то причине мне не удалось заставить gprolog работать на моей виртуальной машине, но swi-prolog сработал с первой попытки).
Я использую Ubuntu 10.04 в VirtualBox 4.0.4 r70112 (надеюсь, это не слишком важно!)
Вот код в моем пролог-файле:
:- use_module(library(clpfd)).
valid([]).
valid([Head|Tail]) :-
all_different(Head), % in the book, this is 'fd_all_different'
valid(Tail).
% beginning of sudoku rule itself
sudoku(Puzzle, Solution) :-
Solution = Puzzle,
Puzzle = [S11, S12, S13, S14,
S21, S22, S23, S24,
S31, S32, S33, S34,
S41, S42, S43, S44],
Puzzle ins 1..4, % in the book, this is 'fd_domain'
Row1 = [S11, S12, S13, S14],
Row2 = [S21, S22, S23, S24],
Row3 = [S31, S32, S33, S34],
Row4 = [S41, S42, S43, S44],
Col1 = [S11, S21, S31, S41],
Col2 = [S12, S22, S32, S42],
Col3 = [S13, S23, S33, S43],
Col4 = [S14, S24, S34, S44],
Square1 = [S11, S12, S21, S22],
Square2 = [S13, S14, S23, S24],
Square3 = [S31, S32, S41, S42],
Square4 = [S33, S34, S43, S44],
valid([Row1, Row2, Row3, Row4,
Col1, Col2, Col3, Col4,
Square1, Square2, Square3, Square4]).
Единственные части, которые я (намеренно) изменил, были:
- добавление
use_module(library(clpfd)).
вверху - изменение
fd_all_different(Head),
наall_different(Head),
- изменение
fd_domain(Puzzle, 1, 4),
наPuzzle ins 1..4,
Вот вызов от swipl
?- sudoku([_, _, 2, 3,
_, _, _, _,
_, _, _, _,
3, 4, _, _],
Solution).
Solution = [4, 1, 2, 3, 2, 3, 4, 1, 1|...] ;
false.
Решение правильно до тех пор, пока оно не обрывается, и в этот момент пролог, кажется, определяет, что решения нет. Но есть:
4 1 2 3
2 3 4 1
1 2 3 4
3 4 1 2
Я просмотрел код в поисках опечатки или неуместного столбца, но не смог найти источник этого. Любые идеи?
:- use_module(library(clpfd))
? - person Fred Foo   schedule 11.04.2011