अज्ञात पूर्णता की प्रोग्रामिंग भाषा लिखें


91

यह निर्धारित करना कि किसी भाषा को डिज़ाइन करते समय कोई भाषा ट्यूरिंग कम्प्लीट है या नहीं। बहुत सी गूढ़ प्रोग्रामिंग भाषाओं के साथ शुरू करना भी एक बहुत कठिन काम है, लेकिन इसे एक पायदान पर किक करने देता है। आओ हम कुछ प्रोग्रामिंग लैंग्वेज बनाते हैं जो ट्यूरिंग कंप्लीट साबित करने के लिए इतनी कठिन हैं कि दुनिया के सर्वश्रेष्ठ गणितज्ञ भी किसी भी तरह से साबित नहीं कर पाएंगे। आपका कार्य एक ऐसी भाषा को तैयार करना और कार्यान्वित करना है, जिसकी ट्यूरिंग पूर्णता गणित में एक प्रमुख अनसुलझी समस्या पर निर्भर करती है ।

नियम

  • आपके द्वारा चुनी गई समस्या कम से कम 10 साल पहले होनी चाहिए और इस प्रश्न के उत्तर के रूप में अनसुलझी होनी चाहिए। यह गणित में किसी भी तरह का एक मात्र अनुमान हो सकता है जो विकिपीडिया पृष्ठ पर सूचीबद्ध नहीं है ।

  • आपको भाषा का विनिर्देश और मौजूदा भाषा में कार्यान्वयन प्रदान करना होगा।

  • प्रोग्रामिंग भाषा ट्यूरिंग पूर्ण होनी चाहिए यदि और केवल अनुमान हो तो। (या यदि और केवल यदि अनुमान नहीं है)

  • आपको इस बात का प्रमाण शामिल करना चाहिए कि चुने हुए अनुमान के आधार पर यह ट्यूरिंग पूर्ण या अपूर्ण क्यों होगी। दुभाषिया या संकलित कार्यक्रम को चलाने पर आप अनबाउंड मेमोरी तक पहुंच मान सकते हैं।

  • चूँकि हम ट्यूरिंग कम्प्लीटनेस I / O से संबंधित हैं, इसलिए इसकी आवश्यकता नहीं है, हालांकि लक्ष्य सबसे दिलचस्प भाषा बनाना है, इसलिए यह मदद कर सकता है।

  • यह एक इसलिए सबसे अधिक वोटों के साथ जवाब जीत जाएगा।

लक्ष्य मानदंड

एक अच्छा जवाब क्या करना चाहिए? वोट देने के लिए कुछ चीजें यहां दी गई हैं लेकिन तकनीकी रूप से इसकी आवश्यकता नहीं है


इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
डेनिस

13
कुल मिलाकर, मुझे यहाँ उत्तर निराशाजनक लग रहे हैं। वे बहुत अधिक हैं "एक ट्यूरिंग-पूर्ण भाषा के साथ शुरू करें, फिर परीक्षण करें कि क्या अनुमान एक्स / ट्रू / गलत है और यदि ऐसा है, तो एक प्रमुख विशेषता को समाप्त या अक्षम करें।"
xnor

1
@xnor मैं आपसे सहमत हूं, मुझे उम्मीद थी कि यह इनाम कुछ और दिलचस्प जवाब देगा लेकिन ऐसा लग रहा है कि ऐसा नहीं होने वाला है।
श्रीओटचिलिज्म ओ'ज़ैसिक

2
मुझे लगता है कि मुद्दों में से एक यह है कि अधिकांश अनुमानों को अनंत संख्या के मूल्यों के लिए सही साबित किया गया है, लेकिन प्रतिपक्ष भी अनंत संख्या के मूल्यों के लिए सही होगा। परिणामस्वरूप, ट्यूरिंग पूर्णता को सही साबित करना लगभग असंभव हो जाता है।
f --n

1
मुझे लगता है कि ट्यूरिंग पूर्णता एक अनुमान के साथ एक-से-एक के साथ बंधी हुई आवश्यकता एक बहुत मजबूत आवश्यकता है। मुझे लगता है कि ट्यूरिंग पूर्णता को साबित करना या नापसंद करना आसान होगा, क्रमशः दो अलग-अलग खुली समस्याएं। (यानी ट्यूरिंग पूर्णता साबित करने से खुली समस्या का समाधान होता है और असुरक्षित होने से खुली समस्या बी तय होती है)।
PyRulez

जवाबों:


48

लेगेंद्रे

यह भाषा केवल ट्यूरिंग-पूर्ण है अगर और केवल अगर लीजेंड्रे का अनुमान गलत है, तो वहाँ एक पूर्णांक n> 0 मौजूद है जैसे कि n ^ 2 और (n + 1) ^ 2 के बीच कोई primes नहीं हैं। यह भाषा अंडरलोड से कुछ प्रेरणा लेती है, हालांकि कुछ मामलों में यह इससे बहुत अलग है।

लीजेंड्रे में कार्यक्रम सकारात्मक पूर्णांक की श्रृंखला से बने होते हैं (0 विशेष रूप से प्रतिबंधित है, क्योंकि यह अनिवार्य रूप से भाषा के पूरे उद्देश्य को नकारता है)। प्रत्येक पूर्णांक लीजेंड में बेस कमांड से संबंधित है, या संभावित उपयोगकर्ता-परिभाषित है। इसे जिस कमान को सौंपा गया है, वह अपने वर्ग और अगले पूर्णांक ( OEIS अनुक्रम A014085 के बराबर ) के बीच की संख्या पर आधारित है ।

भाषा के आदेश एक ढेर को संशोधित करते हैं, जो मनमाने ढंग से बड़े सकारात्मक पूर्णांक पकड़ सकता है। यदि स्टैक कभी 0 रखता है, तो 0 को तुरंत हटा दिया जाता है। विस्तार से, आदेश हैं:

  • 2 (इस कमांड को बनाने वाला सबसे छोटा पूर्णांक: 1): स्टैक पर प्रोग्राम में अगले पूर्णांक को पुश करें।

  • 3 (सबसे छोटा उत्पादक पूर्णांक: 4): स्टैक पर शीर्ष पूर्णांक को पॉप करें और इसके साथ जुड़े कमांड को निष्पादित करें।

  • 4 (सबसे छोटा: 6): शीर्ष पूर्णांक पॉप करें। यदि यह 1 था, तो स्टैक पर शीर्ष पूर्णांक बढ़ाएं।

  • 5 (10): शीर्ष दो स्टैक आइटम स्वैप करें।

  • 6 (15): स्टैक पर शीर्ष पूर्णांक घटाएं। यदि वह परिणाम 0 में है, तो 0 को पॉप करें और उसे छोड़ दें।

  • 7 (16): स्टैक पर शीर्ष पूर्णांक को डुप्लिकेट करें।

  • 8 (25): स्टट सामग्री को निष्पादित और प्रिंट करें।

यह बुनियादी निर्देश सेट है, जो कुछ भी दिलचस्प करने में असमर्थ है, अकेले चलो। हालांकि, एक और कमांड है, जिसे केवल तब तक एक्सेस किया जा सकता है जब लीजेंड्रे का अनुमान गलत साबित होता है।

  • 0 (अज्ञात): स्टैक से सभी आइटम निकालें और उन्हें एक नए फ़ंक्शन में संयोजित करें, जो स्टैक के मूल तल पर शुरू होने और शीर्ष पर समाप्त होने वाली सभी कमांड्स को निष्पादित करेगा, एक कमांड के रूप में सुलभ जिसका "कमांड नंबर" बराबर है कार्यक्रम के स्रोत में अगला पूर्णांक से मेल खाता है।

