পুনরাবৃত্তি সরানো হচ্ছে - পর্দার পিছনে তত্ত্বের একটি চেহারা


10

আমি এই সাইটে নতুন এবং এই প্রশ্নটি অবশ্যই গবেষণা স্তর নয় - তবে ওহ ভাল well আমার সফটওয়্যার ইঞ্জিনিয়ারিংয়ের কিছুটা ব্যাকগ্রাউন্ড এবং সিএসটিওরিতে প্রায় কোনওটিই নেই তবে আমি এটি আকর্ষণীয় বলে মনে করি। একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে, আমি যদি এই সাইটে এই প্রশ্নটি গ্রহণযোগ্য হয় তবে আমি নীচের আরও বিস্তারিত উত্তর চাই।

সুতরাং, আমি জানি যে প্রতিটি পুনরাবৃত্তির প্রোগ্রামের পুনরাবৃত্তিমূলক এনালগ থাকে এবং আমি "সিস্টেম স্ট্যাক" এর অনুরূপ কিছু বজায় রেখে এবং রিটার্নের ঠিকানার মতো পরিবেশের সেটিংস ইত্যাদি পুশ করে এর জন্য দেওয়া জনপ্রিয় ব্যাখ্যাটি বুঝতে পারি I ।

কিছুটা কংক্রিট হওয়ার কারণে, আমি দেখতে চাই (আনুষ্ঠানিকভাবে) আপনার ফাংশন চালিত চেইন এমন ক্ষেত্রে এই বিবৃতিটি কীভাবে প্রমাণিত হয় ? তদুপরি, যদি কিছু শর্তসাপেক্ষ বিবৃতি থাকে যা একটি এফকে নেতৃত্ব দিতে পারে তবে আমি কিছু এফ জে কল করতে পারি? এটি হ'ল, সম্ভাব্য ফাংশন কল গ্রাফের কয়েকটি দৃ strongly়ভাবে সংযুক্ত উপাদান রয়েছে।F0F1FiFi+1FnF0FiFj

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

আমি সত্যিই যা জিজ্ঞাসা করছি তা প্রশ্ন2

(1) পুনরাবৃত্তি পুনরাবৃত্তিতে রূপান্তর করা যেতে পারে যে আরও একটি আনুষ্ঠানিক (বিশ্বাসযোগ্য?) প্রমাণ আছে?

(২) যদি এই তত্ত্বটি সত্যই বাইরে থাকে তবে আমি কেন এটি খুঁজে পাচ্ছি, উদাহরণস্বরূপ, পুনরুক্তি করা সহজতর এবং পোস্টর্ডার এত শক্ত? (আমার সীমিত বুদ্ধি ব্যতীত)


1
পুনরাবৃত্তি শব্দটির মতো :)
আকাশ কুমার

আমি পুরোপুরি বুঝতে পেরেছি কিনা তা নিশ্চিত নই, তবে পুনরাবৃত্তি যদি কোথাও শেষ হয় তবে আপনি আসলে নিজের স্ট্যাক ব্যবহার করে একটি সিস্টেম স্ট্যাকের অনুকরণ করতে পারেন। অংশ (2) এর জন্য, গণনা জটিলতার ক্ষেত্রে সমস্যাগুলি আলাদা নয়।
সিংহসুমিত

আমি মনে করি এই প্রশ্নটি কম্পিউটার সায়েন্স সাইটের জন্য সবচেয়ে উপযুক্ত হত যা এখনও লাইভ নেই। আপনার দ্বিতীয় প্রশ্ন হিসাবে, আপনি কেন এটি আরও কঠোর মনে করেন তা ব্যাখ্যা করতে পারেন? প্রক্রিয়াটি প্রায় অভিন্ন হওয়া উচিত।
রাফেল

আপনার মন্তব্যের জন্য সবাইকে ধন্যবাদ - অনুমান করুন যে আমি কিছুটা পড়তে পেয়েছি।
Itachi Uchiha

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

উত্তর:


6

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি নিজের ফাংশনগুলিতে রূপান্তর সম্পর্কে স্পষ্ট যেগুলিতে অন্য কোনও ফাংশন কলগুলি নেই কিন্তু তাদের কাছে রয়েছে।

FF1FnFF1,,FnF

FjFFjFFj

f(0) = a
f(n) = f'(g(n-1))

g(0) = b
g(n) = g'(f(n-1))

সঙ্গে f'এবং g'অ recursive ফাংশন (অথবা অন্তত স্বাধীন fএবং g) হয়ে

h(0) = (a,b)
h(n) = let (f,g) = h(n-1) in (f'(g), g'(f)) end

f(n) = let (f, _) = h(n) in f end
g(n) = let (_, g) = h(n) in g end

