ब्राउज़िंग के माध्यम से भयानकOn-Line Encyclopedia of Integer Sequences (सीएफ en.wikipedia.org), मैं निम्नलिखित पूर्णांक अनुक्रम पर ठोकर खाई:Prolog: की गणना OEIS A031877 ("nontrivial उलट संख्या") CLP का उपयोग कर (FD)
A031877: nontrivial उलट संख्या (संख्या है जो अपने बदलाव के पूर्णांक गुणज हैं), मुरजबंध संबंधी संख्या और 10.
के गुणकों को बाहर निकाल कर कुछ कोड मैंने लिखा फिर से उपयोग करते हुए मेरा उत्तर th करने के लिए ई संबंधित प्रश्न "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
एक ठोस पूर्णांक है । N_digit
के पहले 100 मानों के लिए स्वयं के लिए देखें!
?- 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.
ठीक है! आइए ऊपर की क्वेरी के सार्वभौमिक समाप्ति को साबित करने के लिए आवश्यक रनटाइम को मापें!
?- 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 (*) डोमेन (बी, क्यू, आर, सेट) के बारे में क्या? या विभिन्न स्थिरता/प्रचार तकनीक? या बल्कि प्रोलॉग शैली coroutining?
विचार मिला? मुझे सब चाहिए! अग्रिम में धन्यवाद।