K-এক্সপ্রেশনগুলিকে এসকে-এক্সপ্রেশনগুলিতে রূপান্তর করুন


20

Λ-ক্যালকুলাস , অথবা ল্যামডা ক্যালকুলাস, একটি লজিক্যাল বেনামী ফাংশন উপর ভিত্তি করে সিস্টেম। উদাহরণস্বরূপ, এটি একটি expression-এক্সপ্রেশন:

λf.(λx.xx)(λx.f(xx))

তবে, এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা স্বরলিপিটি সহজ করব:

  • এটিকে পরিবর্তন λকরুন \(এটি টাইপ করা সহজ করার জন্য):\f.(\x.xx)(\x.f(xx))
  • .ল্যামডা হেডার এ, অপ্রয়োজনীয় তাই আমরা ড্রপ করতে পারেন:\f(\xxx)(\xf(xx))
  • দুটি ফাংশন একসাথে লেখার চেয়ে অ্যাপ্লিকেশনটির জন্য আনলম্বদা- স্টাইলের উপসর্গ চিহ্নটি ব্যবহার করুন (এটি কীভাবে করবেন তার পুরো বিশদর জন্য, ল্যাম্বদা ক্যালকুলাস নোটেশনের মধ্যে রূপান্তর` দেখুন ):\f`\x`xx\x`f`xx
  • এটি সবচেয়ে জটিল বিকল্প। কত গভীরভাবে নেস্টেড পরিবর্তনশীল ল্যামডা হেডার এটা জন্যে আপেক্ষিক উপর ভিত্তি করে বন্ধনী একটি সংখ্যা সঙ্গে প্রতিটি পরিবর্তনশীল প্রতিস্থাপন (অর্থাত 0 ভিত্তিক ব্যবহার দে Bruijn ইন্ডেক্স )। উদাহরণস্বরূপ, \xx(পরিচয় ফাংশন) এ, xশরীরে অভ্যন্তরটি প্রতিস্থাপন করা হত [0], কারণ এটি পরিবর্তনশীল থেকে শেষ পর্যন্ত অভিব্যক্তিটি ট্র্যাভার করার সময় সম্মুখীন হওয়া প্রথম (0-ভিত্তিক) শিরোনামের অন্তর্ভুক্ত; \x\y``\x`xxxyরূপান্তরিত হবে \x\y``\x`[0][0][1][0]। আমরা এখন হেডারে ভেরিয়েবলগুলি ফেলে রেখে যেতে পারি \\``\`[0][0][1][0]

সম্মিলিত যুক্তি হ'ল মূলত ul- ক্যালকুলাস থেকে তৈরি একটি টুরিং টারপিট (ভাল, আসলে, এটি প্রথম এসেছিল, তবে এটি এখানে অপ্রাসঙ্গিক।)

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

সংযুক্ত যুক্তির সর্বাধিক সাধারণ ধরণ হচ্ছে এসকে কম্বিনেটর ক্যালকুলাস , যা নিম্নলিখিত আদিম ব্যবহার করে:

K = λx.λy.x
S = λx.λy.λz.xz(yz)

কখনও কখনও একটি সংযুক্তকারী I = λx.xযুক্ত করা হয়, তবে এটি রিন্ডন্ড্যান্ট, কারণ SKK(বা প্রকৃতপক্ষে কারও SKxজন্য x) এর সমতুল্য I

,-ক্যালকুলাসে কোনও অভিব্যক্তি এনকোড করতে সক্ষম হওয়ার জন্য আপনার কেবল কে, এস এবং অ্যাপ্লিকেশন দরকার। উদাহরণস্বরূপ, এখানে ফাংশন λf.(λx.xx)(λx.f(xx))থেকে সংযুক্ত যুক্তিকে অনুবাদ করা হয়েছে :

λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx))
λx.f(xx) = S(Kf)(S(SKK)(SKK))
λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK))
λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK)))
λf.S(Sf) = S(KS)S
λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK)))
λx.xx = S(SKK)(SKK)
λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK))))

যেহেতু আমরা উপসর্গ চিহ্নটি ব্যবহার করছি তাই এটি ```S`K``S``SKK``SKK``S``S`KSS`K``SKK`

1 সূত্র: উইকিপিডিয়া

চ্যালেঞ্জ

এতক্ষণে, আপনি সম্ভবত এটি অনুমান করেছেন: এসকে-সংযুক্তি ক্যালকুলাসে আবার লিখে, একই প্রোগ্রাম হিসাবে ইনপুট এবং আউটপুট (বা প্রত্যাবর্তন) হিসাবে একটি বৈধ λ-এক্সপ্রেশন (উপরে বর্ণিত স্বীকৃতিতে) গ্রহণ করে এমন একটি প্রোগ্রাম লিখুন। দ্রষ্টব্য যে এটিকে পুনরায় লেখার জন্য সীমাহীন অসংখ্য উপায় রয়েছে; আপনার কেবলমাত্র অসীম উপায়গুলির একটি আউটপুট করতে হবে।

এটি , সুতরাং সংক্ষিপ্ততম বৈধ জমা (বাইটগুলিতে পরিমাপ করা) জয়ী।

পরীক্ষার মামলা

প্রতিটি পরীক্ষার ক্ষেত্রে একটি সম্ভাব্য আউটপুট প্রদর্শিত হয়। শীর্ষে প্রকাশটি সমতুল্য λ-ক্যালকুলাস এক্সপ্রেশন।

λx.x:
\[0]                        -> ``SKK
λx.xx:
\`[0][0]                    -> ```SKK``SKK
λx.λy.y:
\\[0]                       -> `SK
λx.λy.x:
\\[1]                       -> K
λx.λy.λz.xz(yz):
\\\``[2][0]`[1][0]          -> S
λw.w(λx.λy.λz.xz(yz))(λx.λy.x):
\``[0]\\[1]\\\``[2][0]`[1][0] -> ``S``SI`KS`KK


1
আমি মনে করি আপনার দ্বিতীয় পরীক্ষার মামলাটি সঠিক নয়। সর্বশেষে বন্ধুর মধ্যে নেই এমন একটি সংখ্যা রয়েছে।
খ্রিস্টান সিভার্স


কীভাবে পেলেন λx.f(xx) = S(Kf)(SKK)? বরং এটি করা উচিত নয় λx.f(xx) = S(Kf)(SII) = S(Kf)(S(SKK)(SKK))? রূপান্তর করার সময় λx.f(xx), আমি পাই S {λx.f} {λx.xx}যা কমে যায় S (Kf) {λx.xx}এবং বন্ধনীগুলিতে প্রকাশটি অন্য কিছু নয় ω=λx.xx, যা আমরা জানি যে প্রতিনিধিত্ব করা হয়েছে SII = S(SKK)(SKK), তাই না?
বারবারাওয়ার্ক

@ বারবারকওয়ার্ক ঠিক আছে, আমি বোঝাতে চাইছি SIIনা SKK। ওটা একটা ভুল ছিল.
এএসওলিং ফল

উত্তর:


9

হাস্কেল, 251 237 222 214 বাইট

15 বাইট @ অর্জান_ জোহানসেনকে ধন্যবাদ রক্ষা করেছে (মন্তব্যগুলিতে তার টিআইও লিঙ্কগুলিও দেখুন)!

আরও 8 টি বাইট সংরক্ষিত হয়েছে @ নিমিকে ধন্যবাদ!

data E=S|K|E:>E|V Int
p(h:s)|h>'_',(u,a)<-p s,(v,b)<-p u=(v,a:>b)|h>'['=a<$>p s|[(n,_:t)]<-reads s=(t,V n)
a(e:>f)=S:>a e:>a f
a(V 0)=S:>K:>K
a(V n)=K:>V(n-1)
a x=K:>x
o(e:>f)='`':o e++o f
o S="S"
o K="K"
f=o.snd.p

pইনপুটকে বিশ্লেষণ করে, ফলাফলের জোড়ার প্রথম উপাদানটিতে অপরিশোধিত অংশটি বাকি করে। এর যুক্তির প্রথম চরিত্রটি অবশ্যই ব্যাকটিক, ব্যাকস্ল্যাশ বা একটি খোলার বন্ধনী হতে হবে। pএই ক্রমে এই কেসগুলির প্যাটার্ন গার্ডগুলি চেক করুন। প্রথম ক্ষেত্রে, একটি অ্যাপ্লিকেশন নির্দেশ করে, আরও দুটি এক্সপ্রেশন পার্স করা হয় এবং Eইনফিক্স কনস্ট্রাক্টরের সাথে ডেটা টাইপের একটি উপাদানের সাথে মিলিত হয় :>। ল্যাম্বদা ক্ষেত্রে, নিম্নলিখিত প্রকাশটি পার্স করা হয় এবং তত্ক্ষণাত ফাংশনটিতে দেওয়া হয় a। অন্যথায় এটি একটি পরিবর্তনশীল, আমরা readsফাংশনটির সাথে এর নম্বরটি পাই (যা একটি তালিকা প্রত্যাবর্তন করে) এবং প্যাটার্নের সাথে মিলিয়ে বন্ধকরণ বন্ধনীটি ড্রপ করি (_:t)

aফাংশন বেশ সুপরিচিত বন্ধনী বিমূর্ততা আছে। একটি অ্যাপ্লিকেশন বিমূর্ত করতে, আমরা দুটি subexpress বিমূর্ত এবং Sউভয় যুক্তি বিতরণ করতে সংযুক্তকারী ব্যবহার । এটি সর্বদা সঠিক, তবে আরও সংখ্যক কোডের সাহায্যে সংক্ষিপ্ত ভাব প্রকাশের জন্য আমরা বিশেষ কেসগুলি পরিচালনা করে আরও ভাল করতে পারি । বর্তমান ভেরিয়েবলটি বিমূর্ত করা Iযখন দেয় বা যখন আমাদের কাছে নেই SKK,। সাধারণত বাকী কেসগুলি কেবল Kসামনের দিকে একটি যুক্ত করতে পারে, তবে এই স্বরলিপিটি ব্যবহার করার সময় অভ্যন্তরীণ ল্যাম্বদা বিমূর্ত হয়ে যাওয়ার কারণে আমাদের চলকগুলি পুনর্নির্মাণ করতে হবে।

oফলাফল আউটপুট জন্য একটি স্ট্রিং পরিণত। fসম্পূর্ণ ফাংশন।

অনেক ভাষায় যেমন ব্যাকস্ল্যাশ একটি পালানোর চরিত্র, তাই এটি স্ট্রিং আক্ষরিক ক্ষেত্রে দু'বার দিতে হবে:

*Main> f "\\[0]"
"``SKK"
*Main> f "\\`[0][0]"
"``S``SKK``SKK"
*Main> f "\\\\[0]"
"``S``S`KS`KK`KK"
*Main> f "\\\\[1]"
"``S`KK``SKK"
*Main> f "\\\\\\``[2][0]`[1][0]"
"``S``S`KS``S``S`KS``S`KK`KS``S``S`KS``S``S`KS``S`KK`KS``S``S`KS``S`KK`KK``S`KK``SKK``S``S`KS``S``S`KS``S`KK`KS``S`KK`KK``S`KK`KK``S``S`KS``S``S`KS``S`KK`KS``S``S`KS``S`KK`KK``S``S`KS`KK`KK``S``S`KS``S``S`KS``S`KK`KS``S`KK`KK``S`KK`KK"

1
1. দ্বিতীয় লাইনে, আপনি ব্যবহার করতে পারেন (a,(b,v))<-p<$>p s। ২. আপনি যদি সেই ম্যাচটি শেষ দিকে সরিয়ে নেন তবে '\\'তা হতে পারে _
janrjan জোহানসেন

1
প্রকৃতপক্ষে, প্রথম অংশটি স্ক্র্যাচ করুন: টিপল ক্রমটি অদলবদল করতে এবং p(_:s)=a<$>p s(সরানো) '\\'লাইনের জন্য ব্যবহার করা ছোট
janrjan জোহানসেন

1
এটি অনলাইন চেষ্টা করুন! আপনার বর্তমান সংস্করণ জন্য। যাইহোক, যা কেবল 236 বাইট, আপনি চূড়ান্ত নিউলাইন ফেলে দিতে পারেন।
janrjan জোহানসেন

2
@ চ্যালেঞ্জার 5 আমি মনে করি এটি বেশিরভাগ কারণে হ্যাশেল ল্যাম্বডা ক্যালকুলাসের উপর ভিত্তি করে তৈরি হয়েছে, সুতরাং শীঘ্রই দক্ষ ব্যক্তিরা এই ধরণের প্রশ্নগুলিতে আকৃষ্ট হওয়ার সম্ভাবনা বেশি বেশি রয়েছে :)
লিও

2
আপনি সংজ্ঞায়িত করতে p, তিন রক্ষীদের সঙ্গে একটি একক অভিব্যক্তি সঙ্গে মামলা নতুন করে সাজানো এবং একটি অতিরিক্ত যুগল ড্রপ (): p(h:s)|h>'_',(u,a)<-p s,(v,b)<-p u=(v,a:>b)|h>'['=a<$>p s|[(n,_:t)]<-reads s=(t,V n)
নিমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.