FRACTRAN क्यों पूरा होता है?


10

मैंने स्पष्टीकरण के लिए Google पर जाने की कोशिश की है, लेकिन अधिकांश लिंक केवल "FRACTRAN पूर्ण रूप से छेड़छाड़ कर रहे हैं" जैसी बातें कहते हैं। एक उदाहरण के रूप में, आइए गुणन को देखें।

मुझे याद है एक xkcd फोरम पोस्ट देखकर कहते हैं कि FRACTRAN ने ट्यूरिंग कम्प्लीटनेस को समझने में पोस्टर की मदद की। मैं एक सहज स्पष्टीकरण की तलाश कर रहा हूं कि यह एसोलैंग ट्यूरिंग पूर्ण क्यों है, क्योंकि यह भाषा यांत्रिकी पर बहुत स्पष्ट नहीं है।


FRACTRAN से अपरिचित लोगों के लिए: en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner

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

जवाबों:


12

ट्यूरिंग को पूरा करने के लिए अनिवार्य भाषा होना चाहिए:

  1. सशर्त लूप
  2. चर की संख्या के विपरीत

FRACTRAN एक ऐसी भाषा है, जो उन अंशों से बनी होती है, जो अपने डेटा को primes के विस्तार में संग्रहीत करते हैं।

कहते हैं कि आप दो संख्याओं को जोड़ना चाहते हैं: 2 a 3 b 5 ab बन जाता है

४५५ ११ १ ३ ३ १ १
---, -, -, -, -, -
 ३३ १३ ११ 7 २ ३ ३

यह उपरोक्त परिवर्तन करने के लिए एक FRACTRAN कार्यक्रम है।

आप 72 (2 3 3 2 ) जैसी संख्या के साथ शुरू करते हैं । कार्यक्रम तब तक 'आगे' चला जाता है जब तक कि यह एक संख्या नहीं पाता है जब निर्देश से गुणा किया जाता है एक अन्य पूर्णांक (कोई अनुमति नहीं है)।

72जब तक यह आगे नहीं बढ़ेगा 11/2। यह तब संख्या को विभाजित करेगा 2और इसे गुणा करेगा 11(11 में शक्ति एक चर है)। यह देता है 39639633 से विभाज्य है (3 शक्ति और 11 को कम करके) और 455 से गुणा करें (5, 7 और 13 चर बढ़ाकर)। और इसी तरह। इस कार्यक्रम का पूरा विवरण और इसकी राज्य तालिका FRACTRAN विकिपीडिया पृष्ठ पर पढ़ी जा सकती है , जिसमें उपरोक्त कार्यक्रम का बहुत अच्छा एनिमेटेड GIF भी शामिल है।

स्टैक एक्सचेंज पर अन्य FRACTRAN सामग्री जो ट्यूरिंग की पूर्णता को छूती है, उस पर पाया जा सकता है: फ्रैट्रन को ब्रेनफॉक में परिवर्तित करें (ठीक है, यह किसी के समय का वास्तव में उत्पादक उपयोग है)

फ्रैक्चरन ट्यूरिंग-पूर्ण होने का कारण यह है कि यह एक रजिस्टर मशीन का अनुकरण करता है। संख्या का प्रधान गुणनखंडन रजिस्टरों की सामग्री को संग्रहीत करता है, जबकि विभाजन और गुणन को रजिस्टरों से सशर्त रूप से जोड़ने और घटाने का एक तरीका है।

यहाँ चाल का हिस्सा (और यह सिद्धांत में भटकना शुरू होता है) यह है कि पर्दे के पीछे, यह एक Minsky रजिस्टर मशीन है जिसके लिए यह साबित हो गया था कि कुछ टेप (प्रोग्राम) ट्यूरिंग मशीन हैं यदि टेप को Gödel नंबर के रूप में दर्शाया गया है जो वास्तव में FRACTRAN संख्या क्या है (लिंक विकिपीडिया पृष्ठ से):

गोडेल ने प्राइम फैक्टराइज़ेशन पर आधारित एक प्रणाली का इस्तेमाल किया। उन्होंने पहले अंकगणित की औपचारिक भाषा में प्रत्येक मूल प्रतीक को एक अद्वितीय प्राकृतिक संख्या सौंपी, जिसके साथ वह काम कर रहे थे।

तो, हम सशर्त छोरों, Gödel संख्या के रूप में संग्रहीत मनमाने ढंग से चर, हम एक ट्यूरिंग मशीन मिल गया है।

कुछ अन्य मजेदार पढ़ने जो कि कोलाज़ पर छूते हैं जैसे कि FRACTRAN की प्रकृति को कैनडे डिसाइड पर पढ़ा जा सकता है ? Undecide! कि Collatz अनुमान FRACTRAN और रुकने की समस्या से संबंधित है।


