Prolog不明确的输出

时间:2013-02-16 17:15:29

标签: prolog sudoku

我正在Prolog中写一个迷你数独求解器。数独包含4x4字段,例如

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

如果数独只有一个可能的解决方案(如上面的数独),我的程序按预期工作。但是如果我用一个间隙替换至少一个给定的字段(例如用_替换4),Prolog的输出是这样的:

[_#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).

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的Prolog会建议您使用多种解决方案,并在商店中显示残留约束。您需要标记变量,即让引擎枚举有效值。

?- 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]