यदि यह कमांड किसी भी तरह से सुलभ है, तो भाषा ट्यूरिंग-पूर्ण हो जाती है, क्योंकि कोई इसमें एक मिन्स्की मशीन का अनुकरण कर सकता है।

जब आदेश 8 निष्पादित होता है या कार्यक्रम के अंत तक पहुंच जाता है, तो प्रोग्राम समाप्त हो जाता है और स्टैक पर प्रत्येक पूर्णांक के अनुरूप (यूनिकोड) वर्ण मुद्रित होता है।

उदाहरण कार्यक्रम

1 2 1 3 1 10 4

यह साधारण प्रोग्राम 2, फिर 3 और अंत में 10 को धकेलता है, 4 (कमांड: 3) निष्पादित करने से पहले, जो 10 (कमांड: 5) को पॉपअप और निष्पादित करता है, 2 और 3 को स्वैप करता है।

1 5 3 15 2 1 6 7

यह कार्यक्रम अप्रत्यक्ष पूर्णांक-टू-कमांड पत्राचार के उपयोग को प्रदर्शित करता है। सबसे पहले, एक 5 धक्का दिया जाता है, फिर एक 15 और 1, 2 कमांड को एन्कोडिंग के तीन अलग-अलग तरीकों का उपयोग करते हुए। फिर, 1 को पॉपअप किया जाता है और परिणामस्वरूप, 15 को 16 में बढ़ाया जाता है, और अंत में निष्पादित किया जाता है। कार्यक्रम स्टैक पर संख्या 5 के दो उदाहरणों के साथ समाप्त होता है।

1 1 1 5 ? 24 1 15 1 31 ? 31 24 31

यह प्रोग्राम 0 कमांड के उपयोग को दर्शाता है, का उपयोग करते हुए? एक प्लेसहोल्डर नंबर के रूप में। प्रोग्राम पहले फंक्शन 9 में '1 5' स्टोर करता है, फिर फंक्शन 9 (24 का उपयोग करके) चलने से पहले 10 में '15 31 ', जो स्टैक पर 5 को धकेलता है, और बार-बार इसे घटाता है, जब तक कि यह 0 तक नहीं पहुंच जाता और इसे हटा दिया जाता है। । उसके बाद, कार्यक्रम रुक जाता है।

Minsky मशीन

एक मिन्स्की मशीन को लेजेंड्रे कोड में बदलने के लिए, 0 कमांड का उपयोग किया जाना चाहिए। क्योंकि यह आदेश तब तक अप्राप्य है जब तक कि लीजेंड्रे का अनुमान गलत नहीं है, मैंने एक प्लेसहोल्डर का उपयोग किया है? बजाय।

ध्यान दें कि सभी मिन्स्की मशीन निर्देश पंक्ति नामों के लिए एक दूसरे से अलग A014085 पत्राचार और आधार कमांड के साथ-साथ 24 (9) और 31 (10) के साथ पूर्णांक होना आवश्यक है।

प्रारंभ:
1 1 1 1 ? 24
x INC (A / B) y:

ए:

1 y 1 24 1 ? 1 6 1 1 16 1 24 ? x

बी:

1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 1 24 ? x
x DEC (A / B) yz:

ए:

1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 24 ? x

बी:

1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 10 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 10 1 24 ? x
एक्स हॉल्ट:
1 25 ? x

अंतिम कार्यक्रम बनाने के लिए, सभी भागों (x, y, z को उनके समकक्षों द्वारा प्रतिस्थापित) में जोड़ दें और श्रृंखला में पहला निर्देश शुरू करने के लिए एक पूर्णांक जोड़ें। यह साबित होना चाहिए कि लैजेंड्रे का अनुमान काउंटरएक्सप्लिमेंट द्वारा गलत साबित होने पर भाषा की ट्यूरिंग-पूर्णता साबित होती है।

दुभाषिया

यह व्याख्याकार पायथन (3) में लिखा गया है, और उपरोक्त तीनों उदाहरणों पर परीक्षण किया गया है। अनुमति देने के लिए -a / - allowZero झंडे का उपयोग करें? इस्तेमाल किया जा करने के लिए, -f / - फ़ाइल को सीधे चलाने के लिए एक फ़ाइल और -s / - stackOut से कोड को इसके बजाय पायथन सूची के रूप में स्टैक आउटपुट करने के लिए। यदि कोई फ़ाइल नहीं दी जाती है, तो दुभाषिया एक प्रकार की REPL मोड में प्रवेश करता है, जिसका उपयोग --stackOut के साथ किया जाता है।

import sys
import argparse
import io

class I_need_missing(dict): #used to avoid try/except statements. Essentially a dict
    def __missing__(self,key):
        return None 

def appropriate(integer,prev): #returns number of primes between the square of the integer given and the next

    return_value = 0

    if prev[integer]:
        return prev[integer],prev
    if integer == "?":
        return 0,prev
    for i in range(integer ** 2, (integer + 1) ** 2):
        t = False
        if i > 1:
            t = True
            for j in range(2,int(i ** 0.5)+1):
                t = i/j != round(i/j)
                if not t:
                    break
        return_value += t

    prev[integer] = return_value
    return return_value,prev

def run_command(commandseries,stack,functions,prev): #Runs the appropriate action for each command.

    command,prev = appropriate(commandseries.pop(0),prev)

    halt = False

    if command == 0: #store in given number
        functions[appropriate(commandseries.pop(0),prev)[0]] = stack
        stack = []

    elif command == 2:#push
        stack.append(commandseries.pop(0))

    elif command == 3:#execute top instruction
        commandseries.insert(0,stack.pop())

    elif command == 4:#pop, add 1 to new top if popped value was 1
        if stack.pop() == 1:
            stack[-1] += 1

    elif command == 5:#swap top two integers/?
        stack[-1],stack[-2] = stack[-2],stack[-1]

    elif command == 6:#subtract 1 from top of stack
        stack[-1] -= 1
        if stack[-1] == 0:
            stack.pop()

    elif command == 7:#duplicate top of stack
        stack.append(stack[-1])

    elif command == 8:#halt
        halt = True

    else:#run custom
        try:
            commandseries[0:0] = functions[command]
        except TypeError:
            print("Warning: unassigned function " + str(command) + " is unassigned", file = sys.stderr)

    return commandseries,stack,functions,prev,halt

def main(stack,functions,prev):
    #Parser for command line options
    parser = argparse.ArgumentParser(description = "Interpreter for the Legendre esoteric programming language.")
    parser.add_argument("-a","--allowZero", action = "store_true")
    parser.add_argument("-f","--file")
    parser.add_argument("-s","--stackOut", action = "store_true")

    args = parser.parse_args()
    allow_zero = bool(args.allowZero)

    #Program decoding starts
    pre = ""

    if not args.file:
        pre = input()
        if pre == "":
            return
    else:
        pre = open(args.file).read()

    mid = pre.split()
    final = []

    for i in mid:
        if i == "?" and allow_zero:
            final.append("?")
        elif i != 0 or allow_zero: #and allow_zero)
            final.append(int(i))

    halt = False

    #Functional programming at its best
    while final and not halt:
        final,stack,functions,prev,halt = run_command(final,stack,functions,prev)

    #Halting and output
    else:
        if args.stackOut:
            print(stack)
        else:
            for i in stack:
                print(i == "?" and "?" or chr(i),end = "")
            print("")
        if args.file or halt:
            return
        else:
            main(stack,functions,prev)


if __name__ == '__main__':
    main([],I_need_missing(),I_need_missing())

