অজানা সম্পূর্ণতার প্রোগ্রামিং ভাষা লিখুন


91

কোনও ভাষা ডিজাইনের সময় কোনও ভাষা টিউরিং সম্পূর্ণ কিনা তা নির্ধারণ করা অত্যন্ত গুরুত্বপূর্ণ। প্রচুর ছদ্মবেশী প্রোগ্রামিং ল্যাঙ্গুয়েজগুলির সাথে এটি শুরু করা একটি খুব কঠিন কাজ, তবে এটি একটি খাঁজ দেয়। ট্যুরিং কমপ্লিট প্রমাণ করার পক্ষে এতটা শক্তিশালী এমন কিছু প্রোগ্রামিং ভাষা তৈরি করা যাক এমনকি বিশ্বের সেরা গণিতবিদরাও তাদের কোনওভাবেই প্রমাণ করতে ব্যর্থ হবেন to আপনার কাজ হ'ল এমন একটি ভাষা তৈরি করা এবং প্রয়োগ করা যাঁর টুরিং সম্পূর্ণতা গণিতে একটি বড় অমীমাংসিত সমস্যার উপর নির্ভর করে ।

বিধি

  • আপনার চয়ন করা সমস্যাটি অবশ্যই কমপক্ষে 10 বছর পূর্বে উত্থিত হওয়া উচিত এবং এই প্রশ্নের পোস্টিংয়ের পরে অবশ্যই সমাধান করা উচিত নয়। এটি গণিতের যে কোনও প্রমাণযোগ্য অনুমান হতে পারে কেবল উইকিপিডিয়া পৃষ্ঠায় তালিকাভুক্ত নয় ।

  • আপনার অবশ্যই ভাষার স্পেসিফিকেশন এবং একটি বিদ্যমান ভাষায় একটি প্রয়োগকরণ সরবরাহ করতে হবে।

  • প্রোগ্রামিং ল্যাঙ্গুয়েজ অবশ্যই টিউরিং সম্পূর্ণ হতে হবে এবং যদি কেবল অনুমানটি ধারণ করে। (বা যদি এবং শুধুমাত্র যদি অনুমানটি ধরে না থাকে)

  • আপনি কেন নির্বাচিত অনুমানের উপর ভিত্তি করে টুরিং সম্পূর্ণ বা অসম্পূর্ণ হবে তার একটি প্রমাণ অবশ্যই আপনাকে অন্তর্ভুক্ত করতে হবে। দোভাষী বা সংকলিত প্রোগ্রামটি চালনার সময় আপনি আনবাউন্ডেড মেমরির অ্যাক্সেস ধরে নিতে পারেন।

  • যেহেতু আমরা টিউরিং সম্পূর্ণতার সাথে উদ্বিগ্ন I / O প্রয়োজন হয় না, তবে লক্ষ্যটি সবচেয়ে আকর্ষণীয় ভাষা করা যাতে এটি সহায়তা করে।

  • এটি একটি তাই সর্বাধিক ভোটের উত্তর জিতবে।

লক্ষ্য মানদণ্ড

একটি ভাল উত্তর করা উচিত? ভোট দেওয়ার সময় এখানে কিছু বিষয় সন্ধান করা হবে তবে প্রযুক্তিগতভাবে প্রয়োজন হয় না


এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

13
মোট কথা, আমি উত্তরগুলি হতাশার সাথে খুঁজে পাচ্ছি। তারা বেশ অনেকটা "একটি টিউরিং-সম্পূর্ণ ভাষা দিয়ে শুরু করুন, তারপরে যদি অনুমান X সত্য / মিথ্যা হয় এবং যদি তা হয় তবে একটি মূল বৈশিষ্ট্যটি বন্ধ করুন বা অক্ষম করুন test"
xnor

1
@ এক্সনোর আমি আপনার সাথে একমত, আমি আশা করছিলাম যে এই অনুগ্রহটি আরও কিছু আকর্ষণীয় উত্তরগুলিকে উত্সাহিত করবে তবে মনে হচ্ছে এটি হবে না।
শ্রুতচিলিজম ওজাইক 12'17

2
আমি মনে করি যে বিষয়গুলির মধ্যে একটি হ'ল বেশিরভাগ অনুমানটি অসীম সংখ্যার জন্য সত্য বলে প্রমাণিত হয়েছে তবে প্রতিবিস্মরণীও অসীম সংখ্যার মানের ক্ষেত্রে সত্য be ফলস্বরূপ, যদি সত্য হয় তবে ট্যুরিংয়ের সম্পূর্ণতা প্রমাণ করা প্রায় অসম্ভব হয়ে পড়ে।
fəˈnɛtɪk

1
আমি মনে করি যে টুরিংয়ের সম্পূর্ণতা একটি নির্দিষ্ট অনুমানের সাথে এক-এক-বাঁধা হয়, এটি একটি দুর্দান্ত দৃ requirement় প্রয়োজনীয়তা। আমি মনে করি যদি টিউরিং সম্পূর্ণতার প্রমাণ বা অসম্মতি প্রমাণিত হয় যথাক্রমে দুটি পৃথক ওপেন সমস্যা স্থির করে। (অর্থাত্ টুরিং সম্পূর্ণরূপে প্রমাণিত হওয়া ওপেন সমস্যার সমাধান করে A এবং অস্বীকার করা খোলা সমস্যাটিকে বি সিদ্ধান্ত দেয় B)।
পাইরুলেজ

উত্তর:


48

লেজেন্ড্রে

এই ভাষাটি কেবলমাত্র টিউরিং-সম্পূর্ণ এবং কেবলমাত্র যদি লেজেন্ড্রের অনুমানটি মিথ্যা হয়, অর্থাত্ সেখানে একটি পূর্ণসংখ্যার এন> 0 এর উপস্থিতি রয়েছে যে এন ^ 2 এবং (এন + 1) ^ 2 এর মধ্যে কোনও প্রাইম নেই। এই ভাষাটি আন্ডারলোড থেকে কিছুটা অনুপ্রেরণা নিয়েছে, যদিও কিছু দিক থেকে এটি এর থেকে পৃথক।

