लीवर टेबल की गणना और एक एल्गोरिथ्म जिसे ZFC में समाप्त करने के लिए नहीं जाना जाता है


12

लेवर टेबल प्रोग्राम जो गणित के मानक अक्षीय प्रणाली में समाप्त करने के लिए दिखाया गया है नहीं किया गया है के उदाहरण प्रदान ZFC समाप्त जब एक बहुत बड़ी कार्डिनल सूक्तियों मान लिया गया है, लेकिन जो।

परिचय

शास्त्रीय लेवर टेबल सेट अंतर्निहित के साथ अद्वितीय परिमित अल्जेब्रास हैं और एक ऑपरेशन है कि संतुष्ट पहचान और जहां के लिए और जहां ।An{1,...,2n}*x * (y * z)=(x * y) * (x * z)x*1=x+1x<2n2n*1=1

शास्त्रीय Laver तालिकाओं के बारे में अधिक जानकारी पैट्रिक डेहोरनोय द्वारा ब्रेड्स और स्व-वितरण पुस्तक में पाई जा सकती है।

चुनौती

सबसे छोटा कोड (बाइट्स में) क्या है जो 1*32शास्त्रीय Laver तालिकाओं में गणना करता है और एक nसाथ मिलने पर ठीक-ठीक समाप्त हो जाता है ? दूसरे शब्दों में, कार्यक्रम समाप्त हो जाता है और केवल अगर यह एक साथ पाता है, लेकिन अन्यथा यह हमेशा के लिए चलता है।1*32<2nn1*32<2n

प्रेरणा

एक रैंक-में-रैंक कार्डिनल (यह भी एक I3-कार्डिनल कहा जाता है) एक बहुत ही बड़ी है अनंत के स्तर और अगर एक एक रैंक-में-रैंक कार्डिनल के अस्तित्व को मानता है, तो एक से अगर एक नहीं है और अधिक प्रमेयों साबित करने में सक्षम है रैंक-इन-रैंक कार्डिनल के अस्तित्व का अनुमान। यदि कोई रैंक-इन-रैंक कार्डिनल मौजूद है, तो कुछ शास्त्रीय लेवर टेबल है जहां । हालाँकि, इसका कोई ज्ञात प्रमाण नहीं है कि ZFC में। इसके अलावा, यह ज्ञात है कि कम से कम जहां अधिक से अधिक है (जो एकरमन फ़ंक्शन के बाद से एक बहुत बड़ी संख्या है) एक तेजी से बढ़ते कार्य है। इसलिए, ऐसा कोई भी कार्यक्रम बहुत लंबे समय तक चलेगा।An1*32<2n1*32<2nn1*32<2nAck(9,Ack(8,Ack(8,254)))Ack

मैं यह देखना चाहता हूं कि किसी कार्यक्रम को कितना छोटा लिखा जा सकता है ताकि हम यह न जान सकें कि क्या कार्यक्रम मानक स्वयंसिद्ध प्रणाली ZFC का उपयोग करके समाप्त हो जाता है, लेकिन जहां हम यह जानते हैं कि कार्यक्रम अंततः एक बहुत मजबूत स्वयंसिद्ध प्रणाली अर्थात Z3 + I3 में समाप्त होता है। यह प्रश्न किससे प्रेरित था स्कॉट आरोनसन की हालिया पोस्ट जिसमें आरोनसन और एडम येडिडिया ने 8000 राज्यों के साथ एक ट्यूरिंग मशीन का निर्माण किया है, ताकि जेडएफसी यह साबित नहीं कर सके कि ट्यूरिंग मशीन समाप्त नहीं होती है, लेकिन बड़ी कार्डिनल परिकल्पनाओं को पूरा करने के लिए नहीं जानी जाती है।

शास्त्रीय लावर टेबल की गणना कैसे की जाती है

जब लावर तालिकाओं की गणना की जाती है तो आमतौर पर इस तथ्य का उपयोग करना सुविधाजनक होता है कि बीजगणित में , हमारे पास सभी के लिए हैAn2n * x=xx है ।An

निम्न कोड शास्त्रीय Laver तालिका की गणना करता है An