14

संघ बंद हुआ

यह प्रोग्रामिंग भाषा ट्यूरिंग पूर्ण है यदि यूनियन बंद सेट अनुमान गलत है।

नियंत्रण

कमांड्स की सूची:
x ++ इंक्रीमेंट x (INC)
x-- डिक्रीमेंट x (DEC)
j (x, y) इंस्ट्रक्शन सेट x को जोड़ें, यदि y निर्देश के कतार के अंत में 0 है।

सभी चर को 0 के रूप में आरंभीकृत किया जाता है

वाक्य - विन्यास

प्रोग्राम को कमांड के सेट के रूप में लिखा जाता है।
कमांड 1 कमांड 2 कमांड 3 ...
कमांड 1 कमांड 2
...

यह निर्धारित करने के लिए कि क्या प्रोग्राम बंद है, प्रत्येक सेट
j (x, y) में भिन्न कमांड्स की सूची के लिए केवल खाता सेट करता है ! = J (a, b)
+ (x)! = + (Y)

यदि कोई कमांड प्रकार (+, -, j) कम से कम आधे सेट में दिखाई देता है, तो यह कुछ भी नहीं करता है।

यदि निर्देश पंक्ति के अंत में कोई निर्देश नहीं हैं, तो कार्यक्रम समाप्त हो सकते हैं

खाली लूप सहित अनंत छोरों को j (x, y) का उपयोग करके प्राप्त किया जा सकता है

दुभाषिया

ट्यूरिंग कम्प्लीटनेस

यदि सभी तीन कमांड, j (x, y), वेतन वृद्धि, कमांड्स सभी उपलब्ध हैं, तो एक Minsky मशीन सिम्युलेटेड हो सकती है।

केवल j (x, y) के साथ कोई भी सेट जो j (x, y) का उपयोग करके पहुंचा है HALT
x ++ है INC
x-- DEC
j (x, y) है JZ

यदि यूनियन बंद सेट अनुमान सही है, तो कम से कम तीन आदेशों में से एक हमेशा अक्षम हो जाएगा, जिससे इस भाषा के लिए ट्यूरिंग पूर्ण होना असंभव हो जाएगा।


इसके बजाय मैं क्या करूँगा 3 ऑपरेटर होने के बजाय मूल्यों की एक अनंत संख्या है और प्रत्येक के modulo 4 को लेने के लिए तीन ऑपरेशनों में से एक और एक सेशन नहीं मिला। जब प्रोग्राम शुरू होता है तो यह जांचता है कि सेट का संघ बंद है और फिर किसी भी ऐसे तत्व को हटा देता है जो आधे से अधिक सेट में है। यह तब तक इसे दोहराता है जब तक कि ऐसा कोई तत्व न हो। यदि अनुमान सही है, तो सभी कार्यक्रम खाली प्रोग्राम के समान हैं, हालांकि यदि यह गलत है तो आप हर संभव प्रोग्राम को व्यक्त कर सकते हैं (यानी नो-ऑप शामिल है)।
श्रीओटचिलिज्म ओ'ज़ैविक

@HeatWizard इंटरप्रेटर द्वारा बंद किए गए यूनियन के निर्धारण को अलग-अलग चर पर एक ही ऑपरेटर को अलग-अलग मानता है। x ++ को y ++ से अलग माना जाता है। नतीजतन, अलग-अलग सेट का एक संक्रमण है जो बनाया जा सकता है। संभावित सेटों की अनंत संख्या के साथ, यदि तीन मुख्य प्रकारों में से कोई भी सेट के आधे से अधिक में नहीं है, तो यह पूरा हो रहा है।
f --n 11tɪk

यह संभव है कि यूनियन द्वारा बंद किए गए सेट अनुमान का एक प्रमाण पूर्ण रूप से ट्यूरिंग के रूप में तीन में से एक ऑपरेटर में रूपांतरण को छोड़ देगा, क्योंकि कार्यक्रम में सभी विभिन्न ऑपरेटरों को छोड़ना संभव हो सकता है, आपको केवल अनंत संख्या में से 3 की आवश्यकता होगी मान रहने के लिए।
f --n

13

त्वचीयं प्रमेय

भाषा दो संभावित अनंत टेपों पर काम करती है, जहां टेप के प्रत्येक स्थान पर एक मनमाना पूर्णांक संग्रहीत किया जा सकता है। दोनों टेप -1शुरू में भरे हुए हैं । दो टेप प्रमुख भी हैं जो दोनों टेपों पर स्थिति 0 से शुरू होते हैं।

दुभाषिया पहले इनपुट को पढ़ेगा, और मानों को पहले (डेटा) टेप में संग्रहीत करेगा, स्थिति 0 पर शुरू होगा।

फिर यह आपूर्ति किए गए कार्यक्रम को पढ़ेगा। प्रत्येक संख्या के लिए इसका सामना होता है, यह पहले जांच करेगा कि क्या मूल्य एक फर्मेट प्राइम है या नहीं। यदि हाँ, तो यह दूसरे (अनुदेश) टेप को लिख देगा जो फ़र्मैट प्राइम है, अन्यथा यह -1निर्देश टेप को लिखेगा ।

अगला निर्देश सूचक पर मान की जाँच करें, और निम्न में से एक करें:

  • -1 या इससे कम: प्रोग्राम से बाहर निकलें
  • 0: डेटा टेप स्थिति को बाईं ओर ले जाएं। निर्देश टेप स्थिति को दाईं ओर ले जाएं
  • 1: डेटा टेप स्थिति को दाईं ओर ले जाएं। निर्देश टेप स्थिति को दाईं ओर ले जाएं
  • 2: डेटा टेप स्थिति पर मान बढ़ाएँ। निर्देश टेप स्थिति को दाईं ओर ले जाएं
  • 3: डेटा टेप स्थिति पर मूल्य घटाएं। निर्देश टेप स्थिति को दाईं ओर ले जाएं
  • 4: यदि वर्तमान डेटा टेप स्थिति में मान शून्य है, तो निर्देश टेप को दाईं ओर ले जाएं, जब तक कि आप 5अनुदेश टेप पर मिलान (या बड़ा) मान तक नहीं पहुंचते , या इससे कुछ छोटा होता है 0। यदि यह एक 5(या बड़ा) है, तो निर्देश पॉइंटर को एक बार फिर से दाईं ओर ले जाएं, यदि यह 0प्रोग्राम से बाहर निकलने से छोटा है । यदि वर्तमान डेटा टेप की स्थिति शून्य नहीं है, तो बस निर्देश टेप को दाईं ओर ले जाएं
  • 5या अधिक: निर्देश सूचक को बाईं ओर ले जाएं, जब तक कि आप संबंधित 4मूल्य तक नहीं पहुंचते , या आपको कुछ कम मिलता है 0। उत्तरार्द्ध के मामले में, कार्यक्रम से बाहर निकलें।

(मिलान 5(या अधिक) और 4मूल्यों से इसका मतलब यह है कि किसी भी समय निर्देश टेप पर उचित मूल्य की खोज करते समय यह प्रारंभिक कमांड (या तो 5या अधिक) या के रूप में एक ही मूल्य का सामना करता है 4, इसे उचित संख्या को छोड़ना होगा अन्य मूल्य ( 4या 5(या अधिक) क्रमशः) खोज पर)

लूप, जब तक निर्देश कहता है कि आपको कार्यक्रम से बाहर निकलना है।

जब प्रोग्राम से बाहर निकलता है, तो डेटा टेप पर मानों को 0पहले टेप की स्थिति तक मान से आउटपुट करता है -1

सबूत