এটি স্বাভাবিকভাবে আরও জড়িত এবং আরও জটিল ফাংশনগুলিতে প্রসারিত।


আমি সাহায্য করতে পেরে আনন্দিত. আপনার পাশের চেকমার্কটিতে ক্লিক করে আপনার প্রিয় উত্তরটি গ্রহণ করতে দয়া করে মনে রাখবেন।
রাফেল

1
রাফেল, আপনার কৌশলটি কেবল তখনই কাজ করে যখন দুটি পুনরাবৃত্ত ফাংশন একই ধরণের আর্গুমেন্ট গ্রহণ করে। যদি fএবং gবিভিন্ন ধরণের প্রকার গ্রহণ করে তবে আরও সাধারণ কৌশল প্রয়োজন।
আন্দ্রেজ বাউয়ার

@ আন্দ্রেজবাউর ভাল পর্যবেক্ষণ, আমি এটি পুরোপুরি মিস করেছি। আমি সত্যিই রাফেলের পন্থা পছন্দ করেছি, তবে আপনি যেমন সাধারণ ক্ষেত্রে লক্ষ্য করেছেন, আমাদের সম্ভবত কিছু আলাদা ধারণা দরকার idea আপনি অন্য কোন পরামর্শ দিতে পারেন?
Itachi Uchiha

fgn1n2

ঠিক আছে, এটি কিভাবে করবেন সে সম্পর্কে আমার উত্তর দেখুন।
আন্দ্রেজ বাউয়ার

8

হ্যাঁ, পুনরাবৃত্তি পুনরাবৃত্তিতে রূপান্তরিত করা যেতে পারে বলে বিশ্বাস করার দৃ conv় কারণ রয়েছে। প্রতিটি সংকলক যখন সূত্রের কোডটি মেশিনের ভাষায় অনুবাদ করে তখন এটি করে। তত্ত্বের জন্য আপনার ডেভ ক্লার্কের পরামর্শগুলি অনুসরণ করা উচিত। আপনি যদি আসল কোডটি দেখতে চান যা পুনরাবৃত্তিগুলি নন-রিকার্সিভ কোডে রূপান্তরিত করে, machine.mlআমার পিএল চিড়িয়াখানায় মিনিএমএল ভাষায় একবার দেখুন (লক্ষ্য করুন যে loopনীচে অবস্থিত ফাংশনটি আসলে কোডটি চালায়, লেজ পুনরাবৃত্ত এবং তাই এটি করতে পারে তুচ্ছভাবে একটি আসল লুপে রূপান্তর করা হবে)।

আরেকটা জিনিস. MiniML পারস্পরিক পুনরাবৃত্তি ফাংশন সমর্থন করে না। তবে এটি কোনও সমস্যা নয়। ফাংশনের মধ্যে যদি আপনার পারস্পরিক পুনরাবৃত্তি হয়

f1:A1B1
f2:A2B2
fn:AnBn

পুনরাবৃত্তি একটি একক পুনরাবৃত্ত মানচিত্রের পদে প্রকাশ করা যেতে পারে

f:A1++AnB1++Bn,

8

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

একটি সম্পর্কিত পদ্ধতির নাম সিইকে মেশিন

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

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


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

[সিএনডিডি] আমি বলতে চাইছি আমি প্রমাণটি পছন্দ করব, যদি সেখানে একটি থাকে তবে আমাকে বলার জন্য কেন একটি প্রোগ্রামকে অন্য প্রোগ্রামের চেয়ে সহজ করা হচ্ছে। তবে কিছুটা অর্থে, পুনরাবৃত্তিকে রূপান্তরকারী রূপান্তরকারীটির ইনপুট হিসাবে যে পুনরাবৃত্তির প্রোগ্রাম লাগে তা বিবেচনা করা উচিত। নিশ্চিত, তবে আমি ধারণা করি যে এই ধরণের রূপান্তরকারীটি থামানো সমস্যার মতো শক্ত হতে পারে? আমি এখানে অনুমান করছি - তবে আমি পুনরাবৃত্ত রূপান্তরকারীকে পুনরুত্থিত করতে চাই এবং এটি যদি আমি এটি করতে চাই তবে এটি বিভিন্ন পুনরাবৃত্তির প্রোগ্রামগুলিকে পুনরাবৃত্ত করার অন্তর্নিহিত জটিলতার ব্যাখ্যা করতে চাই। আমি নিশ্চিত নই, তবে আমি কি প্রশ্নটি সম্পাদনা করব? আমার প্রশ্নটি কি পরিষ্কার?
Itachi Uchiha

