在Prolog中解决Kakuro难题(5x5)

在Prolog中解决Kakuro难题(5x5),prolog,clpfd,prolog-toplevel,Prolog,Clpfd,Prolog Toplevel,假设: 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-

假设:

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

正如@潜伏者在他的评论中所说的,使用CLP(FD)约束

此外,我建议:

  • 使用类似于
    solution/1
    声明性名称,而不是
    solution/1
    。您应该描述一个解决方案所包含的内容,这样关系在各个方向上都是有意义的,例如,如果已经给出了解决方案,您希望验证它
  • 按照惯例,让代表列表的变量以
    s
    结尾是有意义的
  • 将副作用与纯代码分开。事实上,完全消除了副作用。让我来帮你打印吧 例如:

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

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

    好了,现在好了吗?我不知道你怎么会从代码中得到“没有结果”。我本以为会出现实例化错误。请准确描述你的结果。尝试使用CLPFD。例如,
    A+B+C#=24
    而不是
    A是24-B-C
    is/2
    要求第二个表达式中的变量都被实例化。感谢您的帮助,我还忘了指定解决方案必须在[0-9]之间,这意味着查询被修改为:solution(Ls),Ls ins 0..9,label(Ls)。问题是一行或一列中不能有相同的数字。说明:以下列表不应包含重复项。L1=[A,B,C]L2=[E,F,G]L3=[J,K,L,N]L4=[N,O,P]L5=[A,E]L6=[B,F,J,N]L7=[C,G,K,O]L8=[L,P]我如何表达这些限制?试试CLP(FD)约束
    all\u distinct/1
    。谢谢你的回答,请注意可能的错误。
    all_distinct
    谓词应保证所有行和列的唯一性。