লেজেন্ড্রেতে প্রোগ্রামগুলি ইতিবাচক পূর্ণসংখ্যার সিরিজ নিয়ে গঠিত হয় (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

এই সাধারণ প্রোগ্রামটি 4 (কমান্ড: 3) কার্যকর করার আগে 2 এবং তারপরে 3 এবং শেষ পর্যন্ত একটি 10 ​​ধাক্কা দেয়, যার ফলে 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' সংরক্ষণ করে, তারপর 10-এ '15 31 ', 9 ফাংশন চালানোর আগে (24 ব্যবহার করে), যা 5 স্ট্যাকের দিকে ঠেলে দেয় এবং বারবার এটি হ্রাস করে, যতক্ষণ না এটি 0 না পৌঁছায় এবং সরিয়ে না দেওয়া হয় । তারপরে, প্রোগ্রামটি থেমে আছে।

মিনস্কি মেশিন

একটি মিনস্কি মেশিনকে লেজেন্ড্রে কোডে রূপান্তর করতে, 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

B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর:

1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 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 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 24 ? x

B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর:

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 / - অনুমতিজিরো পতাকা ব্যবহার করবেন? ব্যবহার করতে হবে, -f / - ফাইলটি সরাসরি একটি ফাইল থেকে কোড চালানোর জন্য এবং -s / - স্ট্যাকআউট থেকে স্ট্যাক আউটপুট করার পরিবর্তে পাইথন তালিকা হিসাবে। যদি কোনও ফাইল দেওয়া না হয়, দোভাষী অনুবাদক এক প্রকারের REPL মোডে প্রবেশ করে, যা সর্বোপরি - স্ট্যাকআউট দিয়ে ব্যবহৃত হয়।

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-- হ্রাস x (ডিসি)
জে (এক্স, ওয়াই) নির্দেশের সারির শেষ হতে y যদি 0 হয় তবে নির্দেশ সেট যোগ করুন

সমস্ত পরিবর্তনশীল 0 হিসাবে আরম্ভ করা হয়

বাক্য গঠন

প্রোগ্রামগুলি কম্যান্ডের সেটগুলির সেট হিসাবে লেখা হয়।
কমান্ড 1 কমান্ড 2 কমান্ড 3 ...
কমান্ড 1 কমান্ড 2 ...
...

প্রোগ্রামটি ইউনিয়ন বন্ধ আছে কিনা তা নির্ধারণের জন্য, প্রতিটি সেট কেবলমাত্র
জে (x, y) সেটে থাকা বিভিন্ন কমান্ডের তালিকার জন্য অ্যাকাউন্ট করে ! = J (a, b)
+ (x)! = + (Y)

যদি কোনও কমান্ড প্রকার (+, -, j) কমপক্ষে অর্ধেক সেটে উপস্থিত হয় তবে তা কিছুই করে না।

নির্দেশের সারির শেষে কোনও নির্দেশনা না থাকলে প্রোগ্রামগুলি শেষ হতে পারে

খালি লুপ সহ অসীম লুপগুলি j (x, y) ব্যবহার করে অর্জন করা যায়

অনুবাদক

টুরিং সম্পূর্ণতা

তিনটি কমান্ড, j (x, y), ইনক্রিমেন্ট, হ্রাস কমান্ডগুলি যদি উপলভ্য থাকে তবে একটি মিনস্কি মেশিন সিমুলেট করা যায়।

কেবলমাত্র জে (x, y) সহ যে কোনও সেট যা জে (x, y) ব্যবহার করে পৌঁছেছে তা হল্ট
এক্স ++ হ'ল আইএনসি
x-- হ'ল ডিসি
জে (এক্স, ওয়াই) জেজেড

ইউনিয়ন বদ্ধ সেট অনুমান যদি সঠিক হয় তবে তিনটি কমান্ডের মধ্যে কমপক্ষে একটি সর্বদা অক্ষম থাকবে, যার ফলে এই ভাষাটি ট্যুরিং সম্পূর্ণ হওয়া অসম্ভব হয়ে পড়ে।


আমি যা করবো তার পরিবর্তে 3 জন অপারেটর হ'ল অসীম সংখ্যার মান থাকে এবং তিনটি ক্রিয়াকলাপের সাথে একটি নো-অপ্ট পাওয়ার জন্য প্রতিটিটির 4 টি মডেলও নেওয়া হয়। প্রোগ্রামটি শুরু হয়ে গেলে এটি পরীক্ষা করে যে সেটগুলির ইউনিয়ন বন্ধ রয়েছে এবং তারপরে সেটের অর্ধেকেরও বেশি থাকা কোনও উপাদান সরিয়ে দেয়। এটি এরপরে পুনরাবৃত্তি করে যতক্ষণ না কোনও উপাদান নেই। যদি অনুমানটি সত্য হয় তবে সমস্ত প্রোগ্রাম খালি প্রোগ্রামের সমান, তবে এটি মিথ্যা হলে আপনি প্রতিটি সম্ভাব্য প্রোগ্রামটি প্রকাশ করতে পারেন (কেন অপশনটি অন্তর্ভুক্ত করা যায় না)।
শ্রুতচিলিজম ওজাইক

@ হুইট উইজার্ড দোভাষী দ্বারা বন্ধ ইউনিয়নের সংকল্পটি বিভিন্ন ভেরিয়েবলের একই অপারেটরটিকে আলাদা বলে বিবেচনা করে। x ++ কে y ++ থেকে আলাদা বলে মনে করা হয়। ফলস্বরূপ, বিভিন্ন সেটগুলির একটি অসীমতা তৈরি করা যেতে পারে। অসম্ভব সম্ভাব্য সেটগুলির সংখ্যার সাথে, তিনটি মূল ধরণের কোনওটি যদি সেটগুলির অর্ধেকের বেশি না হয় তবে এটি সম্পূর্ণরূপে ট্যুরিং।
fəˈnɛtɪk

ইউনিয়নের ক্লোজড সেট অনুমানের পক্ষে প্রমাণ হিসাবে তিনটি অপারেটরের একজনকে টুরিং সম্পূর্ণ হিসাবে রূপান্তর করতে হবে, যেহেতু প্রোগ্রামে সমস্ত অপারেটরকে রেখে দেওয়া সম্ভব হতে পারে, আপনার অসীম সংখ্যার মধ্যে কেবল তিনটির প্রয়োজন হবে মান মানা।
fəˈnɛtɪk

13

ফারমেট প্রাইমস

ভাষাটি দুটি সম্ভাব্য অসীম টেপগুলিতে কাজ করে, যেখানে টেপের প্রতিটি অবস্থান একটি নির্বিচারে পূর্ণসংখ্যা সঞ্চয় করতে পারে। দুটি টেপ -1শুরুতে ভরাট । দুটি টেপ শিরোনাম রয়েছে যা উভয় টেপে 0 পজিশনে শুরু হয়।

দোভাষী প্রথমে ইনপুটটি পড়বেন এবং 0 থেকে শুরু করে মানটিকে প্রথম (ডেটা) টেপে সঞ্চয় করবেন store

তারপরে এটি সরবরাহিত প্রোগ্রামটি পড়বে। প্রতিটি সংখ্যার সাথে এটির মুখোমুখি হয়, এটি প্রথমে পরীক্ষা করে দেখবে যে মানটি একটি ফার্ম্যাট প্রাইম কিনা। যদি হ্যাঁ, তবে এটি দ্বিতীয় (নির্দেশ) টেপকে লিখবে যা এটি ফারমেট প্রাইম, অন্যথায় এটি -1নির্দেশ টেপটিতে লিখবে ।

পরবর্তী নির্দেশ নির্দেশকের মানটি পরীক্ষা করুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:

  • -1 বা তার চেয়ে কম: প্রোগ্রামটি থেকে প্রস্থান করুন
  • 0: ডেটা টেপের অবস্থানটি বাম দিকে সরান। নির্দেশ টেপের অবস্থানটি ডানদিকে সরান
  • 1: ডেটা টেপের অবস্থানের একটিকে ডান দিকে সরান। নির্দেশ টেপের অবস্থানটি ডানদিকে সরান
  • 2: ডেটা টেপ অবস্থানের মান বাড়ান। নির্দেশ টেপের অবস্থানটি ডানদিকে সরান
  • 3: ডেটা টেপের অবস্থানে মান হ্রাস করুন। নির্দেশ টেপের অবস্থানটি ডানদিকে সরান
  • 4: যদি বর্তমান ডেটা টেপের অবস্থানের মান শূন্য হয়, তবে আপনি নির্দেশ টেপটিতে কোনও মিলের 5(বা আরও বড়) মান বা তার চেয়েও ছোট কিছু না পৌঁছানো অবধি নির্দেশ টেপটিকে ডানে সরিয়ে দিন 0। যদি এটি একটি 5(বা আরও বড়) হয় তবে নির্দেশ পয়েন্টারটিকে ডানদিকে আবার সরান, যদি এটির চেয়ে ছোট হয় 0তবে প্রোগ্রামটি থেকে প্রস্থান করুন। যদি বর্তমান ডেটা টেপের অবস্থান মান শূন্য না হয় তবে কেবল নির্দেশ টেপটিকে ডানদিকে সরান
  • 5বা আরও: আপনার সংশ্লিষ্ট 4মান না পৌঁছানো বা আপনি এর চেয়ে কম কিছু না পাওয়া পর্যন্ত নির্দেশ পয়েন্টারটিকে বাম দিকে সরান 0। পরবর্তী ক্ষেত্রে, প্রোগ্রামটি থেকে প্রস্থান করুন।

( 5বা আরও বেশি) এবং 4মানগুলির সাথে মিল রেখে এর অর্থ হ'ল যে কোনও সময় নির্দেশ টেপটিতে যথাযথ মান অনুসন্ধান করার সময় এটি প্রাথমিক কমান্ডের (যেমন 5(বা আরও)) বা একই মানের 4সাথে মিলবে, উপযুক্ত নম্বরটি এড়িয়ে যেতে হবে অনুসন্ধানে অন্যান্য মান ( 4বা 5যথাক্রমে (বা আরও))

লুপ, নির্দেশ না দেওয়া পর্যন্ত আপনাকে প্রোগ্রামটি থেকে বেরিয়ে আসতে হবে।

যখন প্রোগ্রামটি প্রস্থান করে, 0প্রথম টেপ পজিশন থেকে কোনও মান সমেত ডেটা টেপের মানগুলি আউটপুট করুন -1

প্রমাণ

নোট করুন যে ভাষাটি মূলত আইও-কম ব্রেনফাক ইন্টারপ্রেটারকে ম্যাপ করে, যেখানে F_5কোনও ধরণের যথাযথ লুপ করতে সক্ষম হওয়া প্রয়োজন।

তবে ফার্মাট প্রাইম অনুমানের উপর ভিত্তি করে কেবল পাঁচটি ফার্মাট প্রাইম রয়েছে ( F_0- F_4)। যদি F_5বিদ্যমান থাকে তবে ভাষাটি টুরিং-সম্পূর্ণ, কারণ আমরা জানি যে ব্রেইনফাক টিউরিং-সম্পূর্ণ। যাইহোক, F_5আপনি ছাড়া ব্রাঞ্চিং বা লুপিং না করতে পারবেন না, মূলত আপনাকে খুব সাধারণ প্রোগ্রামে লক করে।

বাস্তবায়ন

(রুবি ২.৩.১ দিয়ে পরীক্ষা করা)

#!/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 তম ফারম্যাট প্রাইম সহ প্রতিস্থাপন করতে হবে:

17 65537 5 17 ? 257

আপনি এটি চেষ্টা করে দেখতে পারেন যে এটি চিট মোড সক্ষম করে 2 4 1 2 5 3এবং উত্স কোড হিসাবে ব্যবহার করে :

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

2
আমি দরিদ্র কোডারটির জন্য দুঃখিত, যাকে পেতে প্রাসঙ্গিক নম্বরটি টাইপ করতে হবে 5। আমি তাদের একটি ভাল কীবোর্ড আশা করি।
অ্যাডমবর্কবার্ক

2
@ অ্যাডমবর্কবর্ক চিন্তা করবেন না মহাবিশ্বের মৌলিক কণাগুলির তুলনায় এর আরও বিট রয়েছে।
fəˈnɛtɪk

@ ল্যুইটেল্যাকস আসলে এটি বোঝায় না যেহেতু মহাবিশ্বে প্রাথমিক কণাগুলির পরিমাণ আলেফ-নাল (ওমেগা) এবং ওমেগা থেকে, এটি সংখ্যার প্রকৃত আকার বোঝাতে শুরু করে না। (এটির অ্যালফিট না থাকলেই পি)
ম্যাথু রোহ

1
@ ম্যাথেরহোহ আমি একটি ভুল করেছি আমি পর্যবেক্ষণযোগ্য মহাবিশ্বের মানে
fəˈnɛtɪk

2
@ ম্যাথেররোহ আসলে, এটি সীমাবদ্ধ, অসীম, অগণিত বা সেট থিয়োর সাথেও বেমানান হতে পারে! তবে আমরা কখনই জানতে পারব না :(
ক্যালকুলেটরফ্লাইন

10

ডাব্লু / নারকেল ভি 2 গিলে ফেলে

যেহেতু পূর্ববর্তী সংস্করণে ত্রুটি ছিল যা এই প্রতিযোগিতার জন্য এটি অকার্যকর করে তুলেছে এবং আমি এই সংস্করণটির পূর্ববর্তী সংস্করণ গণনা থেকে উপস্থাপনা পেতে চাই না যা উল্লেখযোগ্যভাবে আলাদা, এই সংস্করণটি একটি নতুন পোস্ট হিসাবে জমা দেওয়া হচ্ছে।

এই ভাষাটি ট্যুরিং সম্পূর্ণ হয় না যদি কোলাটজ কনজেক্টারটি সমস্ত ধনাত্মক পূর্ণসংখ্যার জন্য প্রমাণিত হতে পারে। অন্যথায়, ভাষা টিউরিং সম্পূর্ণ।

এই ভাষাটি কার্ডিনালের বাইরে ছিল ।

প্রথমত, প্রোগ্রামটির কনটওয়াল গণনা করা হয় সূত্রটি
কনটভাল = যোগফল (যোগফল (সারির ASCII মান) * 2 ^ (সারি নম্বর -1)) ব্যবহার করে গণনা করা হয়

এরপরে, বিপরীত দিকের দিকে পরিচালিত 2 টি গেলা প্রতিটি এ বা ইতে তৈরি করা হয় এবং সমস্ত শর্তাধীন টার্ন স্টেটমেন্টগুলি আরম্ভের জন্য অপেক্ষা করতে প্রস্তুত হয়।
E তে তৈরি গেলাগুলি বাম / ডানদিকে এবং একটি এ এ তৈরি করা গিলে মাথা নীচু / নিচে হয়।

সবশেষে কোডটি পদক্ষেপগুলি সম্পাদন করবে যতক্ষণ না সমস্ত পয়েন্টার অপসারণ করা হয় বা কনটওয়াল একের মধ্যে না পড়ে।

প্রতিটি পদক্ষেপে, যদি কনটভাল% 2 == 0 এটি 2 দিয়ে বিভক্ত করা হয়, অন্যথায়, এটি তিনটি দ্বারা গুণিত হবে এবং এক দ্বারা বৃদ্ধি পাবে।

আদেশগুলি:

0: মান 0
+ এ সেট করুন : বর্ধিত মান 1
> দ্বারা : দিকনির্দেশকে ডান দিকে পরিবর্তন করুন: দিক
পরিবর্তন করুন নীচে
<: দিক পরিবর্তন করুন বামে
^: দিক পরিবর্তন করুন
আর: প্রথম পয়েন্টারের পরে পরবর্তী পয়েন্টারগুলির মানের সাথে তুলনা করুন প্রথম পয়েন্টার। সমান হলে সোজা যান, অন্যথায় ডানদিকে ঘুরুন।
এল: প্রথম পয়েন্টারের পরে পরবর্তী পয়েন্টারগুলি প্রথম পয়েন্টারের মানের সাথে তুলনা করে। সমান হলে সোজা যান, অন্যথায় বাম দিকে ঘুরুন।
ই: পয়েন্টারটি সদৃশ করুন তবে বাম এবং ডানদিকে দিকনির্দেশ করুন
A: পয়েন্টারটি সদৃশ করুন তবে উপরে এবং নীচে দিকের শিরোনাম
? : মান 0 হলে পয়েন্টারটি সরান

ব্যাখ্যা:

যদি কোল্টজ কনজেকচারটি সমস্ত ধনাত্মক পূর্ণসংখ্যার জন্য প্রমাণিত হতে পারে তবে এই ভাষায় চালিত কোনও প্রোগ্রামের সময়সীমা সীমাবদ্ধ, কারণ কনটভাল সর্বদা 1 তে রূপান্তরিত হয়, যার ফলে প্রোগ্রামটি শেষ হয়।

অন্যথায়, আমাকে কেবল প্রমাণ করতে হবে যে এই ভাষাটি নিম্নলিখিত ফাংশনগুলি প্রয়োগ করতে পারে

বর্ধন: যা +
কনস্ট্যান্ট 0 দ্বারা প্রতিনিধিত্ব করা হয় : যা 0
পরিবর্তনশীল অ্যাক্সেস দ্বারা প্রতিনিধিত্ব করা হয় : ভেরিয়েবলগুলি ভ্রমণ করার সাথে সাথে পয়েন্টার হিসাবে সংরক্ষণ করা
হয় বিবৃতি বর্ণন: অপারেশনে ভ্রমণ করা দূরত্ব পরিবর্তন করে ক্রমটি ক্রম পরিচালিত হয়
লুপের জন্য: এই ভাষায়

E   > V
    ^+R
      +
      A

লুপের জন্য একটি হিসাবে কাজ করবে> 1 অবধি গণনা করুন (আরও কোড লুপটিতে যুক্ত হতে পারে)

একইভাবে, কোড

Rv
^<

আর লুপে শর্তযুক্ত মান সেট করার সমান না হওয়া পর্যন্ত করণীয় হিসাবে কাজ করবে।


আপনি আমাকে খুব মারলেন, আমি কোলাটজ অনুমানের সাথে কিছু করতে যাচ্ছিলাম। ভাল কাজ, এটি আকর্ষণীয় গ্রহণ। আমি কেবল একটি ভাষা তৈরি করতে যাচ্ছিলাম যা কেবলমাত্র সংখ্যায় সংরক্ষণ করতে সক্ষম হবে যদি তারা রূপান্তরিত হয় ১.
রোহান ঝুনঝুনওয়ালা

আমি বিভ্রান্ত কোলাটজ ফাংশন এর মধ্যে কোথায় আসে? দ্বিতীয় পাঠের মধ্য থেকে আমি মনে করি আপনি বলতে চাইছেন যে ফাংশনটি contValপ্রতিটি পদক্ষেপে প্রয়োগ করা হয়েছে (এবং সুতরাং যদি অনুমানটি সত্য হয় তবে কোনও অসীম লুপ নেই) - তবে আমি উত্তরটিতে কোথাও স্পষ্টভাবে বলেছি তা দেখতে পাচ্ছি না। ??
ডিএলস্ক

দুঃখিত, এটি করার সময় আমি মনে করি যে আমি ঘটনাক্রমে আমার বিবরণটি কোনও সময় কাটা করেছি
fəˈnɛtɪk

10

পরিপূর্ণতা / অসিদ্ধতা

হুই, মজা ছিল।

পারফেকশন / অপূর্ণতা কেবলমাত্র সম্পূর্ণ যখন অসীম নিখুঁত সংখ্যা থাকে। যদি সেখানে থাকে তবে একে বলা হয় পারফেকশন, এবং যদি না থাকে তবে একে অপূর্ণতা বলে। এই রহস্যের সমাধান না হওয়া পর্যন্ত এটি দুটি নাম ধারণ করে।

একটি নিখুঁত সংখ্যা এমন একটি সংখ্যা, যার বিভাজক সংখ্যার সমষ্টি হয়, সুতরাং ছয়টি একটি নিখুঁত সংখ্যা কারণ 1+2+3=6

নিখুঁততা / অসম্পূর্ণতা নিম্নলিখিত ফাংশন রয়েছে:

পরিপূর্ণতা / অপূর্ণতা শূন্য-সূচকযুক্ত স্ট্যাক সহ স্ট্যাক-ভিত্তিক।

আদেশগুলি:

p(x, y): yth অবস্থানে স্ট্যাকের উপর x চাপায়।

z(x, y): y তম স্থানে x স্ট্যাকের দিকে ধাক্কা দেয়, যা আগে yth অবস্থানে ছিল তা থেকে মুক্তি পায়

r(x): স্ট্যাক থেকে x ম আইটেমটি সরিয়ে দেয়

k(x): স্ট্যাকের দশম আইটেমটি প্রদান করে

a(x, y): x এবং y যোগ করে। স্ট্রিংগুলির সাথে ব্যবহার করার সময় এটি তাদের সাথে এক সাথে xy রাখে।

s(x, y): এক্স থেকে y বিয়োগ করে। স্ট্রিং সহ, এক্স থেকে সর্বশেষ লেন (y) সরিয়ে দেয়

m(x, y): x এবং y গুণ করে। যদি স্ট্রিংয়ের সাথে ব্যবহার করা হয় তবে x বার লেন y গুন করে।

d(x, y): x দ্বারা y কে ভাগ করে

o(x): প্রিন্ট x

i(x, y): যদি এক্স সত্যের সাথে মূল্যায়ন করে, তবে এটি y ফাংশনটি কার্যকর করে

n(): কোড ব্লকে ফোন করা হচ্ছে এমন কাউন্টারকে ফেরত দেয়।

q(): স্ট্যাকের দৈর্ঘ্য প্রদান করে

t(): ব্যবহারকারীর ইনপুট

e(x, y): X যদি একটি পূর্ণসংখ্যা হয়, যদি x এবং y এর সমান মান থাকে তবে এই 1 প্রদান করে y যদি y একটি স্ট্রিং হয় তবে এটি y এর দৈর্ঘ্য পায়। যদি x একটি স্ট্রিং হয়, তবে এটি y কে একটি স্ট্রিংয়ে রূপান্তর করে এবং যদি তা একই হয় কিনা তা পরীক্ষা করে এবং যদি তা হয় তবে 1 প্রদান করে returns নইলে এটি 0 প্রদান করে returns

l(x, y): যদি x y এর চেয়ে বড় হয়, তবে এটি ফিরে আসে ১। যদি কোনও স্ট্রিং থাকে তবে এটি স্ট্রিংয়ের দৈর্ঘ্য ব্যবহার করে।

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 নির্বাচন করুন। আপনি যখন এটি চেষ্টা করবেন তখন তা বোধগম্য হবে।

টুরিংয়ের সম্পূর্ণতার প্রমাণ / টুরিংয়ের সম্পূর্ণতার অভাব।

মতে এই সফটওয়্যার ইঞ্জিনিয়ারিং স্ট্যাক বিনিময় নিবন্ধ , একটি টুরিং সম্পূর্ণ লাফ শর্তসাপেক্ষ পুনরাবৃত্তি একটি ফর্ম আছে, এবং পড়া বা মেমরি লিখতে একটি উপায় আছে সক্ষম হতে হবে। এটি স্ট্যাকের আকারে মেমরিটি পড়তে / লিখতে পারে এবং প্রতিবার কাউন্টারটি নির্ভুল সংখ্যায় পৌঁছালে reaches ষ্ঠ কোড ব্লক কার্যকর করা হয় তার কারণে এটি লুপ হতে পারে। যদি নিখুঁত সংখ্যার অসীম সংখ্যা থাকে তবে এটি অনির্দিষ্টকালের জন্য লুপ করতে পারে এবং টুরিং সম্পূর্ণ হয় এবং অন্যথায় এটি হয় না।

স্ব বিটওয়াইস সাইক্লিক ট্যাগ দোভাষী যে ইনপুট হিসাবে 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ɛtɪk

3
যেহেতু এটি দাঁড়িয়েছে আপনার কাছে টিসির কোনও প্রমাণ নেই। আপনার সাথে সংযুক্ত সফ্টওয়্যার ইঞ্জিনিয়ারিং নিবন্ধটি প্রয়োজনীয়তার মোটামুটি সেট দেয়, তবে টিসি চেক অফ করার জন্য কেবল একটি গুচ্ছ বাক্স নয়। আপনাকে একটি টিসি অটোমেটন (মিনস্কি মেশিনের মতো) প্রয়োগ করতে হবে বা আপনার ভাষা অনির্বাচিত তা দেখাতে হবে।
শ্রুতচিলিজম ওজাইক

2
@ ওয়েট উইজার্ড সেখানে, আমি একটি বিটওয়্যার সাইক্লিক ট্যাগ দোভাষা যুক্ত করেছি। ইনপুট হিসাবে যেকোন পরিমাণ চর নিতে এটি মোডেড করা যেতে পারে। এটি ইনপুট হিসাবে সম্ভবত অসীম অক্ষর নিতে পারে, তবে কেবল যদি অসীম নিখুঁত সংখ্যা থাকে!
কমরেড স্পার্কলপনি

2
"একবার দশটি কোড ব্লক কার্যকর করা হলে, প্রতিবার কাউন্টারটি একটি নিখুঁত সংখ্যায় পৌঁছানোর পরে ষষ্ঠটি কার্যকর করা হয়" "সুতরাং দোভাষী কেবলমাত্র নিখুঁত সংখ্যা গণনা করেন? আমি মনে করি এটি চ্যালেঞ্জের চেতনার বিপরীতে। প্রকৃত ভাষার স্পেসিফিকেশন খুব বেশি গুরুত্ব দেয় না, এটি কিছু হতে পারে টুরিং-সম্পূর্ণ প্লাস "কেবলমাত্র একটি ধাপের জন্য তখনই চালিত হয় যখন আপনি একটি নিখুঁত সংখ্যার সাথে আঘাত করেন"।
xnor

10

পাতার নিচের অংশে

স্কোলজ অনুমানটি সত্য হলে এই প্রোগ্রামিংয়ের ভাষা টিউরিং সম্পূর্ণ ।

আমি এই ভাষাটি লিখেছি কারণ @ স্পটওয়াই বলেছিল যে টিউরিং সম্পূর্ণ হওয়ার সত্য বলে অনুমানের উপর নির্ভর করে এমন কোনও ফলাফল হবে না

কমান্ডের তালিকা

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

এই আদেশগুলি দিয়ে, এই ভাষাটি একটি মিনস্কি মেশিন অনুকরণ করতে পারে

অনুবাদক

আমি এটি না চালানোর জন্য অত্যন্ত পরামর্শ দিচ্ছি। এটি অতিরিক্ত শৃঙ্খলা পরীক্ষা করার জন্য একটি অসাধারণ ধীর পদ্ধতি ব্যবহার করে।

টুরিং সম্পূর্ণতা

ভাষাটি কমান্ড পরিচালিত সংখ্যার জন্য একটি কাউন্টার ব্যবহার করে যা এটি ভাষার টুরিং সম্পূর্ণতা পরিবর্তন করতে স্কলজ অনুমানের বিরুদ্ধে পরীক্ষা করে।

যদি স্কলজ অনুমানটি সত্য হয় তবে জিরো হাল্ট যদি এই প্রোগ্রামটি
বর্ধন
হ্রাস লাফের সাথে একটি সাধারণ মিনস্কি মেশিনের মতো কাজ করে
তবে

যাইহোক, যদি স্কলজ অনুমানটি মিথ্যা হয় তবে অবশেষে কাউন্টারটি এমন কোনও মানের কাছে পৌঁছে যাবে যার জন্য স্কলজ অনুমানটি সত্য নয়। যেহেতু ভাষাটি এমন কোনও সংখ্যায় পৌঁছার পরে প্রস্থান করার জন্য নকশা করা হয়েছে যা স্কোলজ অনুমানটি মিথ্যা, প্রোগ্রামটি প্রতিবারই এই কমান্ডটি চালানোর পরে প্রস্থান করবে। সুতরাং, সমস্ত প্রোগ্রামের সীমিত দৈর্ঘ্য থাকবে have এই ভাষা টিউরিং সম্পূর্ণ হওয়ার প্রয়োজনীয়তার সাথে একমত না হওয়ায়,

"টেপটি দৈর্ঘ্যে স্থির করা যায় না, যেহেতু এটি প্রদত্ত সংজ্ঞাটির সাথে মিল রাখে না এবং মেশিনটি রৈখিক চৌম্বক অটোমেটনের সাথে মেশিন সম্পাদন করতে পারে এমন গণনার পরিসীমাটিকে গুরুত্বের সাথে সীমাবদ্ধ করে দেয়",

স্কোলজ অনুমানটি মিথ্যা হলে ভাষা টিউরিং সম্পূর্ণ হয় না


1
+1, যেহেতু এটি অনুমানের প্রয়োজনীয়তাটিকে ভাষার পক্ষে শক্ত করে তোলে, পরিবর্তে অনুমানটি সত্য / মিথ্যা হলে ভাষাটি মেরে ফেলতে বাহ্যিক কিছু যুক্ত করে
গ্রিফন

আমি পাই না। আপনি যে কমান্ডগুলি সরবরাহ করেন ঠিক সেগুলি হ'ল আপনাকে মিনস্কি মেশিনের অনুকরণের প্রয়োজন ঠিক তাই, যদি এটির সমস্ত কিছু থাকে তবে আপনার ভাষা শোল্জ অনুমান নির্বিশেষে সম্পূর্ণরূপে টুরিংয়ের কাজ করে। আপনি অবশ্যই আপনার ব্যাখ্যা থেকে কিছু মিস করছেন।
নাথানিয়েল

@ নাথানিয়েল একটি ট্যুরিং সম্পূর্ণ ভাষার জন্য প্রয়োজনীয়তাগুলির মধ্যে একটি হ'ল ভাষাটি অসীম লুপে (থামার সমস্যা) শেষ হতে পারে। আমার কোডটি নির্দেশনা চালানোর সাথে সাথে গণনা করা হয় এবং যদি স্কলজ অনুমানটি মিথ্যা হয় তবে নির্দিষ্ট সংখ্যক নির্দেশাবলীর পরে প্রোগ্রামটি সর্বদা বন্ধ হয়ে যায়।
fəˈnɛtɪk

হ্যাঁ, তবে আপনি যদি ভুলে গেছেন যে স্কোলজ অনুমানটি মিথ্যা হয় তবে কী কারণে এটি থামবে? আপনার উত্তরটি আবার দেখুন - এটি মোটেও নেই।
নাথানিয়েল

@ নাথানিয়েল প্রোগ্রামটি স্কলজ অনুমানের ক্ষেত্রে কাজ করে কিনা এর জন্য প্রতিটি একক সংখ্যা পরীক্ষা করে আক্ষরিকভাবে কাজ করে works অনুমানের সাথে একমত নয় এমন একটি সংখ্যা পেলে এটি স্বয়ংক্রিয়ভাবে প্রস্থান করে।
fəˈnɛtɪk

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। এটি একটি বিএফ প্রোগ্রামের ব্যাখ্যা করে যা এটির পরে স্থাপন করা হয়, পছন্দ করে b+++++.। প্রোগ্রামের আকারটি তবে 10 টি অক্ষরে সীমাবদ্ধ। যদিও এটি বিএফকে ব্যাখ্যা করতে পারে, এটি কোনও ট্যুরিং মেশিন পারে এমন সমস্ত প্রোগ্রাম গণনা করতে পারে না।
কনর ও ব্রায়ান

3
@ এরিকথ আউটগল্ফার আপনার সমস্যার মূল সমস্যা হ'ল "এটি বিএফ প্রোগ্রামটিকে ইনপুট থেকে পাওয়া যায় ..." এর জন্য আমি আপনাকে আমার পূর্ববর্তী মন্তব্যটি পড়তে বা পুনরায় পড়তে উত্সাহিত করি, বিশেষত এই প্রথম বাক্যটি। যদি ভাষাটি কেবল ইনপুটের উপর ভিত্তি করে টুরিং সম্পূর্ণ হয়, তবে কীভাবে এটি কোনও ইনপুট ছাড়াই টুরিং সম্পূর্ণ হতে পারে? অর্থাত্, ভাষা টিউরিং সম্পূর্ণ হওয়ার জন্য, ভাষাটির প্রোগ্রামটি নিজেই প্রোগ্রামটি এনকোড করতে হবে। অন্যথায়, একটিতে পাওয়া গেছে যে তারা প্রোগ্রামটিকে ইনপুটটিতে এনকোড করছে, যা প্রোগ্রামিংয়ের কোনও বৈধ উপায় নয়।
কনর ও'ব্রায়ান

1
আমি মনে করি না এটি একটি নিষ্পত্তিস্থল। এই ইসলাং নিবন্ধটি বিষয়টি নিয়ে আলোচনা করেছে। (এমন একটি প্রশ্নও রয়েছে যে কোনও প্রোগ্রাম যা টিউরিং-সম্পূর্ণ ভাষায় প্রতিটি সম্ভাব্য সমাপ্তির প্রোগ্রাম প্রিন্ট করে এবং তার আউটপুট সহ, এটি একটি টুরিং-সম্পূর্ণতা বোধন হয়; যার জন্য ইনপুট প্রয়োজন হয় না এবং চূড়ান্ত দীর্ঘ প্রোগ্রামের সাথে সম্পন্ন করা যায়) ।)

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.  

নিয়ন্ত্রণ প্রবাহ

শুরুতে ফিরে লুপিংয়ের আগে প্রোগ্রামটি বারবার বাম থেকে ডানে বার বার চক্র করে। যদি এটি "জে" এর মুখোমুখি হয় তবে এটি সারি পরিবর্তন করতে হবে কিনা তা নির্ধারণের জন্য মানটি পরীক্ষা করে। যদি নম্বরটি তার ম্যাচের বিপরীত সমতা সহ একটি মজাদার সংখ্যা হয় তবে এটি একটি সারি নিচে নেমে যায় (উপরে ফিরে ফিরে) অন্যথায়, যদি সংখ্যাটি মাতাল সংখ্যা হয় তবে এটি ইতিমধ্যে শীর্ষ সারিতে না থাকলে এটি একটি সারিতে চলে যায়।

প্রোগ্রামটি কেবলমাত্র শেষ হতে পারে যদি প্রোগ্রামটি শীর্ষ সারির বাইরের যে কোনও সারিতে কোনও এক্সে পৌঁছায়।

টুরিং সম্পূর্ণতা

এই প্রোগ্রামটি একটি মিনস্কি মেশিন অনুকরণ করতে ব্যবহার করে ব্যবহার করা যেতে পারে যে ধরে নেওয়া যায় যে বিপরীত সমতার সাথে মিলিত সংখ্যার একজোড়া রয়েছে।

জে, {এবং} জেজেড (আর, এক্স) অনুকরণ করতে ব্যবহার করা যেতে পারে যদিও এটি শূন্যের বিপরীতে স্বাদযুক্ত সংখ্যাগুলি পরীক্ষা করতে পারে।
+ হ'ল INC (r)
- হ'ল DEC (r)
x হল HALT

আপনি যদি প্রথম সারিটি ছেড়ে না যেতে পারেন, x এবং} আদেশগুলি কিছুই করে না। প্রোগ্রামটির ফলস্বরূপ এটি খালি প্রোগ্রাম না হলে HALT রাজ্যে প্রবেশ করতে অক্ষম। অতএব, টিউরিং সম্পূর্ণতার জন্য এইচএলটি রাষ্ট্রের প্রয়োজনীয়তার বিবরণে ভাষাটি টুরিং অসম্পূর্ণ হবে।

