在Prolog中解决这类问题的基本方法是生成所有可能性,然后过滤它们。在这种情况下,我们需要的十个数字,没有重复的列表,以及长度为N每个前缀应该由N.是整除
puzzle([A,B,C,D,E,F,G,H,I,J]) :-
select(A,[0,1,2,3,4,5,6,7,8,9],List1),
select(B,List1,List2), select(C,List2,List3), select(D,List3,List4),
select(E,List4,List5), select(F,List5,List6), select(G,List6,List7),
select(H,List7,List8), select(I,List8,List9), List9 = [J],
divisible([A,B],2),
divisible([A,B,C],3),
divisible([A,B,C,D],4),
divisible([A,B,C,D,E],5),
divisible([A,B,C,D,E,F],6),
divisible([A,B,C,D,E,F,G],7),
divisible([A,B,C,D,E,F,G,H],8),
divisible([A,B,C,D,E,F,G,H,I],9),
divisible([A,B,C,D,E,F,G,H,I,J],10).
即使整除可以轻松实现:
divisible(Is,D) :-
combine(Is,N),
R is N rem D, R == 0.
但那么我们还需要一些技术来在整数,字符和原子之间进行转换。
:- use_module(library(lists)).
combine(Is,N) :-
maplist(conv,Is,As), concat_list(As,A),
atom_chars(A,Cs), number_chars(N,Cs).
conv(I,A) :-
number_chars(I,[C]), atom_chars(A,[C]).
concat_list([A1,A2|As],Atom) :-
atom_concat(A1,A2,A3),
concat_list([A3|As],Atom).
concat_list([A],A).
这将产生在您的链接显示的结果:
| ?- puzzle(X).
X = [3,8,1,6,5,4,7,2,9,0] ? ;
no
| ?-
增加:如果你想更快,而不仅仅是买和其他人一样一个更大的计算机,您可以交错产生&代码的测试部分:
puzzle2([A,B,C,D,E,F,G,H,I,J]) :-
select(A,[0,1,2,3,4,5,6,7,8,9],List1),
select(B,List1,List2), divisible([A,B],2),
select(C,List2,List3), divisible([A,B,C],3),
select(D,List3,List4), divisible([A,B,C,D],4),
select(E,List4,List5), divisible([A,B,C,D,E],5),
select(F,List5,List6), divisible([A,B,C,D,E,F],6),
select(G,List6,List7), divisible([A,B,C,D,E,F,G],7),
select(H,List7,List8), divisible([A,B,C,D,E,F,G,H],8),
select(I,List8,List9), divisible([A,B,C,D,E,F,G,H,I],9),
List9 = [J], divisible([A,B,C,D,E,F,G,H,I,J],10).
使用SWI Prolog的,我得到以下计时:
?- time((puzzle(_),false)).
32m% 142,709,118 inferences, 76.333 CPU in 76.650 seconds (100% CPU, 1869553 Lips)
?- time((puzzle2(_),false)).
32m% 157,172 inferences, 0.142 CPU in 0.144 seconds (98% CPU, 1108945 Lips)
?- time((num(_),false)).
32m% 2,802,204 inferences, 1.008 CPU in 1.028 seconds (98% CPU, 2779208 Lips)
这似乎暗示puzzle2
版本比下面给出的num
版本快几倍。
也许这个逻辑谜语并不像你最初预期的那样容易实现。我不会在你链接的表格解决方案中过于束缚。 Prolog解决方案可能不会反映它。如果你只是在学习,也许选择一些更简单的问题开始。 – lurker
7失踪! ..如果它的加权交替和可以用7加权除以1 3 2 -1 -3 -2 ... – false