逻辑点与SWI-Prolog的拼图问题

时间:2015-02-02 03:02:30

标签: list prolog logic clpfd

我正在开发一款名为" 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]

这里有什么问题?

0 个答案:

没有答案