Solving Kakuro puzzle (5x5) in Prolog

在这里输入图像描述

Assuming that:

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

How could i find a possible solution to the problem, given the constraints above, using the predicate solve/1 ? My first attempt was below, with no result. Thanks in advance!

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

As @lurker already said in his comment, use CLP(FD) constraints .

In addition, I recommend:

  • instead of solve/1 , use a declarative name like solution/1 . You should describe what holds for a solution, so that the relation makes sense in all directions, also for example if the solution is already given and you want to validate it.
  • By convention, it makes sense to let variables that stand for lists end with an s .
  • Separate side-effects from pure code. In fact, remove side-effects altogether. Let the prolog-toplevel do the printing for you!
  • For example:

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

    This already works for queries like:

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

    I leave completing this as an easy exercise.

    链接地址: http://www.djcxy.com/p/31788.html

    上一篇: 反应中的动画页面转换

    下一篇: 在Prolog中解决Kakuro难题(5x5)