যেহেতু আমি ইদানীং λ-ক্যালকুলাসের ভিত্তিটি শিখিয়েছি, আমি কমন লিস্পে একটি সাধারণ calc-ক্যালকুলাস মূল্যায়নকারী প্রয়োগ করেছি। আমি যখন Y fac 3
স্বাভাবিক অর্ডার হ্রাসের স্বাভাবিক ফর্মটি জিজ্ঞাসা করি তখন এটি 619 পদক্ষেপ নেয় যা কিছুটা মনে হয়েছিল।
অবশ্যই, প্রতিবার যখন আমি কাগজে অনুরূপ হ্রাস পেয়েছি, আমি কখনই টাইপড λ-ক্যালকুলাস ব্যবহার করিনি, তবে সংখ্যক সংখ্যা এবং তাদের উপর ক্রিয়াকলাপ যুক্ত করেছিলাম। এই ক্ষেত্রে, মুখকে এইরূপে সংজ্ঞায়িত করা হয়:
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
এই ক্ষেত্রে, বিবেচনা করা =
, *
এবং -
ফাংশন সংবাহন যেমন, এটি শুধুমাত্র প্রায় 50 ধাপ পেতে সময় লাগবে Y fac 3
তার স্বাভাবিক ফর্মে 6
।
তবে আমার মূল্যায়নে আমি নিম্নলিখিতটি ব্যবহার করেছি:
true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)
619 ধাপ, আমি থেকে পাওয়া Y fac ⌜3⌝
স্বাভাবিক ফর্মে ⌜6⌝
, যথা λf.λx.f (f (f (f (f (f x)))))
।
অনেকগুলি পদক্ষেপের তাত্পর্যপূর্ণ স্কিমিং থেকে, আমি অনুমান করি যে এটি pred
এত দীর্ঘ হ্রাসের পরোয়ানা সংজ্ঞা , তবে আমি এখনও অবাক হই যে এটি আমার বাস্তবায়নে খুব বড় দুষ্টু বাগ হতে পারে কিনা ...
সম্পাদনা: আমি প্রথমে এক হাজার পদক্ষেপ সম্পর্কে জিজ্ঞাসা করেছি, যার মধ্যে কিছু সত্যই স্বাভাবিক অর্ডারের একটি ভুল প্রয়োগের কারণ হয়েছিল, তাই আমি প্রাথমিক পদক্ষেপের 2/3 তে নেমে এসেছি। নীচে মন্তব্য করা হয়েছে, আমার বর্তমান বাস্তবায়নের সাথে সাথে, চার্চ থেকে পানো গণিতগুলিতে স্যুইচ করা আসলে পদক্ষেপের সংখ্যা বাড়িয়ে তোলে ...