الاستعلام عن المنطقية في حساب التفاضل والتكامل

StackOverflow https://stackoverflow.com/questions/2398503

سؤال

هذا هو تمثيل حساب التفاضل والتكامل Lambda للمشغل:

lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b

هل يمكن لأي شخص مساعدتي في فهم هذا التمثيل؟

هل كانت مفيدة؟

المحلول

لفهم كيفية تمثيل المنجدات في حساب التفاضل والتكامل في Lambda ، فإنه يساعد على التفكير في تعبير if ، "إذا كان A then b else c". هذا تعبير يختار الفرع الأول ، B ، إذا كان صحيحًا ، والثاني ، C ، إذا كان خطأ. تعبيرات Lambda يمكن أن تفعل ذلك بسهولة بالغة:

lambda(x).lambda(y).x

سوف يعطيك أول حججها ، و

lambda(x).lambda(y).y

يمنحك الثانية. لذلك إذا كان A واحد من تلك التعبيرات ، إذن

a b c

يعطي أيضا b أو c, ، وهو ما نريد ما إذا كان يجب فعله. لذلك حدد

 true = lambda(x).lambda(y).x
false = lambda(x).lambda(y).y

و a b c سوف يتصرف مثل if a then b else c.

تبحث داخل تعبيرك في (n a b), ، هذا يعني if n then a else b. ثم m (n a b) b يعني

if m then (if n then a else b) else b

هذا التعبير يقيم a إذا كان كل من m و n نكون true, ، و ل b غير ذلك. حيث a هي الحجة الأولى لوظيفتك و b هو الثاني ، و true تم تعريفه على أنه دالة تعطي أول وسيطين ، ثم إذا m و n كلاهما true, ، وكذلك التعبير كله. وإلا هو كذلك false. وهذا مجرد تعريف and!

اخترع كل هذا من قبل كنيسة ألونزو ، التي اخترعت حساب التفاضل والتكامل لامدا.

نصائح أخرى

في حساب حساب Lambda ، يتم تمثيل المنطق بوظيفة تأخذ وسيطتين ، واحدة للنجاح والآخر للفشل. تسمى الحجج الاستمرارية, ، لأنهم يستمرون مع بقية الحساب ؛ يدعو Boolean True استمرار النجاح والطريقة الخاطئة المنطقية استمرار الفشل. يُطلق على هذا الترميز ترميز الكنيسة ، والفكرة هي أن المنطقية تشبه إلى حد كبير "وظيفة إذا كانت".

لذلك يمكننا أن نقول

true  = \s.\f.s
false = \s.\f.f

أين s تعني النجاح ، f تعني الفشل ، والانزلاق الخلفي هو ascii lambda.

الآن آمل أن تتمكن من رؤية إلى أين يحدث هذا. كيف نرمز and؟ حسنًا ، في C يمكننا توسيعه إلى

n && m = n ? m : false

فقط هذه هي الوظائف ، لذلك

(n && m) s f = (n ? m : false) s f = n ? (m s f) : (false s f) = n ? (m s f) : f

لكن البنية الثلاثية ، عند ترميزها في حساب حساب Lambda ، هي مجرد تطبيق للوظيفة ، لذلك لدينا

(n && m) s f = (n m false) s f = n (m s f) (false s f) = n (m s f) f

لذلك وصلنا أخيرًا

&& = \n . \m . \s . \f . n (m s f) f

وإذا قمنا بإعادة تسمية النجاح والاستمرار في الفشل a و b نعود إلى الأصل الخاص بك

&& = \n . \m . \a . \b . n (m a b) b

كما هو الحال مع الحسابات الأخرى في حساب التفاضل والتكامل ، خاصة عند استخدام ترميزات الكنيسة ، غالبًا ما يكون من الأسهل حل الأمور مع القوانين الجبرية والمنطق المعاد ، ثم التحويل إلى lambdas في النهاية.

في الواقع هو أكثر بقليل من مجرد المشغل والمشغل. إنها نسخة حساب التفاضل والتكامل Lambda من if m and n then a else b. هذا التفسير:

في حساب حساب Lambda ، يتم تمثيل True كدالة تأخذ وسيطتين* وإعادة الأول. يتم تمثيل FALSE كدالة أخذ وسيطتين* وإعادة الثانية.

الوظيفة التي أظهرتها أعلاه تأخذ أربع وسيطات*. من مظهره من المفترض أن يكون M و N من المنطقيين و A و B بعض القيم الأخرى. إذا كان M صحيحًا ، فسيقوم بتقييم حجتها الأولى التي هي n a b. وهذا بدوره سيقيم إلى A إذا كان n صحيحًا و B إذا كان N خطأ. إذا كانت M خاطئة ، فسيقوم بتقييم حجتها الثانية ب.

لذلك في الأساس ، تُرجع الوظيفة A إذا كانت كل من M و N صحيحة و B خلاف ذلك.

(*) حيث "أخذ وسيطتين" يعني "أخذ حجة وإعادة وظيفة أخذ حجة أخرى".

تحرير ردا على تعليقك:

and true false كما هو موضح في صفحة ويكي تعمل مثل هذا:

الخطوة الأولى هي ببساطة استبدال كل معرف بتعريفه ، أي (λm.λn. m n m) (λa.λb. a) (λa.λb. b). الآن الوظيفة (λm.λn. m n m) يتم تطبيقه. هذا يعني أن كل حدوث م في m n m يتم استبداله بالحجة الأولى ((λa.λb. a)) ويتم استبدال كل حدوث n بالحجة الثانية ((λa.λb. b)). لذلك نحصل (λa.λb. a) (λa.λb. b) (λa.λb. a). الآن نحن ببساطة نطبق الوظيفة (λa.λb. a). نظرًا لأن جسم هذه الوظيفة هو ببساطة ، أي الوسيطة الأولى ، فإن هذا يقيم (λa.λb. b), ، بمعنى آخر false (مثل λx.λy. y يعني false).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top