টুরিং-সম্পূর্ণতার জন্য কি একটি ডু-লুপ যথেষ্ট?


22

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

আমি বুঝতে পারি যে এখানে কিছু শব্দার্থবিজ্ঞান কিছুটা দ্ব্যর্থহীন হতে পারে, সুতরাং আসল প্রশ্নটি একটি নির্দিষ্ট উদাহরণ দিয়ে বাক্যটি দিয়ে দেই:

ব্রেইনফাক (বিএফ) একটি টুরিং তরপিট যেখানে একমাত্র নিয়ন্ত্রণ প্রবাহ কিছুক্ষণের জন্য লুপ হয়, এটি হিসাবে চিহ্নিত করা হয় [...](আপনি ব্রেনফাকের সাথে পরিচিত না হলে এই প্রশ্নের নীচে একটি সম্পূর্ণ ভাষা নির্দিষ্ট রয়েছে)। আসুন একটি নতুন ভাষা বিএফ * সংজ্ঞায়িত করুন, যেখানে বিএফ ,.+-<>-তে একই শব্দার্থক রয়েছে, তবে এর পরিবর্তে []আমাদের {}এমন একটি রয়েছে যা একটি ডু-ওয়েল লুপকে বোঝায়। অর্থাৎ, বিএফ-এর একমাত্র পার্থক্য হ'ল প্রতিটি পুনরায় লুপগুলি কমপক্ষে একবার চালানো হয় এর আগে আরও পুনরাবৃত্তিগুলি এড়ানো যায়।

বিএফ * টিউরিং-সম্পূর্ণ? যদি এটি হয় তবে আমি আগ্রহী যে আমি কীভাবে বিএফকে বিএফ অনুবাদ করতে পারি *। যদি তা না হয় তবে আমি কীভাবে প্রমাণ করব?

আমার নিজের কিছু পর্যবেক্ষণ:

  • প্রতিটি বিএফ প্রোগ্রাম বিএফ * তে অনুবাদ করা যায় না। উদাহরণস্বরূপ, বিএফ * তে এমন কোনও প্রোগ্রাম লেখা অসম্ভব যেটি কোনও মান পড়তে বা না ছাপতে পারে - যদি প্রোগ্রামটি এক বা একাধিক মান প্রিন্ট করে তবে এটি সর্বদা কমপক্ষে একটি মুদ্রণ করবে will তবে, বিএফের একটি টুরিং-সম্পূর্ণ সাবসেট থাকতে পারে যা বিএফ * তে অনুবাদ করা যেতে পারে।
  • আমরা কেবল অনুবাদ করতে পারি না [f](যেখানে fকিছু নির্বিচারে ব্রেনফাক প্রোগ্রাম রয়েছে কেবল +-[]<>) এটিতে (প্রথম পুনরাবৃত্তির প্রভাব বাতিল করার প্রয়াসে), কারণ ক) প্রতিটি গণনীয় ফাংশনটিতে একটি গণনীয় বিপরীত থাকে না এবং খ) এমনকি যদি তা হয়, অগত্যা এই পদক্ষেপটি পুনরাবৃত্তভাবে প্রয়োগ করা প্রথম স্থানে শেষ করার গ্যারান্টিযুক্ত না হওয়ার চেয়ে কম লুপ থাকবে না ।f-1{f}f-1f

ব্রেইনফাক ভাষা সম্পর্কে এখানে একটি দ্রুত পর্যালোচনা দেওয়া হয়েছে। ব্রেইনফাক একটি অসীম টেপে পরিচালনা করে যেখানে প্রতিটি ঘরে প্রাথমিকভাবে শূন্য থাকে একটি বাইট মান। ওভারফ্লোগুলি চারপাশে মোড়ানো, সুতরাং 255 বাড়ানো 0 দেয় এবং বিপরীতে। ভাষাতে 8 টি নির্দেশনা রয়েছে:

+   Increment the current cell.
-   Decrement the current cell.
>   Move tape head to the right.
<   Move tape head to the left.
,   Input a character from STDIN into the current cell.
.   Output the current cell as a character to STDOUT.
[   If the current cell is zero, jump past the matching ].
]   If the current cell is non-zero, jump back to just behind the matching [.


আকর্ষণীয় তবে মনে হয় এটি পুরোপুরি যত্ন সহকারে নির্মিত হয়নি। []বিএফ-তে একটি "যখন কর" লুপটি হুবহু সংজ্ঞায়িত করছে না। আপনার টেবিলের মতো বাম এবং ডান বন্ধনীগুলি বর্তমান সেল শূন্য / ননজারো মূল্যায়ন করে। সুতরাং সম্পর্কিত {}ধনুর্বন্ধনী মূল্যায়ন যুক্তি সঠিক বর্ণনা কি ? কম্পিউটার সায়েন্স চ্যাটে আরও সংলাপ / আলোচনার পরামর্শ দিন । এছাড়াও আপনার "পর্যবেক্ষণ" প্রমাণ ছাড়া "পোস্টুলেটস" বা "প্রস্তাব" এর মতো।
vzn

@vzn এই ভাল পয়েন্ট। আমি মূর্ত যে সুস্পষ্ট সংজ্ঞা {}করতে হবে {সব এবং কিছুই করতে }হিসাবে একই ]। পরের কয়েক দিন আমার বেশি সময় থাকবে না, তবে কিছুটা সময় পেলে আমি আপনাকে আড্ডায় যোগ দেব।
মার্টিন এন্ডার

