Неоднозначный вывод пролога

Я пишу мини-решатель судоку на Прологе. Судоку состоит из полей 4x4, например.

_ _ 2 3
_ _ _ _
_ _ _ _
3 4 _ _

Если судоку имеет только одно возможное решение (как судоку выше), моя программа работает, как и ожидалось. Но если я заменю хотя бы одно заданное поле пробелом (например, заменив 4 на _), вывод Пролога будет таким:

[_#3(1:4),_#23(1:4),2,3.....

Я предполагаю, что «_ # 3 (1: 4)» означает «возьмите 1 или 4», но я хочу, чтобы каждое решение было в отдельном однозначном списке. Это мой код:

sudoku(Puzzle,Solution):-
        Puzzle=Solution,
        fd_domain(Solution,1,4),

        Puzzle=[S11,S12,S13,S14,
            S21,S22,S23,S24,
            S31,S32,S33,S34,
            S41,S42,S43,S44],

        fd_all_different([S11,S12,S13,S14]),
        fd_all_different([S21,S22,S23,S24]),
        fd_all_different([S31,S32,S33,S34]),
        fd_all_different([S41,S42,S43,S44]),

        fd_all_different([S11,S21,S31,S41]),
        fd_all_different([S12,S22,S32,S42]),
        fd_all_different([S13,S23,S33,S43]),
        fd_all_different([S14,S24,S34,S44]),

        fd_all_different([S11,S12,S21,S22]),
        fd_all_different([S13,S14,S23,S24]),
        fd_all_different([S31,S32,S41,S42]),
        fd_all_different([S33,S34,S43,S44]).

Когда я загрузил его в Gnu Prolog, я набрал следующий запрос:

sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,_,_,_],Sol).

Что я делаю неправильно?


person Elayn    schedule 16.02.2013    source источник


Ответы (1)


ваш Пролог предлагает несколько решений, показывая имеющиеся остаточные ограничения. Вам нужно пометить переменные, т. е. позволить движку перечислить допустимые значения.

?- sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,_,_,_],Sol),fd_labeling(Sol).

Sol = [1,4,2,3,2,3,1,4,4,1,3,2,3,2,4,1] ? ;

Sol = [1,4,2,3,2,3,1,4,4,2,3,1,3,1,4,2] ? ;

Sol = [1,4,2,3,2,3,4,1,4,1,3,2,3,2,1,4] ? ;

Sol = [4,1,2,3,2,3,1,4,1,4,3,2,3,2,4,1] ? ;

Sol = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2] ? ;

Sol = [4,1,2,3,2,3,4,1,1,4,3,2,3,2,1,4]
person CapelliC    schedule 16.02.2013
comment
Итак, когда я использую функции FD в своем коде, мне всегда приходится применять fd_labeling, поскольку значения FD представлены иначе, чем обычные значения пролога? - person Elayn; 16.02.2013
comment
да. Это не больно. Как вы уже поняли, когда ограничения достаточно «сильны», решение уже «пригодно для использования». - person CapelliC; 17.02.2013