অনুবাদক


2

নতুন লাইন

দাবি অস্বীকার: এটি কিছুটা গোলমাল এবং বেশ সহজ। এটি আমার লেখা প্রথম ভাষা এবং অনুমান কেবলমাত্র আমি বুঝতে পেরেছি। আমি জানি যে অন্য ব্যবহারকারীর একই উত্তরটির সাথে দীর্ঘতর উত্তর ছিল তবে আমি যাইহোক এটি লেখার সিদ্ধান্ত নিয়েছি।

নিউলাইনে লিখতে আপনার অবশ্যই অনেক সময় এবং নতুন লাইনের ( \n) থাকতে হবে। এটি লেজেন্ড্রে অনুমানের সত্য হওয়া বন্ধ করে দেয়। প্রতিটি অপারেটরকে অবশ্যই লেজেন্ড্রে অনুমানের একটি সংখ্যার উপর পড়তে হবে যা আমরা এন = ১ দিয়ে শুরু করি Every প্রতিবার আপনার অপারেটর থাকাকালীন আপনি \ n এর পরিমাণ গ্রহণ করেন এবং লেগেন্ড্রে কনজেকচারের মধ্যে প্লাগ করেন এবং তার পরবর্তী পরিমানের পরিমাণটি range 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

যতক্ষণ আমাদের সীমাহীন প্রাইম রয়েছে যেগুলি নিয়মগুলি অনুসরণ করে এই ভাষায় অ সীমাবদ্ধ টেপ রয়েছে।