# तालिका (n, x, y) A n में x * y देता है
तालिका: = समारोह (एन, एक्स, वाई)
अगर x = 2 ^ n तो y वापस करें;
elif y = 1 फिर x + 1 लौटाएं;
और रिटर्न टेबल (एन, टेबल (एन, एक्स, वाई -1), एक्स + 1); फाई; समाप्त;

उदाहरण के लिए, इनपुट table(4,1,2)वापस आ जाएगा 12

इसके लिए कोड table(n,x,y)अक्षम है और यह उचित समय में केवल Laver तालिका में गणना कर सकता है । सौभाग्य से, ऊपर दिए गए लोगों की तुलना में शास्त्रीय Laver तालिकाओं की गणना के लिए बहुत तेज़ एल्गोरिदम हैं।A4


2
PPCG में आपका स्वागत है! महान पद!
NoOneIsHere

1
विकिपीडिया के अनुसार, Ack (9, Ack (8, Ack (8,254))) n पर एक कम बाउंड है जिसके लिए अवधि 16 से अधिक है। इसके लिए, हम 1 * 32 के बजाय 1 * 16 की जांच कर सकते हैं। मैं उसी के अनुसार अपने कार्यक्रम में संशोधन करूंगा।
जॉन ट्रॉम

1
मैंने ऐसा करने के लिए एक ट्यूरिंग मशीन लिखना शुरू कर दिया है, और मुझे लगता है कि मैंने एक आउट-बाय-फैक्टर ऑफ़-टू त्रुटि देखी है। क्या यह साबित नहीं हुआ कि Ack(9,Ack(8,Ack(8,254)))पहली तालिका के लिए एक निचली सीमा है जिसमें पहली पंक्ति की अवधि 32 है, यानी कहाँ 1*16 < 2^n?
पीटर टेलर

1
यदि आपके पास एकरमैन के लिए 20-राज्य 2-प्रतीक मशीन है, तो कृपया मुझे एक लिंक दें, क्योंकि मैं शायद इसके बारे में कुछ विचार चुरा सकता हूं। मेरे पास गणना करने के लिए 44 राज्य हैं table(n,x,y), और मुझे लगता है कि यह स्थिरांक और बाहरी लूप स्थापित करने के लिए 25 से 30 राज्यों के बीच ले जाएगा। केवल प्रत्यक्ष टीएम प्रतिनिधित्व जो मुझे esolangs.org पर मिल सकता है वह है esolangs.org/wiki/ScripTur और यह वास्तव में उस गोल्फ में नहीं है।
पीटर टेलर

1
cheddarmonk.org/papers/laver.pdf उतना ही है जितना मुझे इस सप्ताह होने की उम्मीद है, क्योंकि मैं यात्रा करने जा रहा हूं।
पीटर टेलर

जवाबों:


4

बाइनरी लैम्ब्डा कैलकुलस, 215 बिट्स (27 बाइट्स)

\io. let
  zero = \f\x. x;
  one = \x. x;
  two = \f\x. f (f x);
  sixteen = (\x. x x x) two;
  pred = \n\f\x. n (\g\h. h (g f)) (\h. x) (\x. x);
  laver = \mx.
    let laver = \b\a. a (\_. mx (b (laver (pred a))) zero) b
    in laver;
  sweet = sixteen;
  dblp1 = \n\f\x. n f (n f (f x)); -- map n to 2*n+1
  go2 = \mx. laver mx sweet mx (\_. mx) (go2 (dblp1 mx));
in go2 one