হায় আফসোস এটি জিজ্ঞাসা করা কিছুটা সূক্ষ্ম এবং সম্ভবত এখানে দুটি সম্পূর্ণ ভিন্ন প্রশ্ন আছে। (1) কিছুক্ষণের লুপ (এবং "অন্যান্য স্টাফ") দিয়ে কোনও টিউরিংয়ের সম্পূর্ণ ভাষা দেওয়া হয়েছে, এটি পরিবর্তে কেবল একটি ডু-ওয়েল লুপের সাহায্যে টুরিং সম্পূর্ণ ভাষায় রূপান্তর করতে পারে। তবে তারপরে উত্তর দেওয়ার জন্য আমাদের "অন্যান্য জিনিস" সম্পর্কে আরও জানতে হবে। (২) প্রদত্ত বিএফ এবং একটি নতুন বিএফ * প্রদত্ত সংজ্ঞা {}এবং গ্রহণের []সাথে বিএফ * টিউরিং সম্পূর্ণ। এই বোঝার সাথে যে বিএফ []সম্পূর্ণরূপে টিউরিং ভাষায় কিছুটা লুপের মতো কিছুটা অনুরূপ / অনুরূপ ruct
vzn

1
@vzn অংশ (1) ছিল আমার প্রশ্নের টিএল; ডিআর অংশ। আমি পুরোপুরি সচেতন যে "কিছু ভাষা" এর উত্তর দেওয়া সম্ভবত অসম্ভব। এ কারণেই আমি সত্যিকারের প্রশ্নটিকে খুব সহজ খেলনা ভাষার (বিএফ) শর্তাবলী দিয়ে এটিকে লুপগুলির আচরণের দিকে সংকুচিত করেছিলাম (কারণ আমি অনুভব করেছি যে বিএফ * কে টিসি হিসাবে দেখানো যেতে পারে যা এটি আরও সহজ করে তুলবে এটি অন্য ভাষাগুলির জন্য দেখানোর জন্য কেবল ডু-উইল লুপ রয়েছে)। আমি নিশ্চিত নই যে আপনি কীভাবে বি এফ লুপগুলি অন্য ভাষার ডু-ডুপ লুপের চেয়ে আলাদা।
মার্টিন এন্ডার

উত্তর:


10

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

করতে-করার সময় সমান। do X while Yসমতুল্য X; while Y do Xএবং, ধরে নিচ্ছি আপনার শর্ত রয়েছে, while Y do Xসমান if Y then (do X while Y)

আপনার শর্ত না থাকলে জীবন কিছুটা শক্ত hard যদি আপনার কিছু করার থাকে তবে আপনি if Y then Xএই জাতীয় কিছু ব্যবহার করে অনুকরণ করতে পারেন:

B := true
while (Y and B) do
    X
    B := false
endwhile

তবে আপনি যদি কেবলমাত্র কিছু করেন? আমি দাবি করি যে নিম্নলিখিত ভেরিয়েবলগুলির বর্তমান মান প্রদত্ত সমাপ্তি if Y then Xধরে ধরে নিম্নলিখিত অনুকরণগুলি অনুকরণ Xকরে। (এটির গ্যারান্টিযুক্ত নয়: প্রোগ্রামটি ভেরিয়েবলের কোনও মানের জন্য লুপ করলেও প্রোগ্রামটি if y=0 then loopforeverসমাপ্ত হবে )। আসুন , ..., এর মাধ্যমে পরিবর্তনশীল হয়ে উঠুন এবং পরিবর্তিত হওয়া যাক যাতে এটি প্রতিটি ভেরিয়েবলের পরিবর্তে ব্যবহার করে । সুস্পষ্ট কোডটি চিহ্নিত করে যা ভেরিয়েবলগুলি এবং অদলবদল করে ।y != 0XV1VnXX'XVi'Viswap(A,B)AB

V1' := V1; ...; Vn' := Vn
V1'' := V1; ...; Vn'' := Vn
C := 0
do
    X'
    swap (V1',V1''); ...; swap (Vn',Vn'')
    C := C+1
while Y and C<2
V1 := V1'; ...; Vn := Vn'

