ওয়াই ফেস ⌜3⌝ এর স্বাভাবিক ফর্ম পেতে কয়েক শতাধিক হ্রাস পদক্ষেপ কি খুব বেশি?


9

যেহেতু আমি ইদানীং λ-ক্যালকুলাসের ভিত্তিটি শিখিয়েছি, আমি কমন লিস্পে একটি সাধারণ 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 তে নেমে এসেছি। নীচে মন্তব্য করা হয়েছে, আমার বর্তমান বাস্তবায়নের সাথে সাথে, চার্চ থেকে পানো গণিতগুলিতে স্যুইচ করা আসলে পদক্ষেপের সংখ্যা বাড়িয়ে তোলে ...

উত্তর:


11

আপনি যদি ব্যবহার করতে চান তবে চার্চ কোডিং সত্যিই খারাপ pred। আমি আপনাকে পিয়ানো শৈলীতে আরও কিছু দক্ষ কোডিং ব্যবহার করার পরামর্শ দিচ্ছি:

// পাটিগণিত

: p_zero = λs.λz.z
: p_one = λs.λz.s p_zero
: p_succ = λn.λs.λz.sn
: p_null = .n.n (.x। ff) tt
: p_pred = .n.n (.p.p) p_zero
: p_plus = μ! f.λn.λm.n (.p। p_succ (! fpm)) মি
: p_subs = μ! f.λn.λm.n (.p। p_pred (! fpm)) মি
: p_eq = μ! f.λm.λn। m (.p। n (.q।! fpq) ff) (n (.x.ff) tt)
: p_mult = μ! f.λm.λn। মি (.p। পি_প্লাস এন (! fpn)) পি_জারো
: p_exp = μ! f.λm.λn। m (.p। p_mult n (! fpn)) p_one
: p_even = μ! f.λm। m (.p। not (! fp)) tt

// নম্বর

: p_0 = λs.λz.z
: p_1 = λs.λz.s p_0
: p_2 = λs.λz.s p_1
: p_3 = λs.λz.s p_2
...

এটি আমার পুরানো একটি লাইব্রেরি থেকে নেওয়া কিছু কোড এবং μ!f. …এটি কেবল একটি অপ্টিমাইজড নির্মাণ ছিল Y (λf. …)। (এবং tt, ff, notBooleans আছে।)

আমি সত্যই নিশ্চিত নই যে আপনি এর জন্য আরও ভাল ফলাফল পাবেন fac


টিপটির জন্য ধন্যবাদ, এই বিকল্প এনকোডিংয়ের সাথে কাজ করা আমাকে আমার বাস্তবায়নে কয়েকটি বাগ খুঁজে পেতে সহায়তা করেছে। আসলে, এটি পদক্ষেপের সংখ্যার জন্য সহায়তা করে না, কারণ ফিক্সিংয়ের পরে, 3 এর সাধারণ ফর্মটি সন্ধান করে! চার্চের সংখ্যার সাথে 619 পদক্ষেপ এবং পিয়ানো অঙ্কগুলির সাথে 687 পদক্ষেপ নেয় ...
কোথাও কোনও মানুষ

হ্যাঁ, এটাই আমি ভেবেছিলাম, কারণ Yসংক্ষিপ্ত হ্রাস পেতে এখানে বিশেষত (বিশেষত পেণো সংখ্যার জন্য) কিছু বিশেষ হ্রাস বিধি ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ বলে মনে হচ্ছে।
স্টাফেন গিমেনেজ

শুধু কৌতূহলী, কি 4 !, 5 !,6! ?
স্টাফেন গিমেনেজ

1
আশ্চর্যজনকভাবে যথেষ্ট, 3! এর পরে, পিয়ানো এনকোডিং চার্চ এনকোডিং আরও দক্ষ হয়ে ওঠে। যথাক্রমে 1 !, 2 !, 3 !,4 এর সাধারণ ফর্মটি পেতে! এবং 5! পেনো / চার্চের সাথে এটি 0.079, 40/33, 157/134, 685/667, 3541/3956 এবং 21629/27311 পদক্ষেপ নেয়। পদক্ষেপের সংখ্যা প্রায় 6 টির জন্য! পূর্ববর্তী ডেটা থেকে ইন্টারপোল্ট করে পাঠকের অনুশীলন হিসাবে রেখে দেওয়া হয়।
কোথাও কোনও মানুষ নেই

1
দেখে মনে হয় যে উপরোক্ত বর্ণিতগুলি স্পষ্টভাবে স্কট সংখ্যার "পেরানো + λ = স্কট"। আর কিছু যা চেষ্টা করার মতো তা হ'ল তাদের বাইনারি রূপগুলি (চার্চ এবং <স্ট্রাইক> পানো </ স্ট্রাইক> স্কট উভয়ের জন্য)।
স্টাফেন গিমেনেজ

2

যদি আমি সিপিইউ 3 এর ফ্যাক্টরিয়াল গণনা করতে কতগুলি কাজ করে তা নিয়ে যদি আমি পাই, পাইথনে বলি, তবে কয়েকশ কমানো মোটেও বড় বিষয় নয়।

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