在 Prolog 中解决 Kakuro 难题(5x5)
Solving Kakuro puzzle (5x5) in Prolog
假设:
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).
正如@lurker 在他的评论中所说,使用 CLP(FD) 约束。
此外,我推荐:
- 而不是
solve/1
,使用 声明性名称,如 solution/1
。您应该描述 什么 对解决方案有效,以便该关系在所有方向上都有意义,例如,如果解决方案已经给出并且您想要验证它。
- 按照惯例,让代表 列表 的变量以
s
. 结尾是有意义的
- 从纯代码中分离side-effects。事实上,完全删除 side-effects。让 prolog-toplevel 为您打印!
例如:
:- 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.
我把完成这个作为一个简单的练习。
假设:
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).
正如@lurker 在他的评论中所说,使用 CLP(FD) 约束。
此外,我推荐:
- 而不是
solve/1
,使用 声明性名称,如solution/1
。您应该描述 什么 对解决方案有效,以便该关系在所有方向上都有意义,例如,如果解决方案已经给出并且您想要验证它。 - 按照惯例,让代表 列表 的变量以
s
. 结尾是有意义的
- 从纯代码中分离side-effects。事实上,完全删除 side-effects。让 prolog-toplevel 为您打印!
例如:
:- 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.
我把完成这个作为一个简单的练习。