进行考试并回答过去的论文问题以帮助我修改。我想回答的问题是: (d)将CSP翻译成Prolog程序,该程序只计算一种方式 使用有限域约束解决此问题。 [7分]
我写了以下代码:
kakuro(L):-
L = [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16],
L ins 1..9,
Z1 = [X1, X2],
all_different(Z1),
X1 #= 5 - X2,
Z2 = [X3, X4, X5, X6],
all_different(Z2),
X3 #= 29 - (X4+X5+X6),
Z3 = [X7, X8],
all_different(Z3),
X7 #= 14 - X8,
Z4 = [X9, X10],
all_different(Z4),
X9 #= 4 - X10,
Z5 = [X11, X12, X13, X14],
all_different(Z5),
X11 #= 16 - (X12+X13+X14),
Z6 = [X15, X16],
all_different(Z6),
X15 #= 7 - X16,
A1 = [X3, X7],
all_different(A1),
X3 #= 16 - X7,
A2 = [X1, X4, X8, X11],
all_different(A2),
X1 #= 18 - (X4+X8+X11),
A3 = [X2, X5],
all_different(A3),
X2 #= 13 - X5,
A4 = [X12, X15],
all_different(A4),
X12 #= 14 - X15,
A5 = [X6, X9, X13, X16],
all_different(A5),
X6 #= 11 - (X9+X13+X16),
A6 = [X10, X14],
all_different(A6),
X10 #= 3 - X14,
labeling([], L).
我认为我的答案有点太长了。有什么方法可以缩短它吗?
非常感谢任何帮助!
答案 0 :(得分:1)
我向您展示了第一个空行的简化:
kakuro(Ls):- Lss = [[X1,X2], [X3,X4,X5,X6], [X7,X8], [X9,X10], [X11,X12,X13,X14], [X15, X16]], maplist(all_different, Lss), append(Lss, Ls), Ls ins 1..9, X1 #= 5 - X2, X3 #= 29 - (X4+X5+X6), X7 #= 14 - X8, X9 #= 4 - X10, X11 #= 16 - (X12+X13+X14), X15 #= 7 - X16,
特别注意:
maplist/2
用于替换all_different/1
的多个单独来电。append/2
用于删除一级嵌套。我强烈推荐的另一个更改:从labeling/2
中分离核心关系!这简化了测试并具有许多其他优点。最终查询应类似于:
?- kakuro(Vs), label(Vs).
或者喜欢:
?- kakuro_(Instance, Vs), label(Vs).
我进一步简化了这个,以及程序的其余部分,作为练习。请注意,实例表示的选择有助于显着缩短代码!