我正在开发一款名为" Logic Dots"的逻辑游戏。游戏是一个3 * 3网格,每行和每列都有数字。规则很容易,每行和每列的总和应该等于这些数字。下面是我的代码,它是从clpfd sokoku更改的。但结果是错误的。
代码:
:- use_module(library(clpfd)).
kakuro(Rows) :-
length(Rows, 3), maplist(length_list(3), Rows),
append(Rows, Vs), Vs ins 0..1,
Rows = [A,B,C],
sum(A,#=,1),
sum(B,#=,1),
sum(C,#=,1),
transpose(Rows, Columns),
append(Columns, V), V ins 0..1,
Columns = [D,E,F],
sum(D,#=,1),
sum(E,#=,1),
sum(F,#=,1),
Rows = [A,B,C].
length_list(L,Ls) :- length(Ls,L).
problem([1,0,0,1,0,0], [[_,_,_],
[_,_,_],
[_,_,_]]).
结果:
?- problem([1,0,0,1,0,0], Rows), kakuro(Rows), maplist(writeln, Rows).
[_G670,_G673,_G676]
[_G682,_G685,_G688]
[_G694,_G697,_G700]
Rows = [[_G4520, _G4523, _G4526], [_G4532, _G4535, _G4538], [_G4544, _G4547, _G4550]],
_G4520 in 0..1,
_G4520+_G4532+_G4544#=1,
_G4520+_G4523+_G4526#=1,
_G4532 in 0..1,
_G4532+_G4535+_G4538#=1,
_G4535 in 0..1,
_G4523+_G4535+_G4547#=1,
_G4523 in 0..1,
_G4526 in 0..1,
_G4526+_G4538+_G4550#=1,
_G4538 in 0..1,
_G4550 in 0..1,
_G4544+_G4547+_G4550#=1,
_G4544 in 0..1,
_G4547 in 0..1.
但是当我用[[_,0,0],[0,_,0],[0,0,_]]
替换我的谜题时,结果是正确的:
?- problem([1,0,0,1,0,0], Rows), kakuro(Rows), maplist(writeln, Rows).
[1,0,0]
[0,1,0]
[0,0,1]
Rows = [[1, 0, 0], [0, 1, 0], [0, 0, 1]].
但我需要网格未知(符号" _")。错误在哪里?
我将kakuro/1
中最后一行的Rows = [A,B,C]更改为label(Vs)
。它有效,但只有一个结果显示:
[0,0,1]
[0,1,0]
[1,0,0]
应该有另一个:
[1,0,0]
[0,1,0]
[0,0,1]
这里有什么问题?