解决Prolog中的Kakuro拼图(5x5)

Ale*_*kas 7 prolog clpfd

在此输入图像描述

假如说:

A+B+C=24
E+F+G=11
J+K+L=22
N+O+P=14
A+E=17
B+F+J+N=26
C+G+K+O=15
L+P=13
Run Code Online (Sandbox Code Playgroud)

考虑到上述约束,如何使用谓词找到问题的可能解决方案solve/1?我的第一次尝试是在下面,没有结果.提前致谢!

solve(L1) :-
    L1 = [A,B,C,E,F,G,J,K,L,N,O,P],
    A is 24-B-C,
    B is 26-F-J-N,
    C is 15-G-K-O,
    E is 11-F-G,
    E is 17-A,
    J is 22-K-L,
    N is 14-O-P,
    L is 13-P,
    write(L1).
Run Code Online (Sandbox Code Playgroud)

mat*_*mat 4

正如 @lurker 在他的评论中已经说过的,使用CLP(FD) 约束。

此外,我建议:

  1. 而不是solve/1使用声明性名称,例如solution/1. 您应该描述解决方案的适用范围,以便该关系在各个方向上都有意义,例如,如果解决方案已经给出并且您想要验证它。
  2. 按照惯例,让代表列表的变量以 s.
  3. 将副作用与纯代码分开。事实上,完全消除副作用。让为您打印!

例如:

:- use_module(library(clpfd)).

solution(Ls) :-
    Ls = [A,B,C,E,F,G,J,K,L,N,O,P],
    A #= 24-B-C,
    B #= 26-F-J-N,
    C #= 15-G-K-O,
    E #= 11-F-G,
    E #= 17-A,
    J #= 22-K-L,
    N #= 14-O-P,
    L #= 13-P.
Run Code Online (Sandbox Code Playgroud)

这已经适用于以下查询:

?- solution(Ls), Ls ins 0..sup, label(Ls).
Ls = [6, 3, 15, 11, 0, 0, 9, 0, 13, 14, 0, 0] ;
Ls = [6, 3, 15, 11, 0, 0, 10, 0, 12, 13, 0, 1] ;
Ls = [6, 3, 15, 11, 0, 0, 11, 0, 11, 12, 0, 2] ;
etc.
Run Code Online (Sandbox Code Playgroud)

我把完成这个作为一个简单的练习。

  • 尝试 CLP(FD) 约束“all_distinct/1”。 (2认同)