ওয়াই সংযুক্তকারী এবং টেল কল অপ্টিমাইজেশন


20

এফ # তে একটি ওয়াই কম্বিনেটরের সংজ্ঞা

let rec y f x = f (y f) x

চটি প্রতারণামূলক সাব-সমস্যাগুলির জন্য প্রথম যুক্তি হিসাবে কিছু ধারাবাহিকতা রাখার প্রত্যাশা করে। ধারাবাহিকতা হিসাবে yf ব্যবহার করে, আমরা দেখতে পাচ্ছি যে চ বিকাশ করা যেতে পারে ক্রমাগত কলগুলিতে প্রয়োগ করা হবে

let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...

সমস্যাটি হ'ল, একটি অগ্রাধিকার হিসাবে, এই স্কিমটি কোনও টেল কল অপ্টিমাইজেশন ব্যবহার বন্ধ করে দেয়: প্রকৃতপক্ষে চ এর কিছু অপারেশন পেন্ডিং থাকতে পারে, সেক্ষেত্রে আমরা কেবলমাত্র চ এর সাথে সম্পর্কিত স্থানীয় স্ট্যাক ফ্রেমটিকে পরিবর্তন করতে পারি না।

সুতরাং:

  • এক প্রান্তে, ওয়াই সংযুক্তকারী ব্যবহারের জন্য ক্রিয়াকলাপের থেকে পৃথক পৃথক ধারাবাহিকতা প্রয়োজন ।
  • টিসিও প্রয়োগ করার লক্ষ্যে, আমরা চাইব যে কোনও অপারেশন পর্বে নেই এবং কেবলমাত্র চ কে কল করুন।

আপনি কি জানেন যে কোনও উপায়েই এই দু'জনের মধ্যে পুনর্মিলন ঘটে? সঞ্চয়ের কৌশল সহ ওয়াইয়ের মতো, বা সিপিএস ট্রিকের সাথে ওয়াইয়ের মতো? বা কোনও যুক্তি প্রমাণ করে যে এটি করার কোনও উপায় নেই?


আপনি কি আপনার y বাস্তবায়নে আরইসি কীওয়ার্ক যুক্ত করেছেন? আমার পড়া উচিত এর থেকে এটি আমার দরকার মনে করা উচিত ..
জিমি হোফা

আপনার কাছে কি প্রমাণ আছে যে এটি লেজ কলটি অনুকূলিত করে না? আমার মনে করা উচিত আপনি এই ফাংশনটির জন্য আইএলটি পড়তে চাইতে পারেন এবং দেখুন,
সংকলকটি

সোজা খোলা পুনরাবৃত্তির ক্ষেত্রে এটি না: তবে আপনি এটা পুনর্লিখন করতে অনুমতি দেয় আসলে স্ট্যাক ফ্রেম Y কল মাধ্যমে পুনঃব্যবহৃত করা হয় যেমন জিনিস বিষয় জন্য। হ্যাঁ, আইএল দেখার দরকার হতে পারে, এতে কোনও অভিজ্ঞতা নেই।
নিকোলাস

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

উত্তর:


4

আপনি কি জানেন যে কোনও উপায়েই এই দু'জনের মধ্যে পুনর্মিলন ঘটে?

না, এবং সঙ্গত কারণেই, আইএমএইচও।

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

যেমনটি, ওয়াই সংযুক্তকারী সত্যই আকর্ষণীয়।

কিন্তু : কেউই আসলে ব্যবহার প্রকৃত recursion জন্য ওয়াই-combinator! (মজাদার জন্য বাদে, এটি সত্যই কার্যকর হয় তা দেখানোর জন্য))

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

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


2
ওয়াই-কম্বিনেটরটি একটি গিঁটকে পুনর্নির্মাণের মতো যা প্রতিটি ব্যবহারের পরে অবিরত হতে থাকে। বেশিরভাগ সিস্টেমগুলি এটিকে সংক্ষিপ্ত করে দেয় এবং মেটা-স্তরে এমন গিঁট দেয় যে এটি কখনও পুনর্বার দরকার হয় না।
ড্যান ডি

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

@DanD। লিঙ্কগুলির জন্য ধন্যবাদ, আমি তাদের পরে একটি পোস্টস্ক্রিপ্ট সচেতন ব্রাউজারে চেষ্টা করব। অবশ্যই আমার জন্য কিছু শেখার আছে। তবে, আপনি কি নিশ্চিত যে সংকলিত হাস্কেল গ্রাফ হ্রাস করে? আমি এই সন্দেহ।
ইনগো

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

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

0

আমি এই উত্তর সম্পর্কে সম্পূর্ণরূপে নিশ্চিত নই, তবে এটিই সেরা with

ওয়াই কম্বিনেটর সহজাতভাবে অলস, কঠোর ভাষায় অলসতাটি অতিরিক্ত ল্যাম্বডাসের মাধ্যমে ম্যানুয়ালি যোগ করতে হবে।

let rec y f x = f (y f) x

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

length acc []    = acc
length acc (a:b) = length (acc+1) b 

আপনি যদি ইতিমধ্যে এটি সম্পর্কে অবগত না হন তবে হাস্কেলের মধ্যে foldlএবং পার্থক্য foldl'পরিস্থিতি সম্পর্কে কিছুটা আলোকপাত করতে পারে। foldlউত্সাহী ভাষায় করা হবে হিসাবে লেখা হয়। তবে টোকড হওয়ার পরিবর্তে এটি প্রকৃতপক্ষে আরও খারাপ foldrকারণ অ্যাকিউলেটর একটি সম্ভাব্য প্রসারণ থাঙ্ক সংরক্ষণ করে যা আংশিকভাবে মূল্যায়ন করা যায় না। (এটি কেন ভাঁজ এবং ভাঁজ উভয়ই 'অসীম তালিকায় কাজ করে না এর সাথে সম্পর্কিত।) সুতরাং হ্যাস্কেলের আরও সাম্প্রতিক সংস্করণগুলিতে foldl'যুক্ত করা হয়েছিল যা প্রতিটি বার ফাংশনটি পুনরায় সংশ্লেষ করতে বাধ্য করে যাতে কোনও বিরাট শাঁস তৈরি না হয় তা নিশ্চিত হয়। আমি নিশ্চিত যে http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl%27 আমার চেয়ে এটি আরও ভাল ব্যাখ্যা করতে পারে

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