লাম্বডা ক্যালকুলাস ব্যবহার করে নেতিবাচক এবং জটিল সংখ্যার প্রতিনিধিত্ব করছেন


14

লাম্বদা ক্যালকুলাসের বেশিরভাগ টিউটোরিয়াল উদাহরণ দেয় যেখানে পজিটিভ ইন্টিজার এবং বুলিয়ান ফাংশন দ্বারা প্রতিনিধিত্ব করা যায়। -1 এবং আমি কী করব?

উত্তর:


18

জ্যামাদের বর্ণিত হিসাবে প্রথমে প্রাকৃতিক সংখ্যা এবং জোড়গুলি এনকোড করুন।

একটি পূর্ণসংখ্যার k কে প্রাকৃতিক সংখ্যার জোড় হিসাবে উপস্থাপন করুন (a,b)যেমন k=ab । তারপর আপনি যেমন (জন্য Haskell, স্বরলিপি ব্যবহার পূর্ণসংখ্যার স্বাভাবিক অপারেশন বর্ণনা করতে পারেন λ -calculus):

neg = \k -> (snd k, fst k)
add = \k m -> (fst k + fst m, snd k + snd m)
sub = \k m -> add k (neg m)
mul = \k m -> (fst k * fst m + snd k * snd m, fst k * snd m + snd k * fst m)

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

  1. যৌক্তিক সংখ্যা q কে জোড় হিসাবে এনকোড করুন (k,a)যেখানে k একটি পূর্ণসংখ্যা, a প্রাকৃতিক এবং q=k/(1+a)
  2. এনকোড একটি বাস্তব সংখ্যা x একটি ফাংশন দ্বারা f যেমন যে প্রত্যেক প্রাকৃতিক জন্য kN , fk এনকোড একটি মূলদ সংখ্যা q যেমন যে |xq|<2k । অন্য কথায়, রিয়েলকে রেটে রূপান্তরিত করে যুক্তির ক্রম হিসাবে একটি বাস্তবকে এনকোড করা হয় k2k

এনকোডিং রিয়েলস অনেক কাজ এবং আপনি আসলে এটি λ -ক্যালকুলাসে করতে চান না । তবে উদাহরণস্বরূপ খাঁটি হাসকেলে বাস্তবের সহজ বাস্তবায়নের জন্য মার্শালেরetc/haskell উপ-ডিরেক্টরিটি দেখুন । এটি নীতিগতভাবে খাঁটি to তে অনুবাদ করা যেতে পারে λλ -ক্যালকুলাসে ।


1
বাহ =) আমি স্বজ্ঞাতভাবে ভাবছি যে এর অর্থ কী ... উদাহরণস্বরূপ, গির্জার সংখ্যাগুলি এনকোডিং ব্যবহার করে ... অর্থাৎ। গির্জার সংখ্যার পূর্ণসংখ্যার মান n এমন একটি ফাংশন দ্বারা প্রতিনিধিত্ব করা হয় যা কোনও ফাংশনকে n টি সময়ের জন্য প্রয়োগ করে। জোড়া এবং নেতিবাচক ল্যাম্বডা মানগুলির কি তাদের সম্পর্কে একই রকম স্বজ্ঞাত অনুভূতি রয়েছে?
zcaudate

1
চার্চ এনকোডিং প্রাকৃতিক সংখ্যা 0 , 1 , 2 , এনকোড করে ... এটি নেতিবাচক সংখ্যাগুলি এনকোড করে না। উপরের উত্তরে আমি ধরে নিয়েছি যে আপনি প্রাকৃতিক সংখ্যার এনকোডিং সম্পর্কে ইতিমধ্যে জানেন, সুতরাং আমি কীভাবে পূর্ণসংখ্যা পাওয়া যায় তা ব্যাখ্যা করেছি। আমি তাদের এনকোড করার সাথে পূর্ণসংখ্যাগুলি চার্চ সংখ্যার চেয়ে ভিন্নতর একটি আনুষ্ঠানিক নির্মাণ, যা আরও জটিলভাবে λ ক্যালকুলাসের সাথে সংযুক্ত । আমি মনে করি না "নেগেটিভ ল্যাম্বডা মান" একটি অর্থবহ বাক্যাংশ।
আন্দ্রেজ বাউর

@zcaudate [প্রকার টীকা: i:ℤ, x:a, f,u,s:a→a, p:(a→a,a→a)] আপনাকে ℤ যেমন এনকোড যদি (Sign,ℕ)তারপর, ফাংশন একজোড়া দেওয়া (s,f)যেমন pশব্দটি λi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)উত্পাদন করা হবে পারেন f(…f(x)…)বা s(f(…f(x)…))(ফলাফলের নেতিবাচক থাকেন)। যদি আপনি এনকোড ℤ হিসাবে করেন তবে আপনার (ℕ,ℕ)এমন একটি ফাংশন প্রয়োজন যা একটি বিপরীতমুখী রয়েছে - একটি জোড়া দেওয়া হয় (f,u)এবং x, ফাংশনটি λi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)উত্পাদন u(…u(f(…f(x)…))…)করবে যা fপ্রয়োগের iসময়গুলি ছেড়ে যাবে x। উভয়ই বিভিন্ন প্রসঙ্গে কাজ করে (ফলাফল "উল্টানো" হতে পারে || fঅবিচ্ছিন্ন)
কেউ 0

