কেন λ-ক্যালকুলাস অনুকূল মূল্যায়নকারী সূত্রগুলি ছাড়াই বৃহত মডুলার এক্সপেনসেন্টেশনের গণনা করতে সক্ষম?


135

চার্চ নম্বরগুলি ফাংশন হিসাবে প্রাকৃতিক সংখ্যার একটি এনকোডিং।

(\ f x  (f x))             -- church number 1
(\ f x  (f (f (f x))))     -- church number 3
(\ f x  (f (f (f (f x))))) -- church number 4

ঝরঝরেভাবে, আপনি কেবল চার্চের সংখ্যাগুলি প্রয়োগ করে কেবল তা ঘটাতে পারেন। মানে, যদি আপনি 4 2 প্রযোজ্য হলেও, আপনি গির্জায় নম্বর পেতে 16, বা 2^4। স্পষ্টতই, এটি সম্পূর্ণ অপ্রচলিত। চার্চ নম্বরগুলির জন্য একটি লিনিয়ার পরিমাণ মেমরি প্রয়োজন এবং সত্যই, সত্যই ধীর। এমন কিছু 10^10গণনা করা - যা GHCI দ্রুত সঠিকভাবে উত্তর দেয় - যুগে যুগে সময় লাগবে এবং যাইহোক আপনার কম্পিউটারে মেমরিটি ফিট করতে পারে না।

আমি ইদানীং অনুকূল λ মূল্যায়নকারীদের সাথে পরীক্ষা করছি। আমার পরীক্ষাগুলিতে, আমি ঘটনাক্রমে আমার অনুকূল λ-ক্যালকুলেটরটিতে নিম্নলিখিতটি টাইপ করেছি:

10 ^ 10 % 13

এটি বহুত্বের নয়, গুণফলের কথা ছিল। হতাশায় চিরকালীন চলমান কর্মসূচি বাতিল করতে আমি আমার আঙ্গুলগুলি সরাতে পারার আগে, এটি আমার অনুরোধটির উত্তর দিয়েছে:

3
{ iterations: 11523, applications: 5748, used_memory: 27729 }

real    0m0.104s
user    0m0.086s
sys     0m0.019s

আমার "বাগ সতর্কতা" জ্বলজ্বলে, আমি গুগলে গিয়ে 10^10%13 == 3সত্যই যাচাই করেছি । তবে result-ক্যালকুলেটরটি ফলাফলটি আবিষ্কার করার কথা ছিল না, এটি সবেমাত্র 10 ^ 10 সঞ্চয় করতে পারে। আমি এটি চাপ দেওয়া শুরু করলাম, বিজ্ঞানের জন্য। এটা তোলে অবিলম্বে আমার ডাকে সাড়া দিলেন 20^20%13 == 3, 50^50%13 == 4, 60^60%3 == 0। এই ফলাফলগুলি যাচাই করতে আমাকে বাহ্যিক সরঞ্জামগুলি ব্যবহার করতে হয়েছিল , যেহেতু হাসেল নিজেই এটি গণনা করতে সক্ষম ছিল না (পূর্ণসংখ্যার অতিরিক্ত প্রবাহের কারণে) (এটি যদি আপনি ইন্টিজ নয় অবশ্যই ব্যবহার করেন তবে!)! এটির সীমাতে ঠেলাতে, এই উত্তরটি ছিল 200^200%31:

5
{ iterations: 10351327, applications: 5175644, used_memory: 23754870 }

real    0m4.025s
user    0m3.686s
sys 0m0.341s

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

data Term = F !(Term -> Term) | N !Double
instance Show Term where {
    show (N x) = "(N "++(if fromIntegral (floor x) == x then show (floor x) else show x)++")";
    show (F _) = "(λ...)"}
