просмотра через удивительныйOn-Line Encyclopedia of Integer Sequences (ср en.wikipedia.org), я наткнулся на следующую последовательность: целочисленногоПролога: вычисление OEIS A031877 ("нетривиальное число разворота") с помощью CLP (FD)
A031877: Нетривиальные развороты номер (номер, которые являются целыми числами, кратными их инверсий), за исключением палиндромных чисел и кратных 10.
При повторном использовании код, который я написал для моего ответа я e related question "Faster implementation of verbal arithmetic in Prolog" Я мог бы написать решение довольно легко - благодаря clpfd!
:- use_module(library(clpfd)).
Определим ядро отношениеa031877_ndigits_/3
, основанный на digits_number/2
(определено выше):
a031877_ndigits_(Z_big,N_digits,[K,Z_small,Z_big]) :-
K #> 1,
length(D_big,N_digits),
reverse(D_small,D_big),
digits_number(D_big,Z_big),
digits_number(D_small,Z_small),
Z_big #= Z_small * K.
Ядро отношение детерминированным и заканчивается повсеместно всякий раз, когда N_digit
является конкретным числом , Посмотрите сами за первые 100 значений N_digit
!
?- time((N in 0..99,indomain(N),a031877_ndigits_(Z,N,Zs),false)).
% 3,888,222 inferences, 0.563 CPU in 0.563 seconds (100% CPU, 6903708 Lips)
false
Давайте запустим некоторые запросы!
?- a031877_ndigits_(87912000000087912,17,_). true % succeeds, as expected ; false. ?- a031877_ndigits_(87912000000987912,17,_). false. % fails, as expected
Далее, давайте найдем некоторые цифры нетривиальным разворота, содержащая ровно четыре десятичных цифр:
?- a031877_ndigits_(Z,4,Zs), labeling([],Zs).
Z = 8712, Zs = [4,2178,8712]
; Z = 9801, Zs = [9,1089,9801]
; false.
OK! Давайте измерять время выполнения, необходимое для доказательства универсального завершения вышеуказанного запроса!
?- time((a031877_ndigits_(Z,4,Zs),labeling([],Zs),false)).
% 11,611,502 inferences, 3.642 CPU in 3.641 seconds (100% CPU, 3188193 Lips)
false. % terminates universally
Теперь, это путь слишком долго!
Что я могу сделать, чтобы ускорить процесс? Использовать разные и/или другие ограничения? Может быть, даже избыточные? Или, возможно, определить и устранить симметрии, которые сокращают размер пространства для поиска? Как насчет разных доменов clp (*) (b, q, r, set)? Или разные методы консистенции/распространения? Или, скорее, сопроводительный стиль Пролога?
Есть идеи? Я хочу их всех! Заранее спасибо.