মিনস্কি মেশিন

\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

উপর এটি চেষ্টা করে দেখুন KhanAcademy


@ যেহেতু এটি অ সীমাবদ্ধ স্মৃতি দিয়ে লুপ করার দরকার নেই
ক্রিস্টোফার

এটি যদি সত্য হয় তবেই এটি কাজ করে। মোবাইলে
ক্রিস্টোফার

আপনার যদি অসীম স্মৃতি থাকে, তবুও আপনার অসীম লুপটি সক্ষম হতে হবে।
পাভেল

আমার লুপ আছে তাদের অসীম করে তোলার চেষ্টা করছেন
ক্রিস্টোফার

এখনই তারা ক্র্যাশ করেছে
ক্রিস্টোফার

2

Taggis

ট্যাগগিস ট্যাগ সিস্টেমগুলির উপর ভিত্তি করে একটি ভাষা ।

ট্যাগিগিসের টুরিং সম্পূর্ণতা কোলাটজ কনজেকচারের উপর ভিত্তি করে

বাক্য গঠন

একটি ট্যাগগিস প্রোগ্রামের বাক্য গঠনটি কেবলমাত্র তিনটি স্ট্রিং (উত্পাদনের নিয়ম) থাকে যা পুরোপুরি অক্ষর দ্বারা পৃথক পৃথকভাবে পৃথকভাবে পৃথক পৃথকভাবে পৃথক পৃথক পৃথক দুটি অক্ষর থাকে।

