Prolog组合练习
Prolog combinatorial exercise
我想为以下问题编写一个 Prolog 程序:
从集合 X = {1 ... 24} 中确定 8 个数字 y1..y8 ,这样对于每个 n,0 < n < 24 有两个数字 yi 和 yj,其中 n = yi - yj,yi > yj.
到目前为止,我尝试了以下方法:
gen(A, B, C, D, E, F, G, H) :-
permutation([A, B, C, D, E, F, G, H, _, _, _,
_, _, _, _, _, _, _, _, _, _, _, _, _],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]).
distance(D, L) :-
random_member(X, L),
random_member(Y, L),
X - Y =:= D.
solution(A, B, C, D, E, F, G, H) :-
gen(A, B, C, D, E, F, G, H),
distance(1, [A, B, C, D, E, F, G, H]),
distance(2, [A, B, C, D, E, F, G, H]),
distance(3, [A, B, C, D, E, F, G, H]),
distance(4, [A, B, C, D, E, F, G, H]),
distance(5, [A, B, C, D, E, F, G, H]),
distance(6, [A, B, C, D, E, F, G, H]),
distance(7, [A, B, C, D, E, F, G, H]),
distance(8, [A, B, C, D, E, F, G, H]),
distance(9, [A, B, C, D, E, F, G, H]),
distance(10, [A, B, C, D, E, F, G, H]),
distance(11, [A, B, C, D, E, F, G, H]),
distance(12, [A, B, C, D, E, F, G, H]),
distance(13, [A, B, C, D, E, F, G, H]),
distance(14, [A, B, C, D, E, F, G, H]),
distance(15, [A, B, C, D, E, F, G, H]),
distance(16, [A, B, C, D, E, F, G, H]),
distance(17, [A, B, C, D, E, F, G, H]),
distance(18, [A, B, C, D, E, F, G, H]),
distance(19, [A, B, C, D, E, F, G, H]),
distance(20, [A, B, C, D, E, F, G, H]),
distance(21, [A, B, C, D, E, F, G, H]),
distance(22, [A, B, C, D, E, F, G, H]),
distance(23, [A, B, C, D, E, F, G, H]),
distance(24, [A, B, C, D, E, F, G, H]).
有人可以帮我吗?
我更改了您的 gen/1
谓词,因为您编写它的方式会产生大量重复解决方案的回溯。这样一来,回溯的速度会更快,效率也会更高。
我也用了一个列表来表示你的解决方案(少写变量名)。
最后,我用 forall/2
而不是写 22 次(几乎)同样的东西。
gen([X|Xs],Min,Max,Length) :-
Length>0,
between(Min,Max,X),
Min1 is X+1,
Length1 is Length-1,
gen(Xs,Min1,Max,Length1).
gen([],_,_,0).
gen(X) :- gen(X,1,24,8).
distance(D,L) :-
member(Y1,L),
member(Y2,L),
D =:= Y1 - Y2,
Y1 > Y2.
solution(X) :-
gen(X),
forall(between(2,23,D), once(distance(D,X))).
结果:(用鼠标怎么看)
有 4 种解决方案(我考虑了您评论中的更正,因此 1 < N < 24
)
?-解决方案(X)。
X = [1, 2, 3, 12, 16, 19, 22, 24] ;
X = [1, 2, 5, 11, 17, 19, 22, 24] ;
X = [1, 3, 6, 8, 14, 20, 23, 24] ;
X = [1, 3, 6, 9, 13, 22, 23, 24] ;
假的。
我想为以下问题编写一个 Prolog 程序: 从集合 X = {1 ... 24} 中确定 8 个数字 y1..y8 ,这样对于每个 n,0 < n < 24 有两个数字 yi 和 yj,其中 n = yi - yj,yi > yj.
到目前为止,我尝试了以下方法:
gen(A, B, C, D, E, F, G, H) :-
permutation([A, B, C, D, E, F, G, H, _, _, _,
_, _, _, _, _, _, _, _, _, _, _, _, _],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]).
distance(D, L) :-
random_member(X, L),
random_member(Y, L),
X - Y =:= D.
solution(A, B, C, D, E, F, G, H) :-
gen(A, B, C, D, E, F, G, H),
distance(1, [A, B, C, D, E, F, G, H]),
distance(2, [A, B, C, D, E, F, G, H]),
distance(3, [A, B, C, D, E, F, G, H]),
distance(4, [A, B, C, D, E, F, G, H]),
distance(5, [A, B, C, D, E, F, G, H]),
distance(6, [A, B, C, D, E, F, G, H]),
distance(7, [A, B, C, D, E, F, G, H]),
distance(8, [A, B, C, D, E, F, G, H]),
distance(9, [A, B, C, D, E, F, G, H]),
distance(10, [A, B, C, D, E, F, G, H]),
distance(11, [A, B, C, D, E, F, G, H]),
distance(12, [A, B, C, D, E, F, G, H]),
distance(13, [A, B, C, D, E, F, G, H]),
distance(14, [A, B, C, D, E, F, G, H]),
distance(15, [A, B, C, D, E, F, G, H]),
distance(16, [A, B, C, D, E, F, G, H]),
distance(17, [A, B, C, D, E, F, G, H]),
distance(18, [A, B, C, D, E, F, G, H]),
distance(19, [A, B, C, D, E, F, G, H]),
distance(20, [A, B, C, D, E, F, G, H]),
distance(21, [A, B, C, D, E, F, G, H]),
distance(22, [A, B, C, D, E, F, G, H]),
distance(23, [A, B, C, D, E, F, G, H]),
distance(24, [A, B, C, D, E, F, G, H]).
有人可以帮我吗?
我更改了您的 gen/1
谓词,因为您编写它的方式会产生大量重复解决方案的回溯。这样一来,回溯的速度会更快,效率也会更高。
我也用了一个列表来表示你的解决方案(少写变量名)。
最后,我用 forall/2
而不是写 22 次(几乎)同样的东西。
gen([X|Xs],Min,Max,Length) :-
Length>0,
between(Min,Max,X),
Min1 is X+1,
Length1 is Length-1,
gen(Xs,Min1,Max,Length1).
gen([],_,_,0).
gen(X) :- gen(X,1,24,8).
distance(D,L) :-
member(Y1,L),
member(Y2,L),
D =:= Y1 - Y2,
Y1 > Y2.
solution(X) :-
gen(X),
forall(between(2,23,D), once(distance(D,X))).
结果:(用鼠标怎么看)
有 4 种解决方案(我考虑了您评论中的更正,因此
1 < N < 24
)
?-解决方案(X)。
X = [1, 2, 3, 12, 16, 19, 22, 24] ;
X = [1, 2, 5, 11, 17, 19, 22, 24] ;
X = [1, 3, 6, 8, 14, 20, 23, 24] ;
X = [1, 3, 6, 9, 13, 22, 23, 24] ;
假的。