ध्यान दें कि भाषा अनिवार्य रूप से एक IO- कम Brainfuck दुभाषिया के लिए मैप करती है, जहां F_5किसी भी प्रकार के उचित लूप को करने में सक्षम होना आवश्यक है।

हालाँकि, फ़र्मेट प्राइम अनुमान के आधार पर केवल 5 फ़र्मेट प्राइम्स ( F_0- F_4) हैं। यदि F_5भाषा मौजूद है तो ट्यूरिंग-पूर्ण, जैसा कि हम जानते हैं कि ब्रेनफक ट्यूरिंग-पूर्ण है। हालांकि, F_5आप बिना ब्रांचिंग और लूपिंग के न तो कर पाएंगे, न ही अनिवार्य रूप से आपको बहुत सरल कार्यक्रमों में लॉक कर पाएंगे।

कार्यान्वयन

(रूबी 2.3.1 के साथ परीक्षण किया गया)

#!/usr/bin/env ruby
require 'prime'

CHEAT_MODE = false
DEBUG_MODE = false
NUM_CACHE = {}

def determine_number(n)
  return n.to_i if CHEAT_MODE
  n = n.to_i
  -1 if n<3

  return NUM_CACHE[n] if NUM_CACHE[n]

  i = 0

  loop do
    num = 2**(2**i) + 1
    if num == n && Prime.prime?(n)
      NUM_CACHE[n] = i
      break
    end
    if num > n
      NUM_CACHE[n] = -1
      break
    end
    i += 1
  end

  NUM_CACHE[n]
end

data_tape = Hash.new(-1)
instruction_tape = Hash.new(-1)

STDIN.read.each_char.with_index { |c,i| data_tape[i] = c.ord }
File.read(ARGV[0]).split.each.with_index do |n,i|
  instruction_tape[i] = determine_number(n)
end

data_pos = 0
instruction_pos = 0

while instruction_tape[instruction_pos] >= 0
  p data_tape, data_pos, instruction_tape, instruction_pos,'------------' if DEBUG_MODE

  case instruction_tape[instruction_pos]
  when 0 then data_pos -= 1; instruction_pos += 1
  when 1 then data_pos += 1; instruction_pos += 1
  when 2 then data_tape[data_pos] += 1; instruction_pos += 1
  when 3 then data_tape[data_pos] -= 1; instruction_pos += 1
  when 4 then
    if data_tape[data_pos] == 0
      count = 1
      instruction_pos += 1
      while count>0 && instruction_tape[instruction_pos] >= 0
        count += 1 if instruction_tape[instruction_pos] == 4
        count -= 1 if instruction_tape[instruction_pos] >= 5
        instruction_pos += 1
      end
      break if count != 0
    else
      instruction_pos += 1
    end
  else
    count = 1
    instruction_pos -= 1
    while count>0 && instruction_tape[instruction_pos] >= 0
      count += 1 if instruction_tape[instruction_pos] >= 5
      count -= 1 if instruction_tape[instruction_pos] == 4
      instruction_pos -= 1 if count>0
    end
    break if count != 0
  end
end

data_pos = 0

while data_tape[data_pos] >= 0
  print data_tape[data_pos].chr
  data_pos += 1
end

उदाहरण:

यह स्क्रीन पर एक नई रेखा के साथ H(छोटा Hello World!) लिखेगा :

17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17
17 17 17
5
17 17 17 17 17 17 17 17 17 17
17

के रूप में सहेजें example.fermatऔर इसे इस तरह से चलाएं (ध्यान दें: आपको हमेशा एक इनपुट की आवश्यकता होती है):

$ echo -n '' | ./fermat.rb example.fermat

यह अगला उदाहरण इनपुट के प्रत्येक मूल्य को एक-एक करके बढ़ाकर एक सरल सीज़र शैली का साइबरफ़ेयर करेगा। आपको स्पष्ट रूप ?से 5 वें F प्रधानमंत्री के साथ प्रतिस्थापित करना होगा:

17 65537 5 17 ? 257

आप इसे धोखा दे सकते हैं कि यह धोखा मोड को सक्षम करने और 2 4 1 2 5 3स्रोत कोड के रूप में उपयोग करके काम करता है :

$ echo 'Hello' | ./fermat.rb example2_cheat.fermat

2
मैं उस गरीब कोडर के लिए खेद महसूस करता हूं जिसे पाने के लिए संबंधित अभाज्य संख्या टाइप करनी होती है 5। मुझे उम्मीद है कि उनके पास एक अच्छा कीबोर्ड होगा।
AdmBorkBork

2
@AdmBorkBork चिंता मत करो। ब्रह्मांड में मौलिक कण होने की तुलना में इसमें अधिक बिट्स हैं।
f --n 13tɪk

@LliwTelracs वास्तव में इसका कोई मतलब नहीं है क्योंकि ब्रह्मांड में मौलिक कणों की मात्रा एलेफ़-नल (ओमेगा) है और ओमेगा से, इसका मतलब संख्या के वास्तविक आकार से नहीं है। (जब तक कि उसका ऐल्फ न: पी)
मैथ्यू रो

1
@MatthewRoh मैंने एक गलती की थी। मेरा अभिप्राय ब्रह्मांड में था।
f --n