ফাঁসি

ট্যাগিগিসের একমাত্র প্রোগ্রামের স্থিতি একই স্ট্রিং একই তিনটি অক্ষর সমন্বিত।

ট্যাগগিস একটি টিএস (3, 2) ট্যাগ সিস্টেম প্রয়োগ করে, যেখানে প্রতিটি পদক্ষেপে বর্তমান "ট্যাগ" এর প্রথম 2 টি অক্ষর সরানো হয়, এবং সেই সরানো অংশে থাকা প্রথম অক্ষরটি তার প্রাসঙ্গিক নিয়মের শেষের সাথে যুক্ত হয় gets স্ট্রিং।

উদাহরণস্বরূপ, ট্যাগগিস প্রোগ্রাম 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 টি সরানো প্রতীকযুক্ত সমস্ত ট্যাগ সিস্টেমের সেটগুলির গণ্য শ্রেণি কোলাটজ কনজেকচার [2] এর সাথে আবদ্ধ। কোলাটজ কনজেকচারটি যদি মিথ্যা প্রমাণিত হয় তবে তাগগিজ টিউরিং-সম্পূর্ণ। অন্যথায়, এটি গণিতের অন্য কোনও অমীমাংসিত সমস্যার উপর ভিত্তি করে তৈরি করা হয়েছে, এর চেয়েও ছোট একটি ট্যুরিং মেশিন আবিষ্কার করে

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. যেটি বিজোড়ের 3n + 1 হিসাবে মূল কোলাটজ ফাংশনের সমতুল্য সর্বদা সমান nহবে এবং তাই বিভাগটি স্বয়ংক্রিয়ভাবে প্রয়োগ করা যেতে পারে

  2. ট্যাগ সিস্টেম এবং কোলাটজ-মতো ফাংশন, লাইসবেথ ডি মল ,

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.