繁体   English   中英

Kakuro Puzzle CSP Prolog

[英]Kakuro Puzzle CSP Prolog

角斗谜

有一个考试即将到来并回答过去的论文问题以帮助我复习。 我要回答的问题是: (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).

我觉得我的回答有点长。 有什么办法可以缩短它吗?

真的很感激任何帮助!

我向您展示了第一个空行的简化:

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许多单独调用。
  • 一个系统的命名规则:列出与“-s”结尾,列出清单的结尾处的“S”追加到这一点
  • append/2用于删除一层嵌套。

我强烈推荐的另一个更改:核心关系与labeling/2分开 这简化了测试并具有许多其他优点。 最终查询应类似于:

?- kakuro(Vs), label(Vs).

或喜欢:

?- kakuro_(Instance, Vs), label(Vs).

我将进一步简化这一点以及程序的其余部分,作为您的练习。 请注意,实例表示的选择可以显着缩短代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM