在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
谓词应保证所有行和列的唯一性。