@ ইটাচিউচিহ - আপনার সমস্যাটি অনস্বীকার্য বলে আমি মনে করি না। আন্দ্রেজ বাউরের উত্তর দেখুন। তিনি নোট করেছেন যে উত্স কোডটি মেশিনের ভাষায় অনুবাদ করলে প্রতিটি সংকলক এটি করে। এছাড়াও তিনি যুক্ত করেছেন যে আপনি আসল কোডটি দেখতে পাচ্ছেন যা মিনিমে (ক) l ভাষায় পুনরাবৃত্তিকে রূপান্তরিত করে non এটি পরিষ্কারভাবে ইঙ্গিত দেয় যে "পুনরাবৃত্তি" পুনরাবৃত্তি করার একটি সিদ্ধান্ত পদ্ধতি রয়েছে। পুনরাবৃত্তি অপসারণের সহজাত (ধারণাগত) অসুবিধা / জটিলতা সম্পর্কে আমি নিশ্চিত নই। আমি এই প্রশ্নটি খুব স্পষ্টভাবে বুঝতে পারি না তবে এটি আকর্ষণীয় দেখাচ্ছে। আরও ভাল উত্তর পেতে আপনি নিজের প্রশ্নটি সম্পাদনা করতে পারেন
আকাশ কুমার

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

6

প্রশ্ন : "পুনরাবৃত্তি পুনরাবৃত্তিতে রূপান্তরিত করা যেতে পারে এমন আরও কোনও আনুষ্ঠানিক (বিশ্বাসযোগ্য?) প্রমাণ আছে কি?"

একটি : একটি টুরিং মেশিনের টুরিং সম্পূর্ণতা :-)

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

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


1

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

সিপিএস রূপান্তরটি স্পষ্টভাবে একটি stতিহ্যবাহী অ্যারে ভিত্তিক স্ট্যাকের মধ্যে কল স্ট্যাক রাখার সাথে সম্পর্কিত, তবে অ্যারের পরিবর্তে কল স্ট্যাকটি লিঙ্কযুক্ত বন্ধের সাথে উপস্থাপিত হয়।


0

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

পিটার ল্যান্ডিনের ১৯65৫-এর একটি কাগজ ALGOL 60 এবং চার্চের ল্যাম্বদা-স্বাক্ষরের মধ্যে চিঠিপত্র হিসাবে উল্লেখ করা হয়েছে, ল্যাম্বডা ক্যালকুলাসের ক্ষেত্রে ক্রমগত পদ্ধতিগত প্রোগ্রামিংয়ের ভাষাগুলি বোঝা যায়, যা পদ্ধতিগত বিমূর্ততা এবং পদ্ধতি (সাবপ্রগ্রাম) প্রয়োগের জন্য মৌলিক প্রক্রিয়া সরবরাহ করে।

এর উপর বি কেডি এর বেশিরভাগটি এই উইকিপিডিয়া পৃষ্ঠায় গির্জা-টিউরিং থিসিসে রয়েছে । সঠিক সুনির্দিষ্ট সম্পর্কে নিশ্চিত নই তবে উইকিপিডিয়া নিবন্ধটি ইঙ্গিত দেয় যে এটি রোজার (১৯৯৯) যিনি 1 ম লাম্বদা ক্যালকুলাস এবং টিউরিং মেশিনের মধ্যে এই সমতা প্রমাণ করেছিলেন। সম্ভবত / সম্ভবত তার কাগজে টিএম নির্মাণে (সম্ভবত পুনরুক্তি করা) ল্যাম্বডা কলগুলিতে রূপান্তর করার জন্য স্ট্যাকের মতো প্রক্রিয়া রয়েছে?

রোজার, জেবি (1939)। "গডেলের উপপাদ্য এবং গির্জার উপপাদ্যগুলির প্রুফগুলির একটি অনানুষ্ঠানিক প্রদর্শনী"। জার্নাল অফ সিম্বলিক লজিক (জার্নাল অফ সিম্বলিক লজিক, খণ্ড 4, নং 2) 4 (2): 53-60। ডোই: 10.2307 / 2269059। জেএসটিওর 2269059।

আধুনিক লিস্প ভাষা এবং বৈকল্পিক প্রকল্পের নীতিগুলিতে আগ্রহী প্রত্যেকের জন্য অবশ্যই লাম্বদা ক্যালকুলাসের সাথে দৃ strong় সাদৃশ্য রয়েছে note অভিব্যক্তি মূল্যায়নের জন্য দোভাষী কোড অধ্যয়ন করার ফলে ল্যাম্বডা ক্যালকুলাসের ট্যুরিং সম্পূর্ণতার জন্য মূলত কাগজগুলিতে থাকা ধারণাগুলি বাড়ে।


1
টুরিং / ল্যাম্বডা সমতুল্য প্রমাণ এই কাগজের পরিশিষ্টে রয়েছে: www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
Radu GRIGore
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.