infixl 0 #
(F f) # x = f x
churchNum = F(\(N n)->F(\f->F(\x->if n<=0 then x else (f#(churchNum#(N(n-1))#f#x)))))
expMod    = (F(\v0->(F(\v1->(F(\v2->((((((churchNum # v2) # (F(\v3->(F(\v4->(v3 # (F(\v5->((v4 # (F(\v6->(F(\v7->(v6 # ((v5 # v6) # v7))))))) # v5))))))))) # (F(\v3->(v3 # (F(\v4->(F(\v5->v5)))))))) # (F(\v3->((((churchNum # v1) # (churchNum # v0)) # ((((churchNum # v2) # (F(\v4->(F(\v5->(F(\v6->(v4 # (F(\v7->((v5 # v7) # v6))))))))))) # (F(\v4->v4))) # (F(\v4->(F(\v5->(v5 # v4))))))) # ((((churchNum # v2) # (F(\v4->(F(\v5->v4))))) # (F(\v4->v4))) # (F(\v4->v4))))))) # (F(\v3->(((F(\(N x)->F(\(N y)->N(x+y)))) # v3) # (N 1))))) # (N 0))))))))
main = print $ (expMod # N 5 # N 5 # N 4)

এটি সঠিকভাবে আউটপুট দেয় 1( 5 ^ 5 % 4) - তবে উপরে কিছু ফেলে দিন 10^10এবং এটি আটকে থাকবে, অনুমানটি দূর করে।

আমি যে সর্বোত্তম মূল্যায়নকারীটি ব্যবহার করেছি এটি একটি 160-লম্বা লম্বা, অব্যবহিত জাভাস্ক্রিপ্ট প্রোগ্রাম যা কোনও ধরণের ক্ষতিকারক মডুলাস গণিতকে অন্তর্ভুক্ত করে না - এবং আমি যে ল্যাম্বদা-ক্যালকুলাস মডুলাস ফাংশনটি ব্যবহার করেছি এটিও সমান সহজ:

ab.(bcd.(ce.(dfg.(f(efg)))e))))(λc.(cde.e)))(λc.(a(bdef.(dg.(egf))))(λd.d)(λde.(ed)))(bde.d)(λd.d)(λd.d))))))

আমি কোনও নির্দিষ্ট মডুলার গাণিতিক অ্যালগরিদম বা সূত্র ব্যবহার করিনি। সুতরাং, কীভাবে সর্বোত্তম মূল্যায়নকারী সঠিক উত্তরগুলি পৌঁছাতে সক্ষম?


2
আপনি কীভাবে সর্বোত্তম মূল্যায়ন ব্যবহার করেন সে সম্পর্কে আরও বলতে পারেন? সম্ভবত একটি কাগজ উদ্ধৃতি? ধন্যবাদ!
জেসন ডাজিট

11
আমি ল্যাম্পিংয়ের অ্যাবস্ট্রাক্ট অ্যালগরিদম ব্যবহার করছি, যেমন কার্যকরী প্রোগ্রামিং ভাষাগুলির সর্বোত্তম বাস্তবায়ন বইটিতে ব্যাখ্যা করা হয়েছে। লক্ষ্য করুন যে আমি "ওরাকল" ব্যবহার করছি না (কোনও ক্রোসেন্টস / ব্র্যাকেট নেই) যেহেতু এই শব্দটি EAL- টাইপযোগ্য। এছাড়াও, সমান্তরালভাবে ভক্তদের এলোমেলোভাবে হ্রাস করার পরিবর্তে, ক্রমবর্ধমান নোডগুলি হ্রাস না করার জন্য আমি ধারাবাহিকভাবে গ্রাফটি
ঘুরিয়ে

7
ঠিক আছে, যদি কেউ আগ্রহী হন তবে আমি আমার অনুকূল মূল্যায়নের জন্য সোর্স কোড সহ একটি গিটহাব সংগ্রহশালা স্থাপন করেছি । এটির অনেক মন্তব্য রয়েছে এবং আপনি এটি চলমান পরীক্ষা করতে পারেন node test.js। যদি আপনার কোন প্রশ্ন থাকে তাহলে আমার জানতে দিন।
মাইয়াভিক্টর 19

1
ঝরঝরে সন্ধান! আমি সর্বোত্তম মূল্যায়ন সম্পর্কে পর্যাপ্ত পরিমাণে জানি না, তবে আমি বলতে পারি যে এটি আমাকে ফর্মাতের লিটল উপপাদ্য / ইউলারের উপপাদ্যের কথা মনে করিয়ে দেয়। আপনি যদি এটি সম্পর্কে অজানা থাকেন তবে এটি একটি ভাল সূচনা পয়েন্ট হতে পারে।
লুউকি

5
এটিই প্রথম প্রথম যেখানে আমার প্রশ্নটি সম্পর্কে সামান্যতম সূত্র নেই, তবে তবুও এই প্রশ্নটিকে এবং বিশেষত, প্রথম-উত্তরের অসামান্য উত্তরটি উত্সাহিত করুন।
মার্কো 13

উত্তর:


124

ঘটনাটি ভাগ করা বিটা-হ্রাস পদক্ষেপগুলির পরিমাণ থেকে আসে, যা হাস্কেল-স্টাইলের অলস মূল্যায়নের (বা স্বাভাবিক কল-বাই-ভ্যালু, যা এই ক্ষেত্রে খুব বেশি নয়) এবং ভুইলমিন-ল্যাভি-ল্যাম্পিং- এ নাটকীয়ভাবে আলাদা হতে পারে- কাঠাইল-আস্পের্টি-গেরিনি- (এট আল…) "অনুকূল" মূল্যায়ন। এটি একটি সাধারণ বৈশিষ্ট্য, এটি গাণিতিক সূত্রগুলি থেকে সম্পূর্ণ স্বাধীন যা আপনি এই বিশেষ উদাহরণে ব্যবহার করতে পারেন।

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

\x. x ((\y.y)a) ((\y.y)a)

এমন একটি (নির্দেশিত অ্যাসাইক্লিক) গ্রাফ ব্যবহার করছেন যেখানে উপগ্রহ উপস্থাপনের একটিমাত্র উপস্থিতি রয়েছে এবং সেই উপগ্রহকে (\y.y)aলক্ষ্য করে দুটি প্রান্ত রয়েছে। হাস্কেলের ভাষায়, আপনার একটি মুদ্রা রয়েছে যে আপনি একবারে মূল্যায়ন করেন এবং এই অংশটির জন্য দুটি পয়েন্টার।

হাস্কেল-স্টাইলের মেমোয়েজেশন সম্পূর্ণ সাবটার্মগুলি ভাগ করে নেওয়ার প্রয়োগ করে। ভাগ করার এই স্তরটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ দ্বারা প্রতিনিধিত্ব করা যেতে পারে। অনুকূল ভাগ করে নেওয়ার ক্ষেত্রে এই বাধা নেই: এটি "আংশিক" সাবটার্মগুলিও ভাগ করতে পারে যা গ্রাফের উপস্থাপনায় চক্র বোঝাতে পারে।

ভাগ করে নেওয়ার এই দুটি স্তরের মধ্যে পার্থক্যটি দেখতে, শব্দটি বিবেচনা করুন

\x. (\z.z) ((\z.z) x)

যদি আপনার ভাগাভাগি সাবস্ক্রিমগুলি সম্পূর্ণরূপে সীমাবদ্ধ থাকে যেমন হ্যাস্কেলের ক্ষেত্রে এটি হয় তবে আপনার কেবলমাত্র একটি ঘটনা ঘটতে পারে \z.zতবে এখানে দুটি বিটা-রেডেক্স আলাদা হবে: একটি হ'ল (\z.z) xএবং অন্যটি হ'ল (\z.z) ((\z.z) x)এবং যেহেতু সেগুলি সমান শর্ত নয় সেগুলি ভাগ করা যায় না। যদি আংশিক সাবটার্মগুলি ভাগ করার অনুমতি দেওয়া হয়, তবে আংশিক শব্দটি ভাগ করা সম্ভব হয়ে যায় (\z.z) [](এটি কেবলমাত্র ফাংশন নয় \z.z, " কিছু\z.z ক্ষেত্রে প্রয়োগ করা ফাংশন" ), যা এই তর্কটি যাই হোক না কেন, কেবলমাত্র কিছুতে এক ধাপে মূল্যায়ন করে Hence আপনার একটি গ্রাফ থাকতে পারে যেখানে কেবল একটি নোড দুটি অ্যাপ্লিকেশনকে উপস্থাপন করে\z.zদুটি স্বতন্ত্র আর্গুমেন্ট, এবং যা এই দুটি অ্যাপ্লিকেশন মাত্র এক ধাপে হ্রাস করা যেতে পারে। এই নোডটিতে একটি চক্র রয়েছে বলে মন্তব্য করুন, যেহেতু "প্রথম ঘটনা" এর যুক্তিটি অবশ্যই "দ্বিতীয় ঘটনা"। অবশেষে, সর্বোত্তম ভাগ করে নেওয়ার মাধ্যমে আপনি (একটি গ্রাফ উপস্থাপন করে) \x. (\z.z) ((\z.z) x))থেকে (উপস্থাপন করা একটি গ্রাফ) \x.xবিটা-হ্রাসের মাত্র এক ধাপে (আরও কিছু বুককিপিং) ফলাফল যেতে পারেন। এটি আপনার সর্বোত্তম মূল্যায়নকারীতে মূলত ঘটে (এবং গ্রাফের উপস্থাপনাটি যা স্থান বিস্ফোরণকে বাধা দেয়)।

কিছুটা বর্ধিত ব্যাখ্যার জন্য, আপনি কাগজ দুর্বল অনুকূলতা এবং ভাগ করে নেওয়ার অর্থটি দেখতে পারেন (আপনি যা আগ্রহী তা হল ভূমিকা এবং বিভাগ 4.1, এবং সম্ভবত কিছু গ্রন্থপঞ্জি পয়েন্টার শেষে)।

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

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


34
এটি একটি সবচেয়ে অস্বাভাবিকভাবে সম্পূর্ণ পোস্ট। স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম!
ডিফিউয়ার

2
অন্তর্দৃষ্টি থেকে কম কিছু না। আপনাকে ধন্যবাদ, এবং সম্প্রদায়টিতে স্বাগতম!
মাইয়াভিক্টর 0

7

এটি কোনও অ্যাঞ্জার নয় তবে এটি আপনি কোথায় অনুসন্ধান শুরু করতে পারেন তার একটি পরামর্শ।

খুব অল্প জায়গায় মডিউলার এক্সপেনসিয়েশনগুলি গণনা করার জন্য একটি তুচ্ছ উপায় রয়েছে, বিশেষত পুনরায় লিখে

(a * x ^ y) % z

যেমন

(((a * x) % z) * x ^ (y - 1)) % z

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

আমি নিশ্চিত নই যে সর্বোত্তম মূল্যায়নকারী আসলে কী তাই আমি ভয় করি যে আমি এটিকে আরও কঠোর করতে পারি না।


4
@ উইটলিব ফিবোনাচি যেমন @ টম বলেছেন একটি ভাল উদাহরণ। fibনিরীহ উপায়ে তাত্পর্যপূর্ণ সময় প্রয়োজন, যা একটি সরল মেমোয়েজেশন / গতিশীল প্রোগ্রামিংয়ের সাথে রৈখিক হতে পারে। এমনকি লগারিদমিক (!) সময় এন-তম ম্যাট্রিক্স পাওয়ার গণনা করার মাধ্যমেও সম্ভব [[0,1],[1,1]](যতক্ষণ না আপনি প্রতিটি গুণকে অবিচ্ছিন্ন ব্যয় হিসাবে গণনা করেন)।
চি

1
এমনকি স্থির সময় এমনকি যদি আপনি আনুমানিক যথেষ্ট সাহসী হন :)
জে আব্রাহামসন

5
@ টমলেসিস কেন এমন কিছু যা কেবল জানে যেভাবে স্বেচ্ছাচারী ল্যাম্বদা ক্যালকুলাস এক্সপ্রেশনগুলি কীভাবে হ্রাস করতে হয় তার কোনও ধারণা আছে (a * b) % n = ((a % n) * b) % nযদিও? অবশ্যই এটি রহস্যজনক অংশ।
রিড বার্টন

2
@ রিডবার্টন অবশ্যই চেষ্টা করেছি! একই ফলাফল, যদিও।
মায়াভিক্টর

2
@ টমেলিস এবং চি, যদিও এখানে একটি ছোট্ট মন্তব্য আছে। যে সমস্ত অনুমান করে যে traditionalতিহ্যগত পুনরাবৃত্তি ফাংশন হ'ল "নিষ্পাপ" ফাইব বাস্তবায়ন, তবে আইএমও এটির প্রকাশ করার বিকল্প উপায় আছে যা অনেক বেশি প্রাকৃতিক। সেই নতুন উপস্থাপনার স্বাভাবিক ফর্মের theতিহ্যবাহী আকারের অর্ধেক থাকে) এবং অপট্লাম সেই একটিকে রৈখিকভাবে গণনা করতে পরিচালিত করে! সুতরাং আমি যুক্তি দিয়েছি যে fi-ক্যালকুলাস সম্পর্কিত যতক্ষণ পর্যন্ত ফাইবের "নিষ্পাপ" সংজ্ঞাটি। আমি একটি ব্লগ পোস্টে করা চাই কিন্তু আমি নই নিশ্চিত এটা সত্যিই এটি মূল্য ...
MaiaVictor
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.