Prolog模糊输出
我正在用Prolog编写一个迷你数独解算器。数独由4x4字段组成,例如Prolog模糊输出,prolog,sudoku,Prolog,Sudoku,我正在用Prolog编写一个迷你数独解算器。数独由4x4字段组成,例如 _ _ 2 3 _ _ _ _ _ _ _ _ 3 4 _ _ 如果数独只有一种可能的解决方案(如上面的数独),那么我的程序会按预期工作。但是,如果我用一个间隙替换至少一个给定字段(例如,用4替换4),Prolog的输出如下: [_#3(1:4),_#23(1:4),2,3..... 我猜“#3(1:4)”的意思是“取1或4”,但我希望每个解决方案都在一个单独的、不含糊的列表中。这是我的代码: sudoku(Puzzle
_ _ 2 3
_ _ _ _
_ _ _ _
3 4 _ _
如果数独只有一种可能的解决方案(如上面的数独),那么我的程序会按预期工作。但是,如果我用一个间隙替换至少一个给定字段(例如,用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).
我做错了什么?您的序言建议您使用多种解决方案,并显示了存储中的剩余约束。您需要标记变量,即让引擎枚举有效值
?- 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]
因此,当我在代码中使用FD函数时,我总是必须应用FD_标签,因为FD值的表示方式与普通prolog值不同?是的。不痛。正如您已经体验到的,当约束足够“强”时,解决方案已经“可用”。