@ জাজাডায়েট চার্চ-এনকোডেড সংখ্যাগুলি "তাদের নিজস্বভাবে পুনরাবৃত্তি" হিসাবে অতিরিক্ত ফাংশনগুলি প্রয়োজনীয়, তবে জোড়াগুলি কেবল আপনাকে তাদের উপাদানগুলি সরবরাহ করবে। সহায়ক সাহায্যকারী ফাংশনগুলি কেবল "ডান" ক্রমে উপাদানগুলি একসাথে আঠালো করে তোলে (যা ন্যাটগুলির জন্য স্বয়ংক্রিয়ভাবে ঘটছে)) আরও দেখুন: en.wikedia.org/wiki/… - চার্চ এনকোডিং মূলত fold . ctorকোনও নির্মাণকারীর জন্য এবং সেই ধরণের fold( r)। (এ কারণেই, পুনরাবৃত্তির ধরণের জন্য ডেটা "নিজেরাই পুনরাবৃত্তি করবে" non পুনরাবৃত্তির ধরণের ক্ষেত্রে এটি আরও case/ প্যাটার্নের ম্যাচের মতো ))
কেউ কেউ

13

ল্যাম্বদা-ক্যালকুলাস বেশিরভাগ ডেটা স্ট্রাকচার এবং বেসিক ধরনেরগুলিকে এনকোড করতে পারে। উদাহরণস্বরূপ, আপনি ল্যাম্বডা ক্যালকুলাসে বিদ্যমান শর্তগুলির একটি জোড়া এনকোড করতে পারেন , একই চার্চ এনকোডিং ব্যবহার করে আপনি সাধারণত নননিজেটিভ পূর্ণসংখ্যা এবং বুলিয়ান এনকোড করতে দেখেন:

fst = λ p p ( λ x y x ) snd = λ p পি ( λ x y y )

pair=λxyz.zxy
fst=λp.p(λxy.x)
snd=λp.p(λxy.y)

তারপর যুগল হয় পি = ( পেয়ার  একটি ) এবং আপনি ফিরে পেতে চাইলে দয়া একটি এবং আপনি কি করতে পারেন ( fst  পি ) এবং ( Snd  পি )(a,b)p=(pair ab)ab(fst p)(snd p)

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

(sign,n)

এবং এখন আপনি আপেক্ষিক পূর্ণসংখ্যার আছে। গুণটি নির্ধারণ করা সহজ, আপনাকে কেবলমাত্র ফাংশনxor প্রয়োগ করতে হবে এবং প্রাকৃতিক সংখ্যায় গুণকে পরম মানের উপর প্রয়োগ করতে হবে:

mult=λab.pair  (xor(fst a)(fst b))  (mult(snd a)(snd b))

সংযোজনটি সংজ্ঞায়িত করতে, আপনাকে দুটি প্রাকৃতিক সংখ্যার তুলনা করতে হবে এবং চিহ্নগুলি পৃথক হলে বিয়োগফল ব্যবহার করতে হবে, সুতরাং এটি কোনও term-টার্ম নয় তবে আপনি যদি সত্যিই চান তবে আপনি এটি খাপ খাইয়ে নিতে পারেন:

add=λab.{(true,add(snd a)(snd b))if a0b0(false,add(snd a)(snd b))if a<0b<0(true,sub(snd a)(snd b))if a0b<0|a||b|(false,sub(snd b)(snd a))if a0b<0|a|<|b|(true,sub(snd b)(snd a))if a<0b0|a|<|b|(false,sub(snd a)(snd b))if a<0b0|a||b|

তবে বিয়োগফলকে সংজ্ঞা দেওয়া সত্যিই সহজ:

উপ = λ একটিযোগ (একটি)( মাইনাস )

minus=λa.pair(not(fst a))(snd a)
sub=λab.add(a)(minusb)

আপনার ইতিবাচক এবং নেতিবাচক পূর্ণসংখ্যার পরে আপনি জটিল পূর্ণসংখ্যাগুলি খুব সহজেই সংজ্ঞা দিতে পারেন: এটি কেবল দুটি পূর্ণসংখ্যার একটি জুড়ি যা একটি + বি i উপস্থাপন করে । তারপরে যোগটি বিন্দু অনুসারে এবং গুণটি যথারীতি , তবে আমি এটি লিখব না, এটি সহজ হওয়া উচিত:(a,b)a+bi

add[i]=λz1z2.pair(add(fst z1)(fst z2))(add(snd z1)(snd z2))

6
k(a,b)k=ab

কমপ্লেক্স ঠিক আছে, তবে তিনি জটিল সংখ্যা চেয়েছিলেন। তারপরে আবার, এগুলি অবশ্যই কখনও প্রতিনিধিত্ব করতে পারে না কারণ সেখানে অগণনীয়।
এইচডিএম

@ আন্ড্রেজবাউর: খুব সুন্দর কৌশল (সম্ভবত এত সহজ নয়) এইচডিএম: নিশ্চিত যে তারা পারবেন, এমনকি তাদের সবার মধ্যেও নয়। তবে আমি বুঝতে পেরেছি যে চার্চ এনকোডিং সহ calc-ক্যালকুলাসে স্টাফ তৈরির পদ্ধতিটি এখানে আরও গুরুত্বপূর্ণ / উপযুক্ত।
jmad

আমি আশা করি যে আমি দুটি সঠিক উত্তর দিতে পারব =) আমি এমনকি ভাবছিলামও না যে জটিল সংখ্যা সম্পর্কে জিজ্ঞাসা করলে বাস্তবের প্রতিনিধিত্ব করা যেতে পারে তবে আপনি সেখানে যান!
zcaudate
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.