2
@MatthewRoh वास्तव में, यह सेट सिद्धांत के साथ परिमित, अनंत, बेशुमार या असंगत भी हो सकता है! हम कभी नहीं जान पाएंगे, हालांकि :(
कैलक्यूलेटरफलाइन

10

निगल w / नारियल v2

जैसा कि पिछले संस्करण में त्रुटियां थीं, जिसने इसे इस प्रतियोगिता के लिए अमान्य कर दिया था, और मैं इस संस्करण के लिए पिछले संस्करण की गणना से उभारना नहीं चाहता, जो कि काफी अलग है, इस संस्करण को एक नई पोस्ट के रूप में प्रस्तुत किया जा रहा है।

यह भाषा पूर्ण नहीं हो रही है यदि Collatz अनुमान सभी सकारात्मक पूर्णांकों के लिए सिद्ध किया जा सकता है। अन्यथा, भाषा ट्यूरिंग पूर्ण है।

यह भाषा कार्डिनल पर आधारित थी ।

सबसे पहले, प्रोग्राम के contVal की गणना सूत्र
contal = sum (राशि (ASCII मानों की पंक्ति) * 2 ^ (पंक्ति संख्या -1) का उपयोग करके की जाती है।

इसके बाद, विपरीत दिशाओं में चलने वाले 2 स्वैलोज़ प्रत्येक ए या ई पर बनाए जाते हैं और सभी सशर्त बारी बयानों को आरंभीकरण की प्रतीक्षा करने के लिए निर्धारित किया जाता है।
E पर बनाए गए निगल, बाएँ / दाएँ होते हैं और A पर बनाए गए निगल ऊपर / नीचे होते हैं।

अंत में, कोड तब तक चरण प्रदर्शन करेगा जब तक कि सभी पॉइंटर्स को हटा नहीं दिया गया है या contVal एक पर गिर नहीं गया है।

प्रत्येक चरण पर, यदि contVal% 2 == 0 इसे 2 से विभाजित किया जाएगा, अन्यथा, इसे तीन से गुणा किया जाएगा और एक द्वारा बढ़ाया जाएगा।

आदेश:

0: 1 से मान सेट करें
: 1 से वेतन वृद्धि मूल्य
:> सही
v के लिए दिशा बदलें: नीचे की
ओर दिशा बदलें <: बाएं करने के लिए दिशा बदलें
^: दिशा बदलने के लिए ऊपर
आर: बाद में सूचक पहले सूचक के मूल्य के साथ तुलना करें पहला सूचक। अगर बराबर है, तो सीधे जाओ, वरना दाएं मुड़ जाओ।
एल: पहले पॉइंटर के बाद आने वाले पॉइंटर्स की तुलना पहले पॉइंटर के मान से की जाती है। यदि बराबर है, तो सीधे जाएं, अन्यथा बाएं मुड़ें।
E: पॉइंटर को डुप्लिकेट करें लेकिन लेफ्ट और राइट में दिशाओं में हेडिंग
A: पॉइंटर को डुप्लिकेट करें लेकिन दिशाओं में ऊपर और नीचे हेडिंग करें
? : मान 0 है, तो पॉइंटर निकालें

स्पष्टीकरण:

यदि Collatz अनुमान सभी सकारात्मक पूर्णांकों के लिए सिद्ध किया जा सकता है, तो इस भाषा में चलने वाले किसी भी कार्यक्रम की अवधि सीमित है, क्योंकि contVal हमेशा 1 में परिवर्तित हो जाएगा, जिससे कार्यक्रम समाप्त हो जाएगा।

अन्यथा, मुझे बस यह साबित करने की आवश्यकता है कि यह भाषा निम्नलिखित कार्यों को लागू कर सकती है

वृद्धि: जिसे +
कॉन्स्टेंट 0 द्वारा दर्शाया गया है : जिसे 0
वेरिएबल एक्सेस द्वारा दर्शाया गया है : वेरिएबल्स को पॉइंटर्स के रूप में संग्रहीत किया जाता है, क्योंकि वे
स्टेटमेंट कॉन्टेक्शंस को ट्रैवल करते हैं : ऑपरेशन के लिए तय की गई दूरी को बदलकर, जिस क्रम में ऑपरेशन किए जाते हैं उसे बदला जा सकता है
: लूप के लिए। इस भाषा में

E   > V
    ^+R
      +
      A

लूप के लिए कार्य करेगा> 1 तक गिनें (आगे कोड लूप में जोड़ा जा सकता है)

इसी तरह, कोड

Rv
^<

R लूप में निर्धारित सशर्त मान के बराबर होने तक कार्य करेगा।


आपने मुझे बहुत हरा दिया, मैं कोलेज़ अनुमान के साथ कुछ करने जा रहा था। अच्छा काम, इस पर दिलचस्प लो। मैं बस एक भाषा बनाने जा रहा था, जो केवल संख्याओं को संग्रहीत करने में सक्षम होगी जो उन्होंने 1 में परिवर्तित की थी
रोहन झुनझुनवाला

मैं उलझन में हूं। Collatz फ़ंक्शन इसमें कहाँ है? एक दूसरे रीड्रिथ से मुझे लगता है कि आपके कहने का मतलब है कि फ़ंक्शन को contValहर चरण पर लागू किया जाता है (और इसलिए यदि अनुमान सही है, तो कोई अनंत लूप नहीं हैं) - लेकिन मुझे यह स्पष्ट रूप से उत्तर में कहीं भी दिखाई नहीं देता है। ??
DLosc

क्षमा करें, जबकि यह कर रहा है कि मुझे लगता है कि मैंने गलती से अपने विवरण से किसी बिंदु पर काट दिया था
fəˈnɛt'k

10

पूर्णता / दोष

वाह, यह मजेदार था।

पूर्णता / अपूर्णता तभी पूर्ण होती है जब अनंत परिपूर्ण संख्याएँ हों। अगर वहाँ हैं, यह पूर्णता कहा जाता है, और अगर वहाँ नहीं कर रहे हैं, यह Imperfection कहा जाता है। जब तक यह रहस्य सुलझ नहीं जाता, तब तक यह दोनों नाम रखता है।

एक पूर्ण संख्या एक संख्या है जिसका भाजक संख्या के योग है, इसलिए छह एक पूर्ण संख्या है क्योंकि 1+2+3=6

पूर्णता / अपूर्णता के निम्नलिखित कार्य हैं:

पूर्णता / Imperfection एक शून्य-अनुक्रमित स्टैक के साथ स्टैक-आधारित है।

आदेश:

p(x, y): yth स्थिति में स्टैक पर x को धकेलता है।

z(x, y): x को yth स्थिति में स्टैक पर धकेलता है, जो पहले yth स्थिति में था, उससे छुटकारा पा लेता है

r(x): स्टैक से xth आइटम निकालता है

k(x): स्टैक पर xth आइटम लौटाता है

a(x, y): x और y जोड़ता है। जब स्ट्रिंग्स के साथ उपयोग किया जाता है, तो यह उन्हें एक साथ क्रम xy में डालता है।

s(x, y): x से y को घटाता है। तार के साथ, अंतिम len (y) को x से हटाता है

m(x, y): एक्स और वाई को गुणा करता है। यदि स्ट्रिंग्स के साथ उपयोग किया जाता है, तो एक्स गुणा लीन वाई गुणा करें।

d(x, y): x को y से विभाजित करता है

o(x): प्रिंट x

i(x, y): यदि x सत्य का मूल्यांकन करता है, तो यह फ़ंक्शन y को निष्पादित करता है

n(): वह काउंटर लौटाता है जिस पर कोड ब्लॉक कहा जाता है।

q(): स्टैक की लंबाई लौटाता है

t(): उपयोगकर्ता का निवेश

e(x, y): यदि x एक पूर्णांक है, यदि x और y का मान समान है, तो यह रिटर्न 1 होता है। यदि y एक स्ट्रिंग है तो इसे y की लंबाई मिलती है। यदि x एक स्ट्रिंग है, तो यह y को एक स्ट्रिंग में परिवर्तित करता है और जाँचता है कि क्या वे समान हैं, और यदि वे हैं, तो रिटर्न 1। अन्यथा रिटर्न 0।

l(x, y): यदि x, y से बड़ा है, तो यह 1 लौटाता है। यदि कोई स्ट्रिंग है, तो वह स्ट्रिंग की लंबाई का उपयोग करता है।

b(): कार्यक्रम को रोकता है।

c(x, y): x चलाता है, तो y।

एक पायथन के बराबर पाने के लिए and, दो मूल्यों को एक साथ गुणा करें। के लिए or, मान जोड़ने, और के लिए not, मूल्य घटाना से 1. यह तभी मूल्य 1 या 0, जो अपने आप में संख्या से विभाजित करके प्राप्त किया जा सकता है काम करता है।

डेटा प्रकार: पूर्णांक और तार। स्ट्रिंग्स द्वारा निरूपित किया जाता है '', और सभी गैर-पूर्णांक संख्याओं को गोल किया जाता है।

वाक्य - विन्यास:

कोड में दस {}एस के अंदर नेस्टेड फ़ंक्शन होते हैं । उदाहरण के लिए, एक प्रोग्राम जो इनपुट के लिए मिलेगा और उन्हें जोड़ा गया प्रिंट होगा {o(a(t(), t()))}:। कार्यक्रम की पृष्ठभूमि में एक काउंटर है जो 0 से शुरू होता है और हर बार 1 द्वारा प्रगति करता है जो एक कोड ब्लॉक को निष्पादित करता है। पहला कोड ब्लॉक पर 0और इतने पर चलता है । एक बार दस कोड ब्लॉक निष्पादित होने के बाद, छठी बार हर बार निष्पादित किया जाता है जब काउंटर एक आदर्श संख्या तक पहुंचता है। कार्य करने के लिए आपको सभी दस कोड ब्लॉक करने की आवश्यकता नहीं है, लेकिन यदि आप एक लूप बनाना चाहते हैं तो आपको 7 की आवश्यकता होगी। यह समझने के लिए कि यह भाषा कैसे काम करती है, निम्न प्रोग्राम को चलाएं, जो काउंटर को हर बार काउंटर को एक परिपूर्ण संख्या तक पहुंचने पर प्रिंट करता है {}{}{}{}{}{}{o(n())}:।

दुभाषिया यहां पाया जा सकता है: repl.it/GL7S/37 । या तो 1 का चयन करें और अपने कोड को टर्मिनल में टाइप करें, या code.perfectटैब में अपना कोड पेस्ट करें और जब आप चलाएं तो 2 का चयन करें। जब आप इसे आज़माएंगे तो यह समझ में आएगा।

ट्यूरिंग पूर्णता का प्रमाण / ट्यूरिंग पूर्णता की कमी।

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

इनपुट के रूप में 5 बिट्स, 1 या 0 लेने वाले स्व बिटवाइज़ साइक्लिक टैग दुभाषिया:

{p(t(),0)}{(p(t(),0)}{p(t(),0)}{p(t(),0)}{p(t(),0)}{p(0,0)}{c(i(e(k(s(q(),k(0))),0),c(r(q()),i(l(k(0),0),z(s(k(0),1),0)))),i(e(k(s(q(),k(0))),1),c(z(a(k(0),1),0),i(e(k(q()),1),p(k(s(q(),k(0))),1)))))}

इसे इनपुट के रूप में किसी भी नंबर पर ले जाने के लिए विस्तारित किया जा सकता है। यह अनंत इनपुट ले सकता है, लेकिन केवल तभी जब अनंत पूर्ण संख्याएं हों!


1
मुझे लगता है कि आप केवल स्थानीय रूप से लूपिंग के लिए एक नया मान बना सकते हैं क्योंकि यह फ़ंक्शन के साथ साझा नहीं किया गया है।
f --n 17tɪk

3
जैसा कि यह खड़ा है कि आपके पास टीसी का प्रमाण नहीं है। सॉफ़्टवेयर इंजीनियरिंग लेख जिसे आप लिंक करते हैं, आवश्यकताओं का एक मोटा सेट देता है, हालांकि टीसी केवल चेक बॉक्स का एक गुच्छा नहीं है। आपको एक टीसी ऑटोमेटन (जैसे मिन्स्की मशीन) को लागू करने या यह दिखाने की आवश्यकता होगी कि आपकी भाषा अपरिहार्य है।
श्रीओटचिलिज्म ओ'ज़ैविक

2
@WheatWizard वहाँ, मैंने एक बिटवाइक साइक्लिक टैग दुभाषिया जोड़ा। इसे किसी भी राशि के इनपुट के रूप में लिया जा सकता है। यह संभवतः इनपुट के रूप में अनंत चार्ट ले सकता है, लेकिन केवल तभी जब अनंत पूर्ण संख्याएं हों!
कॉमरेड स्पार्कलपनी

2
"एक बार दस कोड ब्लॉक किए जाने के बाद, हर बार काउंटर सही संख्या तक पहुंचने पर छठे को निष्पादित किया जाता है।" इसलिए दुभाषिया सीधे सही संख्या गिनता है? मुझे ऐसा लगता है कि यह चुनौती की भावना के खिलाफ है। वास्तविक भाषा विनिर्देश ज्यादा मायने नहीं रखता है, यह कुछ भी हो सकता है ट्यूरिंग-पूर्ण प्लस "केवल एक कदम के लिए ही चलाएं जब आप एक सही संख्या पर हिट करते हैं"।
xnor

10

तलवों

यह प्रोग्रामिंग लैंग्वेज ट्यूरिंग पूर्ण है यदि Scholz अनुमान सही है।

मैंने यह भाषा इसलिए लिखी क्योंकि @SztupY कह रहा था कि ऐसे कोई परिणाम नहीं होंगे जो अनुमान पर भरोसा करते हों कि यह पूरा होने के लिए सही हो

कमानों की सूची

+(x)      Increment x (INC)   
-(x)      Decrement x (DEC)  
j(x,y)    Jump to instruction x if y is 0 (JZ)  
x         End program (HALT) 

इन आदेशों के साथ, यह भाषा एक Minsky मशीन को अनुकरण कर सकती है

दुभाषिया

मैं अत्यधिक इसे नहीं चलाने की सलाह दूंगा। यह अतिरिक्त श्रृंखला की जांच करने के लिए एक असाधारण धीमी विधि का उपयोग करता है।

ट्यूरिंग पूर्णता

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

यदि स्कोल्ज़ अनुमान सही है, इस कार्यक्रम वास्तव में एक सामान्य Minsky मशीन की तरह काम करता
बढ़ते क्रम में
घटते क्रम में
कूद अगर शून्य
हॉल्ट

हालाँकि, यदि स्कोल्ज़ अनुमान गलत है, तो काउंटर अंततः एक मूल्य तक पहुँच जाएगा जिसके लिए स्कोल्ज़ अनुमान सही नहीं है। जैसा कि भाषा को एक संख्या पर पहुंचने के लिए बाहर निकलने के लिए डिज़ाइन किया गया है जो शोलोज़ अनुमान गलत है, प्रोग्राम कई बार चलने के बाद हर बार बाहर निकल जाएगा। इसलिए, सभी कार्यक्रमों की सीमित लंबाई होगी। चूंकि यह पूरी तरह से ट्यूरिंग भाषा के लिए आवश्यकताओं से असहमत है,

"टेप को लंबाई में तय नहीं किया जा सकता है, क्योंकि यह दी गई परिभाषा के अनुरूप नहीं होगा और उन गणनाओं की सीमा को गंभीरता से सीमित करेगा जो मशीन एक रैखिक बाउंड ऑटोमैटोन के लिए कर सकते हैं",

भाषा ट्यूरिंग पूरी नहीं होगी, शोलोज़ अनुमान गलत होना चाहिए


1
+1, जैसा कि यह वास्तव में भाषा में अनुमान की आवश्यकता को कठिन बना देता है, बल्कि तब भाषा को मारने के लिए कुछ असंगत जोड़ देता है यदि अनुमान सही / गलत है
Gryphon

मुझे नहीं मिला। आपके द्वारा प्रदान की जाने वाली कमांड ठीक वैसी ही हैं जैसे आपको एक मिन्स्की मशीन को अनुकरण करने की आवश्यकता होती है, इसलिए यदि यह सब वहां है तो आपकी भाषा स्कोल्ज़ अनुमान की परवाह किए बिना पूरी हो रही है। आपको अपने स्पष्टीकरण से कुछ याद नहीं होना चाहिए।
नथानिएल

@ नथानियल एक ट्यूरिंग पूरी भाषा के लिए आवश्यकताओं में से एक यह है कि भाषा एक अनंत लूप (हॉल्टिंग समस्या) को समाप्त कर सकती है। मेरा कोड मायने रखता है क्योंकि यह निर्देश चलाता है और यदि Scholz अनुमान गलत है, तो प्रोग्राम हमेशा निर्देशों की एक निर्धारित संख्या के बाद बंद हो जाएगा।
f --n

हां, लेकिन आप यह समझाना भूल गए हैं कि अगर स्कोल्ज़ अनुमान गलत है तो इसे रोकने का क्या कारण है। अपने उत्तर पर एक और नज़र डालें - यह बिल्कुल भी नहीं है।
नथानिएल

@ नथानियल कार्यक्रम शाब्दिक अनुमान में काम करता है, तो इसके लिए हर एक नंबर की जाँच करके शाब्दिक रूप से काम करता है। यह स्वचालित रूप से बाहर निकलता है जब यह एक संख्या पाता है जो अनुमान से असहमत है।
f --n

9

मंगेतर

बेटरोथ गिथब

"README.txt" के तहत, रीडमी और विनिर्देश जीथब पर है।

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

मैं इस पोस्ट के लिए प्रमाण प्रस्तुत करूंगा:

V. PROOF OF TURING COMPLETENESS

Now, no language can be Turing Complete with bounded program size. Therefore, if Betrothed
is Turing Complete, it must have unbounded program size. Since the lengths of the lines of
a Betrothed program must be twin prime pairs or betrothed pairs, and since both sequences
are unproven to be infinite or finite, Betrothed has unbounded program size if and only if
there are infintie betrothed pairs, there are infinite twin prime pairs, or both.

    Next: to prove that if Betrothed has an unbounded program size, then it is Turing
Complete. I will use the op-codes from the above table to demonstrate key factors of a
Turing Complete language; they are of the form  [index]<[ld]> .

  1. Conditional goto: 6<> 5<>, or if-popjump. This can be used to form a loop.
  2. Inequality to a constant K: 10<K> 
  3. Arbitrarily large variable space: you can use some separator constant C.

    With this, I have sufficient reason to believe that Betrothed is Turing Complete.

4
"अब, कोई भी भाषा ट्यूरेड प्रोग्राम आकार के साथ ट्यूरिंग कम्प्लीट नहीं हो सकती है।" मैं इस कथन के बारे में उलझन में हूं ... एक तरफ यह सच है कि एक बंधे हुए कार्यक्रम के आकार के साथ हम केवल विभिन्न कार्यक्रमों की एक सीमित संख्या लिख ​​सकते हैं, लेकिन दूसरी तरफ ट्यूरिंग पूर्णता के लिए एक सामान्य प्रमाण एक अलग के लिए दुभाषिया लिख ​​रहा है ट्यूरिंग कम्प्लीट लैंग्वेज, जिसे अनबाउंड प्रोग्राम साइज की जरूरत नहीं है ...
सिंह

1
खैर, दुभाषिया को दिए गए कार्यक्रम को दुभाषिया के कोड में डालने की आवश्यकता नहीं है, इसे दुभाषिया को इनपुट के रूप में दिया जाना चाहिए
लियो

7
@Leo। मैं यह कहूंगा कि, भाषा के टीसी होने के लिए, उसे दुभाषिया को पारित करने के लिए प्रोग्राम को एनकोड करने में सक्षम होना चाहिए (अर्थात, कल्पना करें कि इस भाषा में कोई इनपुट कमांड नहीं है।) एक कमांड के साथ एक भाषा की कल्पना करें b:। यह एक BF प्रोग्राम की व्याख्या करता है, जिसे इसके बाद रखा जाता है, जैसे b+++++.। कार्यक्रम का आकार, हालांकि, 10 वर्णों तक सीमित है। हालांकि यह बीएफ की व्याख्या कर सकता है, यह एक ट्यूरिंग मशीन के सभी कार्यक्रमों की गणना नहीं कर सकता है।
कॉनर ओ'ब्रायन

3
@EriktheOutgolfer आपकी समस्या के साथ मुख्य समस्या यह है कि "यह इनपुट से प्राप्त बीएफ प्रोग्राम डाल सकता है ..." इसके लिए, मैं आपको अपनी पिछली टिप्पणी को पढ़ने या फिर से पढ़ने के लिए जोरदार प्रोत्साहित करता हूं, खासकर यह पहला वाक्य। यदि इनपुट के आधार पर भाषा केवल ट्यूरिंग पूर्ण है, तो बिना किसी इनपुट के, ट्यूरिंग पूर्ण कैसे हो सकती है? अर्थात्, ट्यूरिंग को पूरा करने के लिए भाषा के लिए, यह स्वयं भाषा का प्रोग्राम है जिसे प्रोग्राम को एनकोड करना होगा। अन्यथा, एक पाया जाता है कि वे प्रोग्राम को इनपुट में एन्कोडिंग कर रहे हैं, जो प्रोग्रामिंग का एक वैध तरीका नहीं है।
कॉनर ओ'ब्रायन

1
मुझे नहीं लगता कि यह एक सुलझा हुआ बिंदु है। इस Esolang लेख में इस मुद्दे पर चर्चा की गई है। (यह भी सवाल है कि क्या ऐसा प्रोग्राम जो ट्यूरिंग-पूर्ण भाषा में हर संभव समाप्ति कार्यक्रम को प्रिंट करता है , साथ में इसके आउटपुट के साथ, ट्यूरिंग-पूर्णता प्रदर्शन है; इसमें इनपुट की आवश्यकता नहीं है और इसे एक लंबे समय तक प्रोग्राम के साथ किया जा सकता है; ।)

5

अमूल्य समता

यह भाषा इस बात पर आधारित है कि विपरीत समता के साथ कोई सौहार्दपूर्ण संख्याएं हैं या नहीं ।

आदेश

x : End program if not on top line  
+ : increment stored value  
- : decrement stored value  
{ : set next goto x value to current x value
} : goto previous x value set by {  
j : Go down one line if the special value is an amicable number and the
    parity is opposite to the matching number (loops back to top). If the
    special value is not an amicable number and not on the top line, go up
    one line.  

बहाव को काबू करें

कार्यक्रम शुरू करने के लिए वापस लूपिंग से पहले बाएं से दाएं बार-बार चक्र करता है। यदि यह एक "जे" का सामना करता है, तो यह निर्धारित करने के लिए मान को जांचता है कि क्या इसे पंक्तियों को बदलना चाहिए। यदि संख्या अपने मैच के विपरीत समता के साथ एक सौहार्दपूर्ण संख्या है, तो यह एक पंक्ति से नीचे चला जाता है (वापस शीर्ष पर), अन्यथा, यदि संख्या एक सौहार्दपूर्ण संख्या है, तो यह एक पंक्ति में ऊपर जाती है यदि पहले से ही शीर्ष पंक्ति में नहीं है।

कार्यक्रम केवल तभी समाप्त हो सकता है जब कार्यक्रम शीर्ष पंक्ति के बाहर किसी पंक्ति में एक एक्स तक पहुंचता है।

ट्यूरिंग कम्प्लीटनेस

इस कार्यक्रम का उपयोग एक मिन्स्की मशीन को अनुकरण करने के लिए किया जा सकता है, यह मानते हुए कि विपरीत समता के साथ सौहार्दपूर्ण संख्याओं की एक जोड़ी है।

j, {और} का उपयोग JZ (r, x) का अनुकरण करने के लिए किया जा सकता है, हालांकि यह शून्य के विपरीत सौहार्दपूर्ण संख्याओं की जांच करेगा।
+ है INC (r)
- DEC (r)
x हैल्ट ​​है

यदि आप पहली पंक्ति नहीं छोड़ सकते हैं, तो x और} कमांड कुछ नहीं करते हैं। जब तक यह खाली कार्यक्रम नहीं होता है, तब तक यह कार्यक्रम HALT स्थिति में प्रवेश करने में असमर्थ होता है। इसलिए, इस विवरण के तहत कि ट्यूरिंग पूर्णता के लिए एक एचएएलटी राज्य की आवश्यकता होती है , भाषा ट्यूरिंग अपूर्ण होगी।

दुभाषिया


2

नई पंक्ति

अस्वीकरण: यह थोड़ा गड़बड़ है और बहुत सरल है। यह पहली भाषा है जिसे मैंने कभी लिखा है और अनुमान केवल वही है जिसे मैंने समझा था। मुझे पता है कि किसी अन्य उपयोगकर्ता के पास उसी के साथ लंबा जवाब था लेकिन मैंने इसे वैसे भी लिखने का फैसला किया।

न्यूलाइन में लिखने के लिए आपके पास बहुत समय और न्यूलाइन्स ( \n) होना चाहिए । यह लीजेंड्रे अनुमान के सही होने पर काम करता है। प्रत्येक ऑपरेटर को लीजेंड्रे अनुमान में एक संख्या पर गिरना चाहिए जो हम n = 1 से शुरू करते हैं। हर बार जब आपके पास एक ऑपरेटर होता है, तो आप \ n की राशि लेते हैं और लीजेंड्रे अनुमान में प्लग करते हैं और उस सीमा को प्राप्त करते हैं जो कि अगली प्रमुख राशि है n में अवश्य ही गिरावट आनी चाहिए। इसलिए शुरू करने के लिए आप \n\nतब एक ऑपरेटर की ओर बढ़ते \nहैं, फिर एक अन्य ऑपरेटर के साथ हम 3 नईलाइन्स पर होते हैं। अब अगला एक यह 5 है इसलिए आप जोड़ते हैं \n\nऔर ऑपरेटर पर यह सुनिश्चित करते हैं कि अंतिम ऑपरेटर लाइन में नई संख्याओं की सही मात्रा है जो कि आप एक प्रमुख राशि पर हैं जो कि लीजेंड्रे अनुमान में आती है जो हमने शुरू की थी।

संख्याएँ (सरणी) चर की तरह है। जब भी कोई ऑपरेटर चलाता है (जो संख्याओं का उपयोग करता है) यह वेतन वृद्धि करता है।

+ adds
- subtracts
/ divide
* multiply 
s sqrt
% mod
a push to vars
g sets stack to numbers
q pushes value of stack to numbers
i increment 
d decrement
r stops subtraction at 0
w turns back on subtraction past 0
[ starts loop
] ends loop runs until stack is 0
{ starts loop
} ends loop and loops until loops[ln] is 0
k increment loops

जब तक हमारे पास असीमित अपराध हैं जो नियमों का पालन करते हैं इस भाषा में गैर परिमित टेप है।

Minsky मशीन

\n\ng\nr\n\n[\n\nd\n\n\n\n]

यह काम किस प्रकार करता है:

\n\ng     # the first two newlines are to get to a prime number of newlines (2) then sets the value of stack to the first variable in the array numbers (see code in link)

\nr       # gets to the next number and makes it so subtraction stops at 0

\n\n[     # starts the loop

\n\nd     # decrements stack 

\n\n\n\n] # ends loop

खानकाहे पर इसे आजमाएँ


@ इसे गैर-परिमित मेमोरी के साथ लूप करने की आवश्यकता नहीं है
क्रिस्टोफर

यह केवल तभी काम करता है जब यह सच हो। मैं अभी लेखन समाप्त नहीं कर सकता क्योंकि मैं मोबाइल पर हूं, लेकिन आज रात होगा
क्रिस्टोफर

यहां तक ​​कि अगर आपके पास अनंत स्मृति है, तो भी आपको अनंत लूप में सक्षम होना चाहिए।
पावेल

मेरे पास लूप हैं। उन्हें अनंत बनाने की कोशिश
क्रिस्टोफर

अभी वे दुर्घटनाग्रस्त हैं
क्रिस्टोफर

2

Taggis

टैगगिस एक भाषा है जो टैग सिस्टम पर आधारित है ।

टैगगिस की ट्यूरिंग पूर्णता Collatz अनुमान पर आधारित है

वाक्य - विन्यास

एक टैगगिस प्रोग्राम का सिंटैक्स केवल तीन स्ट्रिंग्स (उत्पादन नियम) होते हैं, जिसमें रिक्त स्थान के अनुसार पूरी तरह से अक्षर a, b और c शामिल होते हैं।

क्रियान्वयन

टैगगिस का एकमात्र कार्यक्रम राज्य एक स्ट्रिंग है जिसमें समान तीन वर्ण हैं।

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

उदाहरण के लिए, टैगगिस कार्यक्रम bc a aaa3n + 1 समस्या को लागू करता है, जहां पुनरावृत्तियों को aएस की एक समान संख्या द्वारा दर्शाया जाता है और 3n + 1 चरण को (3n + 1) / 2 [1] के साथ बदल दिया जाता है, जिससे कार्यक्रम आउटपुट होता है।

aaa // 3
  abc
    cbc
      caaa
        aaaaa // 5
          aaabc
            abcbc
              cbcbc
                cbcaaa
                  caaaaaa
                    aaaaaaaa // 8
                      aaaaaabc
                        aaaabcbc
                          aabcbcbc
                            bcbcbcbc
                              bcbcbca
                                bcbcaa
                                  bcaaa
                                    aaaa // 4
                                      aabc
                                        bcbc
                                          bca
                                            aa // 2
                                              bc
                                                a // 1 and halt because we then begin an infinite loop
                                                 HALT

ट्यूरिंग पूर्णता

बेशक, यह सरल प्रणाली ट्यूरिंग पूर्णता का अनुकरण करने के लिए बहुत सरल लग सकती है, लेकिन यह पता चला है कि 2 प्रतीकों (एक वर्ग जिसमें सार्वभौमिक मशीनें शामिल हैं) के साथ किसी भी ट्यूरिंग मशीन को टैग प्रणाली में परिवर्तित किया जा सकता है, जिसमें से 2 हटाए गए वर्ण हैं, और 32 * मीटर उत्पादन नियम, जहां mट्यूरिंग मशीन में राज्यों की संख्या है।

केवल 2 प्रतीकों वाली सबसे छोटी ज्ञात सार्वभौमिक ट्यूरिंग मशीन 18 राज्यों का उपयोग करती है और इस प्रकार संबंधित टैग प्रणाली में 576 उत्पादन नियम होते हैं [2]।

हालांकि, 3 प्रोडक्शंस और 2 हटाए गए प्रतीकों के साथ सभी टैग सिस्टम के सेट का कम्प्यूटेशनल वर्ग Collatz अनुमान [2] से बंधा है। यदि Collatz अनुमान गलत साबित होता है, तो टैगगिस ट्यूरिंग-पूर्ण है। अन्यथा, यह गणित में ANOTHER अनसुलझी समस्या पर आधारित है, जिससे एक छोटी ट्यूरिंग मशीन मिल रही है

def taggis(inp, a, b, c):
    current = inp
    seen = set()
    while True:
        seen.add(tuple(current))

        yield current

        head = current[0]

        current = current[2:]

        current.extend([a, b, c][head])

        if tuple(current) in seen:
            return

def parse():
    program = input().split(" ")

    assert len(program) == 3, "There has to be exactly 3 production rules!" 

    productions = []

    for production in program:

        production = [{"a": 0, "b": 1, "c": 2}[x] for x in production]
        productions.append(production)  

    program_input = [{"a": 0, "b": 1, "c": 2}[x] for x in input()]

    k = 0   

    for step in taggis(program_input, *productions):
        print(' ' * k +''.join(['abc'[x] for x in step]))

        k += 2
    print(' ' * (k - 1) + 'HALT')

parse()
  1. जो मूल Collatz फ़ंक्शन के समतुल्य है, क्योंकि विषम का 3n + 1 nहमेशा सम रहेगा और इसलिए विभाजन को स्वचालित रूप से लागू किया जा सकता है

  2. टैग सिस्टम और Collatz जैसे कार्य, Liesbeth De Mol ,

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