在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