Давайте перейдем прямо к сути дела!
- Каждая перестановка
[0,1,2,3,4,5,6,7,8,9]
это список длина 10 .
[G,I,V,E,M,O,N,Y]
- это список длина 8 .
- Никакая перестановка
[0,1,2,3,4,5,6,7,8,9]
не может быть объединена с [G,I,V,E,M,O,N,Y]
.
В качестве быстрого исправления измените определение check/1
следующим образом:
check(<b>[G,I,V,E,M,O,N,Y,_,_]</b>) :-
find( VAL, G,I,V,E),
<b>G >= 1</b>,
find2(VALR, M,E),
<b>M >= 1</b>,
find3(VALA, M,O,N,E,Y),
VAL * VALR =:= VALA.
Затем выполните следующий «фиксированный» запрос:
?- Expr = ([G,I,V,E]*[M,E] = [M,O,N,E,Y]),
Zs = <b>[G,I,V,E,M,O,N,Y,_,_]</b>,
time(solve(Zs)).
% 24,641,436 inferences, 7.692 CPU in <b>7.709</b> seconds (100% CPU, 3203506 Lips)
Expr = ([1,0,7,2] * [9,2] = [9,8,6,2,4]),
Zs = [1,0,7,2,9,8,6,4,<b>3,5</b>] ;
% 7,355 inferences, 0.007 CPU in <b>0.007</b> seconds (100% CPU, 1058235 Lips)
Expr = ([1,0,7,2] * [9,2] = [9,8,6,2,4]), % <i>redundant</i>
Zs = [1,0,7,2,9,8,6,4,<b>5,3</b>] ;
% 6,169,314 inferences, 1.935 CPU in <b>1.939</b> seconds (100% CPU, 3188312 Lips)
Expr = ([1,0,9,2] * [7,2] = [7,8,6,2,4]),
Zs = [1,0,9,2,7,8,6,4,<b>3,5</b>] ;
% 7,355 inferences, 0.005 CPU in <b>0.005</b> seconds (99% CPU, 1360603 Lips)
Expr = ([1,0,9,2] * [7,2] = [7,8,6,2,4]), % <i>redundant</i>
Zs = [1,0,9,2,7,8,6,4,<b>5,3</b>] ;
% 6,234,555 inferences, 1.955 CPU in <b>1.959</b> seconds (100% CPU, 3189462 Lips)
false.
Вот еще один способ решения проблемы:
Сначала использовать clpfd !
:- use_module(library(clpfd)).
Во-вторых, (повторно) используйте код, представленный ранее в мой ответ
к связанному вопросу Более быстрое внедрение словесной арифметики в прологе :
?- Expr = ([G,I,V,E] * [M,E] #= [M,O,N,E,Y]),
Zs = [G,I,V,E,M,O,N,Y],
crypt_arith_(Expr,Zs),
time(labeling([],Zs)).
% 397,472 inferences, 0.088 CPU in <b>0.088</b> seconds (100% CPU, 4521899 Lips)
Expr = ([1,0,7,2] * [9,2] #= [9,8,6,2,4]), Zs = [1,0,7,2,9,8,6,4] ;
% 128,982 inferences, 0.037 CPU in <b>0.037</b> seconds (100% CPU, 3502788 Lips)
Expr = ([1,0,9,2] * [7,2] #= [7,8,6,2,4]), Zs = [1,0,9,2,7,8,6,4] ;
% 77,809 inferences, 0.028 CPU in <b>0.028</b> seconds (100% CPU, 2771783 Lips)
false.
Нет избыточных решений. На несколько порядков быстрее, чем «создать и проверить». clpfd пород!