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

时间:2016-01-27 00:22:05

标签: prolog clpfd

enter image description here

假设:

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

如果使用谓词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).

1 个答案:

答案 0 :(得分:4)

正如@lurker在评论中所说,使用 CLP(FD)约束

另外,我建议:

  1. 而不是solve/1,请使用声明性名称,例如solution/1。您应该为解决方案描述什么,以便关系在所有方向都有意义,例如,如果已经给出了解决方案并且您想验证它。
  2. 按照惯例,让代表列表的变量以s结尾是有意义的。
  3. 从纯代码中分离副作用。事实上,完全删除副作用。让为您打印!
  4. 例如:

    :- 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.
    

    这适用于以下查询:

    ?- 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.
    

    我完成这项工作是一项简单的练习。