ধারণা নিম্নোক্ত। প্রথমত, ধরুন যে Yএটি মিথ্যা। আমরা Xএকবার করে অনুকরণ করি , এবং ফলাফলগুলি V1'', ..., Vn''; V1', ..., Vn'এর মূল মানগুলি ধরে রাখুন V1..., Vn। তারপরে, আমরা বরাদ্দ করি V1 := V1'; ...; Vn := Vn', যা কিছুই করে না। সুতরাং, যদি Yএটি মিথ্যা হয় তবে আমরা কিছুই করি নি। এখন, ধরুন এটি Yসত্য is আমরা এখন X দু'বার সিমুলেট করব , ফলগুলি "প্রাইমড" এবং "ডাবল-প্রাইমড" উভয় ক্ষেত্রে সংরক্ষণ করি। সুতরাং, এখন, লুপের শেষে অ্যাসাইনমেন্টগুলির কার্যকারিতা রয়েছে যা Xএকবার গণনা করা হয়েছিল। মনে রাখবেন যে Yকেবল "অপ্রতীকৃত" ভেরিয়েবলগুলির উপর নির্ভর করে, তাই এর মানটি বারবার লুপ চালিয়ে প্রভাবিত হয় না।

ঠিক আছে, সুতরাং যদি Xভেরিয়েবলের বর্তমান মানটির জন্য অবসান না হয়? (এই সম্ভাবনাটি দেখানোর জন্য মার্টিন ইন্ডারকে ধন্যবাদ।) সেক্ষেত্রে আমাদের উপরোক্তদের Xঅনুরূপ ধারণাগুলি ব্যবহার করে নির্দেশ-নির্দেশ- অনুকরণের অনুকরণ করা দরকার । প্রতিটি নির্দেশ অবশ্যই বন্ধ হয়ে যায় তাই আমরা if"যদি ওপকোডটি foo হয়, তবে এটি করুন; যদি বার হয়, তা করুন ... ..." এর সূত্র ধরে নির্দেশনা ডিকোডিং করতে উপরের সিমুলেশনটি ব্যবহার করতে পারি। সুতরাং, এখন, আমরা Xএকটি নির্দেশ পয়েন্টার ব্যবহার করে নির্দেশাবলী দিয়ে পুনরাবৃত্তি করতে একটি লুপ ব্যবহার করি যাতে আমরা জানি যে পরবর্তী নির্দেশাবলী কার্যকর করতে হবে। লুপের প্রতিটি পুনরাবৃত্তির শেষে, পরীক্ষা করে দেখুন Yএবং Xএখনও থেমে আছে কিনা । যদি Yএটি মিথ্যা হয় তবে অদলবদল কৌশল আমাদের এর প্রভাবগুলি পূর্বাবস্থায় ফেলার অনুমতি দেয়Xপ্রথম নির্দেশ।


1
এটি একটি ঝরঝরে ধারণা, তবে আমি মনে করি এখানে এখানে একটি সমস্যা রয়েছে: কেসটি Yমিথ্যা তা বিবেচনা করুন তবে Xচলক মানগুলির বর্তমান সেটটিতে শেষ হবে না। if Y then Xঅবসান ঘটে, তবে আপনার অনুবাদটি হ'ল না কারণ এটি সর্বদা X'কমপক্ষে একবার সম্পাদন করা দরকার ।
মার্টিন এন্ডার

1
@ মার্টিনব্যাটনার উর্গ তুমি ঠিক বলছো. সুতরাং Xনির্দেশ-নির্দেশ- অনুকরণের অনুকরণ এবং Yপ্রতিটি নির্দেশের পরে পরীক্ষা করার জন্য আমাদের লুপটি ব্যবহার করতে হবে check প্রতিটি নির্দেশ সমাপ্তির গ্যারান্টিযুক্ত তাই সমস্ত কিছু কাজ করবে। তবে লিখতে কষ্ট হচ্ছে।
ডেভিড রিচার্বি

1
আমি পুরোপুরি নিশ্চিত নই Xযে এটি যদি কিছুক্ষণ লুপ / ​​শর্তসাপেক্ষে নিজেই শুরু হয় তবে এরকমভাবে ডিকনস্ট্রাক্ট করা সম্ভব কিনা। আমি এই সম্পর্কে আরও কিছু চিন্তা করতে হবে।
মার্টিন এন্ডার

এছাড়াও "সুতরাং, এখন, আমরা এক্সের নির্দেশাবলী দিয়ে পুনরাবৃত্তি করতে একটি লুপ ব্যবহার করি, একটি নির্দেশিকা পয়েন্টার ব্যবহার করে এবং আরও কিছু যাতে আমরা জানি যে পরবর্তী নির্দেশাবলী কার্যকর করতে হবে।" আমি নিজেকে মনে করি এটির জন্য কোনও শর্তের শর্তাধীন হতে পারে।
মার্টিন এন্ডার

1
আমি এখনও সম্পূর্ণরূপে নিশ্চিত নই যে আপনি "প্রতিটি নির্দেশ" কীভাবে X'লিনিয়ার না হলে সংজ্ঞায়িত করেন । আপনি কি সরল কিন্তু তুচ্ছ খেলনার জন্য আরও কিছু বিশদ যুক্ত করে কিছু মনে করবেন X? যেমন do (while A do B) while C? (বাইরেরটি বাইরের দিক do whileথেকে আসে while doযা আমরা বর্তমানে অনুবাদ করছি)
মার্টিন এন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.