الاستعلام عن المنطقية في حساب التفاضل والتكامل
-
25-09-2019 - |
سؤال
هذا هو تمثيل حساب التفاضل والتكامل 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
).