के लिए संकलन ( https://github.com/tromp/AIT पर सॉफ्टवेयर का उपयोग करके )

000101000110100000010101010100011010000000010110000101111110011110010111
110111100000010101111100000011001110111100011000100000101100100010110101
00000011100111010100011001011101100000010111101100101111011001110100010

यह समाधान ज्यादातर https://github.com/int-e के कारण है


2
मुझे यकीन नहीं है कि आपको अपना स्कोर कैसे मिला, लेकिन डिफ़ॉल्ट रूप से कोड में बाइट्स की संख्या के अनुसार स्कोर किया जाना चाहिए। मैं इस सबमिशन के लिए 375 बाइट्स गिनता हूं । आपको भाषा का नाम भी शामिल करना चाहिए और वैकल्पिक रूप से भाषा के लिए दुभाषिया का लिंक होना चाहिए।
एलेक्स ए।

आपको संभवतः अपनी पोस्ट में लंबाई 234 बिट्स का सटीक कोड शामिल करना चाहिए।
कैलक्यूलेटरफलाइन

2
एन्कोडिंग विकिपीडिया पर पाया जा सकता है । इस दुभाषिया (परीक्षण नहीं) के लिए एक कड़ी भी है । हालांकि, इनकी जाँच होनी चाहिए और बाइनरी एन्कोडिंग भी पोस्ट में होनी चाहिए।
पुरकाकूदरी

1
संकलित भाषाओं के लिए, हम उपयोगकर्ता द्वारा लिखे गए कोड को बनाते हैं - उत्पन्न बाइनरी में बाइट्स की संख्या नहीं।
एलेक्स ए

5
@AlexA। यह आवश्यक नहीं है ... कोड का कोई भी रूप जिसे एक संकलक या दुभाषिया द्वारा समझा जा सकता है, ठीक है।
फर्सम'

4

CJam ( 36 32 बाइट्स)

1{2*31TW$,(+a{0X$j@(@jj}2j)W$=}g

व्यवहार में, यह त्रुटियां बहुत जल्दी समाप्त हो जाती हैं क्योंकि यह कॉल स्टैक को ओवरफ्लो करता है, लेकिन एक सैद्धांतिक असीमित मशीन पर यह सही है, और मैं समझता हूं कि इस प्रश्न की धारणा है।

के लिए कोड table(n,x,y)बल्कि अक्षम है और यह समय की उचित मात्रा में केवल Laver तालिका A 4 में गणना कर सकता है ।

वास्तव में सही नहीं है अगर हम उन्हें पुनः प्राप्त करने से बचने के लिए मूल्यों की गणना करते हैं। वह तरीका है जो मैंने j(मेमॉशन) ऑपरेटर का उपयोग करके लिया है । यह मिलीसेकंड में ए 6 का परीक्षण करता है और स्टैक परीक्षण ए 7 को ओवरफ्लो करता है - और मैंने वास्तव में गोल्फिंग table के हितों में अपनाई है।

विच्छेदन

यदि हम मान लेते हैं कि nसंदर्भ के बजाय इसके संदर्भ से समझा जाता है

f(x,y) =
    x==2^n ? y :
    y==1 ? x+1 :
    f(f(x,y-1),x+1)

हम पहला विशेष मामला निकाल सकते हैं

f(x,y) =
    y==1 ? x+1 :
    f(f(x,y-1),x+1)

और यह अभी भी काम करता है क्योंकि

f(2^n, 1) = 2^n + 1 = 1

और किसी अन्य के लिए y,

f(2^n, y) = f(f(2^n, y-1), 1) = f(2^n, y-1) + 1

इसलिए प्रेरण से हम प्राप्त करते हैं f(2^n, y) = y

सीजेएम के लिए यह मापदंडों के क्रम को उलटने के लिए अधिक सुविधाजनक हो जाता है। और प्रत्येक मूल्य को घटाकर 1 .. 2^nमैं जिस रेंज का उपयोग कर रहा हूं, उसका उपयोग करने के बजाय, मैं जिस 0 .. 2^n - 1क्रियान्वयन फ़ंक्शन को लागू कर रहा हूं वह है

g(y,x) =
    y==0 ? x+1
         : g(x+1, g(y-1, x))

1           e# Initial value of 2^n
{           e# do-while loop
  2*        e#   Double 2^n (i.e. increment n)
  31T       e#   table(n,1,32) is g(31,0) so push 31 0
  W$,(+a    e#   Set up a lookup table for g(0,x) = x+1 % 2^n
  {         e#   Memoisation function body: stack is 2^n ... y x
    0X$j    e#     Compute g(0,x) = x+1 % 2^n
            e#     Stack is 2^n ... y x (x+1%2^n)
    @(      e#     Bring y to top, decrement (guaranteed not to underflow)
            e#     Stack is 2^n ... x (x+1%2^n) (y-1%2^n)
    @jj     e#     Rotate and apply memoised function twice: g(x+1,g(y-1,x))
  }
  2j        e#   Memoise two-parameter function
            e#   Stack: 2^n g(31,0)
  )W$=      e#   Test whether g(31,0)+1 is 2^n
}g          e# Loop while true

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.