FRACTRAN का किसी के सिर के आसपास होना थोड़ा मुश्किल है।

कार्यक्रम की तरह कुछ पर विचार करें:

LABEL: start
    block1
    block2
    block3
    ...
END

इसमें प्रत्येक ब्लॉक फॉर्म का है:

IF(registers X >= a, Y >= b)  # or any combination of registers
THEN
    X -= a
    Y -= b

    I += n
    J += m

    goto start

ऊपर गुणन कार्यक्रम से पहला बयान:

455
---
 33

इस रूप में लिखा जाएगा:

IF(register `3` >= 1 && `11` >= 1)
THEN
     `3` -= 1
    `11` -= 1

     `5` += 1
     `7` += 1
    `13` += 1

    goto start

और इस प्रकार आप स्पष्ट रूप से ट्यूरिंग पूर्णता के लिए आवश्यक डेटा स्टोरेज और लूपिंग निर्माण को देख सकते हैं। इसकी बहुत अल्पविकसितता है, लेकिन यह मौजूद है और एक साधारण रजिस्टर मशीन के रूप में चलता है - लेकिन फिर वह सब जो आपको वास्तव में करने में सक्षम होना चाहिए।


अभी भी यकीन नहीं हुआ?

यह काफी हद तक मॉडल के कम्प्यूटेशन पर दिमित्री हेंड्रिक्स के एक व्याख्यान से उधार लेता है

यह बहुत ही सरल प्रोग्राम है (2/3)जो एक योजक (2 a 3 b -> 3 a + b ) है, लेकिन यह विनाशकारी है - 2 में मान प्रक्रिया के भाग के रूप में साफ किया जाता है।

एक उच्च स्तरीय FRACTRAN लिखते हैं जो इस तरह के विनाश को न करने में आसान बनाता है।

मूल कार्यक्रम के बारे में सोचा जा सकता है:

   2
α: - → α
   3

F 2 में , कोई एक प्रकार के 'फ़ंक्शंस' को निर्दिष्ट कर सकता है।

   १० १
α: - → α, - →
    ३ १

   3
β: - → β
   5 

एफ 2 प्रोग्राम (पी) को एक मानक FRACTRAN प्रोग्राम में बदलने के लिए, एक करता है:

  1. लंबाई 1 के छोरों का स्पष्ट पी
  2. ताज़े अभाज्य संख्याओं के साथ ग्रीक अक्षर (फ़ंक्शन) बदलें
  3. संक्रमण बदलें:
   इक्का
p: - → q, - → r, - -> s, ...
   bdf

हो जाता है:

अक क्र
-, -, -, ...
bp dp fp

यह क्या किया है कार्यक्रम की स्थिति को स्टोर करने के लिए primes p, q, r, और s का उपयोग किया जाता है।

और फिर हमें रजिस्टर मशीन मिल गई है ... इसमें रजिस्टर की एक सीमित संख्या है जो बड़ी संख्या में और दो निर्देशों को स्टोर करती है:

  • inc (x i , m) - वेतन वृद्धि रजिस्टर i और लाइन m पर जाएं
  • jzdec (x i , m 1 , m 2 ) - यदि रजिस्टर i है, तो लाइन m पर जाना है, अन्यथा डिक्रीमेंट i है, और लाइन m2 में जाएं।

इस रजिस्टर मशीन को ट्यूरिंग पूर्ण दिखाया गया है।

फिर यह एक यांत्रिक प्रक्रिया के हिस्से के रूप में एक FRACTRAN कार्यक्रम में एक रजिस्टर मशीन प्रोग्राम को संकलित करने के कई स्लाइड्स पर प्रक्रिया को दिखाने के लिए जाता है ।

मूल रूप से:

                       पी (i)
inc (x (i), m) = ---- → m
                        1

                        1 1
jzdec (x (i), m1, m2) = ---- → एम 2, - → m1
                       p (i) 1

और इस तरह कंप्यूटिंग के इन दो मॉडलों के बीच समानता के कारण, FRACTRAN ट्यूरिंग पूरा हो गया है।

Btw, यदि आप वास्तव में अपने दिमाग को उड़ाना चाहते हैं, तो कोड गोल्फ पढ़ें : फ्रैक्ट्रन जिसमें कुछ लोगों ने एक और FRACTRAN कार्यक्रम चलाने के लिए एक FRACTRAN कार्यक्रम लिखा था।


2
और मुझे लगा ब्रेनफ * ck अजीब था।
रॉबर्ट हार्वे

ध्यान दें कि वेक्टर एडिशन सिस्टम संबंधित हैं क्योंकि किसी भी फ्रैक्ट्रन प्रोग्राम को VAS के रूप में लिखा जा सकता है। और पेट्री नेट भी।
दान डी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.