رفع لامدا

رفع لامدا هو عملية شاملة تُعيد هيكلة برنامج حاسوبي بحيث تُعرَّف الدوال بشكل مستقل عن بعضها البعض في نطاق عام. يحوّل الرفع الفردي دالة محلية (روتين فرعي) إلى دالة عامة. وهي عملية من خطوتين، تتكون من:

استُخدم مصطلح "رفع لامدا" لأول مرة من قِبل توماس جونسون حوالي عام 1982، وكان يُعتبر تاريخيًا آليةً لتنفيذ لغات البرمجة القائمة على البرمجة الوظيفية . ويُستخدم هذا المصطلح بالتزامن مع تقنيات أخرى في بعض المترجمات الحديثة .

رفع تعبير لامدا ليس هو نفسه تحويل الإغلاق . فهو يتطلب تعديل جميع مواقع الاستدعاء (بإضافة وسائط (معاملات) إضافية إلى الاستدعاءات) ولا يُنشئ إغلاقًا لتعبير لامدا المرفوع. في المقابل، لا يتطلب تحويل الإغلاق تعديل مواقع الاستدعاء، ولكنه يُنشئ إغلاقًا لتعبير لامدا يربط المتغيرات الحرة بالقيم.

يمكن استخدام هذه التقنية على الدوال الفردية، في إعادة هيكلة الشيفرة ، لجعل الدالة قابلة للاستخدام خارج نطاقها الأصلي. كما يمكن تكرار عمليات رفع لامدا لتحويل البرنامج. ويمكن استخدام عمليات الرفع المتكررة لتحويل برنامج مكتوب بلغة لامدا إلى مجموعة من الدوال التكرارية ، دون استخدام لامدا. وهذا يُظهر تكافؤ البرامج المكتوبة بلغة لامدا والبرامج المكتوبة كدوال. [ 1 ] ومع ذلك، لا يُظهر هذا سلامة استخدام لامدا للاستدلال، لأن اختزال إيتا المستخدم في رفع لامدا هو الخطوة التي تُدخل مشاكل في عدد عناصر لامدا، لأنه يُزيل القيمة من المتغير، دون التحقق أولاً من وجود قيمة واحدة فقط تُحقق شروط المتغير (انظر مفارقة كاري ).

يُعدّ رفع تعبيرات لامدا مكلفًا من حيث وقت المعالجة بالنسبة للمترجم. ويتمثل التنفيذ الفعال لرفع تعبيرات لامدا فيما يلي:يا(ن2){\displaystyle O(n^{2})}[ 2 ] وقت المعالجة للمترجم.

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

العملية العكسية لرفع لامدا هي خفض لامدا . [ 3 ]

قد يُسرّع حذف الدوال اللامدا عملية ترجمة البرامج للمترجم، وقد يزيد أيضًا من كفاءة البرنامج الناتج، وذلك بتقليل عدد المعاملات وحجم إطارات المكدس. مع ذلك، يُصعّب ذلك إعادة استخدام الدالة. فالدالة المحذوفة مرتبطة بسياقها، ولا يمكن استخدامها في سياق مختلف إلا بعد رفعها.

الخوارزمية

الخوارزمية التالية هي إحدى طرق رفع برنامج عشوائي باستخدام تعبير لامدا في لغة لا تدعم الإغلاقات ككائنات من الدرجة الأولى :

  1. أعد تسمية الدوال بحيث يكون لكل دالة اسم فريد.
  2. استبدل كل متغير حر بوسيطة إضافية للدالة المحيطة، وقم بتمرير تلك الوسيطة إلى كل استخدام للدالة.
  3. استبدل كل تعريف دالة محلية لا تحتوي على متغيرات حرة بدالة عامة مطابقة.
  4. كرر الخطوتين 2 و 3 حتى يتم التخلص من جميع المتغيرات الحرة والوظائف المحلية.

إذا كانت اللغة تحتوي على الإغلاقات ككائنات من الدرجة الأولى يمكن تمريرها كوسائط أو إرجاعها من وظائف أخرى، فسيتعين تمثيل الإغلاق بواسطة بنية بيانات تلتقط روابط المتغيرات الحرة.

مثال

يقوم برنامج OCaml التالي بحساب مجموع الأعداد الصحيحة من 1 إلى 100:

ليكن مجموع n = إذا كان n = 1 فإن 1 وإلا فليكن f x = n + x في f ( مجموع ( n - 1 ) ) المجموع 100

( let recيُعرّف هذا sumكدالة يمكنها استدعاء نفسها). الدالة f، التي تجمع وسيط الدالة sum مع مجموع الأعداد الأقل من الوسيط، هي دالة محلية. ضمن تعريف f، n متغير حر. ابدأ بتحويل المتغير الحر إلى مُعامل:

ليكن مجموع n = إذا كان n = 1 فإن 1 وإلا فليكن f w x = w + x في f n ( مجموع ( n - 1 ) ) المجموع 100

بعد ذلك، قم بتحويل f إلى دالة عامة:

ليكن rec f w x = w + x و sum n = إذا كان n = 1 فإن 1 وإلا f n ( sum ( n - 1 )) in sum 100

فيما يلي نفس المثال، ولكن هذه المرة مكتوب بلغة جافا سكريبت :

// النسخة الأوليةدالة الجمع ( ن ) { دالة د ( س ) { إرجاع ن + س ؛ }إذا كان ( n == 1 ) فأرجع 1 ؛ وإلا فأرجع f ( sum ( n - 1 )); }// بعد تحويل المتغير الحر n إلى معامل رسمي wدالة الجمع ( ن ) { دالة f ( و ، س ) { إرجاع و + س ؛ }إذا كان ( n == 1 ) فأرجع 1 ؛ وإلا فأرجع f ( n , sum ( n - 1 )); }// بعد رفع الدالة f إلى النطاق العامدالة f ( w , x ) { إرجاع w + x ; }دالة المجموع ( ن ) { إذا كان ( ن == 1 ) أرجع 1 ؛ وإلا أرجع f ( ن ، مجموع ( ن - 1 )); }

رفع لامدا مقابل إغلاقها

يُعدّ كلٌّ من رفع لامدا والإغلاق طريقتين لتنفيذ البرامج ذات البنية الكتلية . يُطبّق الرفع البنية الكتلية عن طريق إلغائها، حيث تُرفع جميع الدوال إلى المستوى العام. أما تحويل الإغلاق فيُوفّر "إغلاقًا" يربط الإطار الحالي بالإطارات الأخرى، ويستغرق وقتًا أقل في الترجمة.

يمكن تنفيذ الدوال التكرارية والبرامج ذات البنية الكتلية، سواءً مع رفع الذاكرة أو بدونه، باستخدام بنية قائمة على المكدس ، وهي بنية بسيطة وفعالة. مع ذلك، يجب أن تكون البنية القائمة على إطار المكدس صارمة (مُستعجلة) . تتطلب هذه البنية أن يكون عمر الدوال وفقًا لأسلوب " آخر ما يدخل، أول ما يخرج" (LIFO). أي أن آخر دالة بدأت حسابها يجب أن تكون أول دالة تنتهي.

تُطبَّق بعض لغات البرمجة الوظيفية (مثل هاسكل ) باستخدام التقييم الكسول ، الذي يؤجل الحساب حتى الحاجة إلى القيمة. تمنح استراتيجية التنفيذ الكسول المبرمج مرونةً كبيرة. يتطلب التقييم الكسول تأخير استدعاء الدالة حتى يُطلب الحصول على القيمة المحسوبة منها. يتمثل أحد تطبيقات هذه الاستراتيجية في تسجيل مرجع إلى "إطار" بيانات يصف الحساب، بدلاً من القيمة نفسها. لاحقًا، عند الحاجة إلى القيمة، يُستخدم الإطار لحسابها في الوقت المناسب تمامًا. ثم تحل القيمة المحسوبة محل المرجع.

يُشبه "الإطار" إطار المكدس ، مع اختلاف أنه لا يُخزّن على المكدس. يتطلب التقييم الكسول حفظ جميع البيانات اللازمة للحساب في الإطار. إذا كانت الدالة "مرفوعة"، فإن الإطار يحتاج فقط إلى تسجيل مؤشر الدالة ومعاملاتها. تستخدم بعض اللغات الحديثة جمع البيانات المهملة بدلاً من تخصيص الذاكرة على المكدس لإدارة دورة حياة المتغيرات. في بيئة مُدارة ومُجمّعة البيانات المهملة، يُسجّل الإغلاق مراجع الإطارات التي يمكن الحصول منها على القيم. في المقابل، تحتوي الدالة المرفوعة على معاملات لكل قيمة مطلوبة في الحساب.

التعبيرات اللفظية وحساب التفاضل والتكامل لامدا

تُعدّ عبارة let مفيدة في وصف عمليات الرفع والإسقاط، والعلاقة بين المعادلات التكرارية وتعبيرات لامدا. تحتوي معظم لغات البرمجة الوظيفية على تعابير let. كما أن لغات البرمجة ذات البنية الكتلية ، مثل ALGOL و Pascal، تُشابهها في أنها تسمح أيضًا بالتعريف المحلي للدالة لاستخدامها في نطاق محدود .

إن تعبير let المستخدم هنا هو نسخة متبادلة التكرار بالكامل من let rec ، كما هو مطبق في العديد من اللغات الوظيفية.

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

ترد قواعد التحويل التي تصف الترجمة بدون رفع في مقالة تعبير Let .

توضح القواعد التالية تكافؤ تعبيرات لامدا وليت،

اسمقانون
تكافؤ اختزال إيتاو x=yو=λx.y{\displaystyle f\ x=y\equiv f=\lambda x.y}
تكافؤ ليت-لامداوFV(هـ)(يتركو:و=هـفيL(λو.L) هـ) (أين و (اسم متغير.){\displaystyle f\notin FV(E)\to (\operatorname {let} f:f=E\operatorname {in} L\equiv (\lambda f.L)\ E)\ {\text{(where }}f{\text{ is a variable name.)}}}
مجموعة ليxFV(هـ)(يتركv،...،w،x:هـFفيLيتركv،...،w:هـفييتركx:FفيL){\displaystyle x\notin FV(E)\to (\operatorname {let} v,\dots ,w,x:E\land F\operatorname {in} L\equiv \operatorname {let} v,\dots ,w:E\operatorname {in} \operatorname {let} x:F\operatorname {in} L)}

سيتم تقديم دوال وصفية تصف رفع وخفض قيم لامدا. الدالة الوصفية هي دالة تأخذ برنامجًا كمعامل. يمثل البرنامج بيانات للبرنامج الوصفي. يقع البرنامج والبرنامج الوصفي على مستويين وصفيين مختلفين.

سيتم استخدام الاصطلاحات التالية للتمييز بين البرنامج والبرنامج الفوقي،

  • سيتم استخدام الأقواس المربعة [] لتمثيل تطبيق الدالة في البرنامج الفوقي.
  • سيتم استخدام الأحرف الكبيرة للمتغيرات في البرنامج الوصفي. أما الأحرف الصغيرة فتمثل المتغيرات في البرنامج.
  • {\displaystyle \equiv }سيتم استخدامها للمساواة في البرنامج الوصفي.
  • _{\displaystyle \_}يمثل متغيرًا وهميًا، أو قيمة غير معروفة.

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

يُستخدم عامل الاستبدال على نطاق واسع. التعبيرL[جي:=S]{\displaystyle L[G:=S]}يعني ذلك استبدال كل ظهور للحرف G في L بالحرف S وإرجاع التعبير. تم توسيع التعريف المستخدم ليشمل استبدال التعبيرات، انطلاقًا من التعريف الوارد في صفحة حساب لامدا . يجب أن تقارن عملية مطابقة التعبيرات التعبيرات للتأكد من تكافؤها (إعادة تسمية المتغيرات).

رفع لامدا في حساب لامدا

تستبدل كل عملية رفع لدالة لامدا تجريدًا لدالة لامدا، وهو تعبير فرعي من تعبير لامدا، باستدعاء دالة (تطبيق) لدالة تقوم بإنشائها. المتغيرات الحرة في التعبير الفرعي هي معاملات استدعاء الدالة.

يمكن استخدام عمليات رفع لامدا على الدوال الفردية، في إعادة هيكلة الكود ، لجعل الدالة قابلة للاستخدام خارج نطاقها الأصلي. كما يمكن تكرار عمليات الرفع هذه، حتى لا يحتوي التعبير على أي تجريدات لامدا، لتحويل البرنامج.

مصعد لامدا

تُعطى عملية الرفع تعبيرًا فرعيًا ضمن تعبير رئيسي لرفعه إلى أعلى ذلك التعبير. قد يكون التعبير جزءًا من برنامج أكبر. يتيح ذلك التحكم في مكان رفع التعبير الفرعي. عملية الرفع لامدا المستخدمة لتنفيذ عملية رفع ضمن برنامج هي:

لأمبدأ-لأناوت-oص[S،L،P]=P[L:=لأمبدأ-لأناوت[S،L]]{\displaystyle \operatorname {lambda-lift-op} [S,L,P]=P[L:=\operatorname {lambda-lift} [S,L]]}

قد يكون التعبير الفرعي إما تجريدًا لـ lambda، أو تجريدًا لـ lambda مطبقًا على معلمة.

يوجد نوعان من المصاعد.

يحتوي الرفع المجهول على تعبير رفع يمثل تجريدًا لدالة لامدا فقط. ويُعتبر بمثابة تعريف لدالة مجهولة . يجب تحديد اسم لهذه الدالة.

يُطبَّق تجريد لامدا على تعبير الرفع المُسمّى. ويُعتبر هذا الرفع تعريفًا مُسمّى لدالة.

مصعد مجهول الهوية

يستمد المصعد المجهول تجريدًا لامدا (يسمى S ). لـ S ؛

  • أنشئ اسمًا للدالة التي ستحل محل S (وتسمى V ). تأكد من عدم استخدام الاسم المحدد بواسطة V.
  • أضف معلمات إلى V ، لجميع المتغيرات الحرة في S ، لإنشاء تعبير G (انظر make-call ).

إن رفع لامدا هو استبدال تجريد لامدا S بتطبيق دالة، بالإضافة إلى إضافة تعريف للدالة.

لأمبدأ-لأناوت[S،L]يتركV:دهـ-لأمبدأ[جي=S]فيL[S:=جي]{\displaystyle \operatorname {lambda-lift} [S,L]\equiv \operatorname {let} V:\operatorname {de-lambda} [G=S]\operatorname {in} L[S:=G]}

يحتوي التعبير الجديد لـ lambda على استبدال S بـ G: L [ S := G ] يعني استبدال S بـ G في L. تمت إضافة تعريف الدالة G = S إلى تعريفات الدوال .

في القاعدة المذكورة أعلاه ، G هي دالة التطبيق التي تحل محل التعبير S. ويتم تعريفها على النحو التالي:

جي=مأكهـ-جألل[V،FV[S]]{\displaystyle G=\operatorname {make-call} [V,\operatorname {FV} [S]]}

حيث V هو اسم الدالة. يجب أن يكون متغيرًا جديدًا، أي اسمًا لم يُستخدم من قبل في تعبير لامدا.

Vالمتغيرات[يتركFفيL]{\displaystyle V\not \in \operatorname {vars} [\operatorname {let} F\operatorname {in} L]}

أينالمتغيرات[هـ]{\displaystyle \operatorname {vars} [E]}هي دالة وصفية تُرجع مجموعة المتغيرات المستخدمة في E.

مثال على المصعد المجهول.
على سبيل المثال،
F=حقيقيL=λو.(λx.و (x x)) (λx.و (x x))S=λx.و (x x)جي=ص و{\displaystyle {\begin{aligned}F&=\operatorname {true} \\L&=\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))\\S&=\lambda x.f\ (x\ x)\\G&=p\ f\end{aligned}}}
دهـ-لأمبدأ[ص و=λx.و (x x)]ص و x=و (x x){\displaystyle \operatorname {de-lambda} [p\ f=\lambda x.f\ (x\ x)]\equiv p\ f\ x=f\ (x\ x)}

انظر إلى de-lambda في قسم التحويل من تعبيرات lambda إلى تعبيرات let . والنتيجة هي:

لأمبدأ-لأناوت[λx.و (x x)،يتركحقيقيفيλو.(λx.و (x x)) (λx.و (x x))]يتركص و x=و (x x)فيλو.(ص و) (ص و){\displaystyle \operatorname {lambda-lift} [\lambda x.f\ (x\ x),\operatorname {let} \operatorname {true} \operatorname {in} \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\equiv \operatorname {let} p\ f\ x=f\ (x\ x)\operatorname {in} \lambda f.(p\ f)\ (p\ f)}
إنشاء المكالمة

يتم إنشاء استدعاء الدالة G عن طريق إضافة معلمات لكل متغير في مجموعة المتغيرات الحرة (الممثلة بـ V ) إلى الدالة H.

  • XVمأكهـ-جألل[ح،V]مأكهـ-جألل[ح،V¬{X}] X{\displaystyle X\in V\to \operatorname {make-call} [H,V]\equiv \operatorname {make-call} [H,V\cap \neg \{X\}]\ X}
  • مأكهـ-جألل[ح،{}]ح{\displaystyle \operatorname {make-call} [H,\{\}]\equiv H}
مثال على بناء الاستدعاء.
S=λx.و (x x){\displaystyle S=\lambda x.f\ (x\ x)}
FV(S)={و}{\displaystyle \operatorname {FV} (S)=\{f\}}
جيمأكهـ-جألل[ص،FV[S]]مأكهـ-جألل[ص،{و}]مأكهـ-جألل[ص،{}] وص و{\displaystyle G\equiv \operatorname {make-call} [p,\operatorname {FV} [S]]\equiv \operatorname {make-call} [p,\{f\}]\equiv \operatorname {make-call} [p,\{\}]\ f\equiv p\ f}

مصعد يحمل اسمًا

المصعد المسمى يشبه المصعد المجهول باستثناء أنه يتم توفير اسم الوظيفة V.

لأمبدأ-لأناوت[(λV.هـ) S،L]يتركV:دهـ-لأمبدأ[جي=S]فيL[(λV.هـ) S:=هـ[V:=جي]]{\displaystyle \operatorname {lambda-lift} [(\lambda V.E)\ S,L]\equiv \operatorname {let} V:\operatorname {de-lambda} [G=S]\operatorname {in} L[(\lambda V.E)\ S:=E[V:=G]]}

أما بالنسبة للرفع المجهول، فإن التعبير G يُشتق من V بتطبيق المتغيرات الحرة لـ S. ويُعرَّف على النحو التالي:

جي=مأكهـ-جألل[V،FV[S]]{\displaystyle G=\operatorname {make-call} [V,\operatorname {FV} [S]]}
مثال على مصعد مُسمى.

على سبيل المثال،

V=xهـ=و (x x)S=(λx.و (x x))L=λو.(λx.و (x x)) (λx.و (x x))جي=x و{\displaystyle {\begin{aligned}V&=x\\E&=f\ (x\ x)\\S&=(\lambda x.f\ (x\ x))\\L&=\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))\\G&=x\ f\end{aligned}}}
هـ[V:=جي]=و (x x)[x:=x و]=و ((x و) (x و)){\displaystyle E[V:=G]=f\ (x\ x)[x:=x\ f]=f\ ((x\ f)\ (x\ f))}
L[(λV.هـ) F:=هـ[V:=جي]]=L[(λx.و (x x)) (λx.و (x x)):=و ((x و) (x و))]=λو.و ((x و) (x و)){\displaystyle L[(\lambda V.E)\ F:=E[V:=G]]=L[(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x)):=f\ ((x\ f)\ (x\ f))]=\lambda f.f\ ((x\ f)\ (x\ f))}
دهـ-لأمبدأ[x و=λy.و (y y)]x و y=و (y y){\displaystyle \operatorname {de-lambda} [x\ f=\lambda y.f\ (y\ y)]\equiv x\ f\ y=f\ (y\ y)}

انظر إلى de-lambda في قسم التحويل من تعبيرات lambda إلى تعبيرات let . والنتيجة هي:

يعطي،

لأمبدأ-لأناوت[(λx.و (x x)) (λx.و (x x))،λو.(λx.و (x x)) (λx.و (x x))]يتركx و y=و (y y)فيλو.(x و) (x و){\displaystyle \operatorname {lambda-lift} [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x)),\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\equiv \operatorname {let} x\ f\ y=f\ (y\ y)\operatorname {in} \lambda f.(x\ f)\ (x\ f)}

تحويل لامدا-ليفت

تُحوّل عملية رفع تعبير لامدا إلى أعلى التعبير، حيث تُرفع جميع تجريدات لامدا إلى أعلى التعبير. ثم تُترجم هذه التجريدات إلى دوال تكرارية ، مما يُلغي تجريدات لامدا. والنتيجة هي برنامج وظيفي بالشكل التالي:

  • يتركمفيشمال{\displaystyle \operatorname {let} M\operatorname {in} N}

حيث M عبارة عن سلسلة من تعريفات الدوال، و N هو التعبير الذي يمثل القيمة التي يتم إرجاعها.

على سبيل المثال،

لأمبدأ-لأناوت-ترأن[λو.(λx.و (x x)) (λx.و (x x))]يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص{\displaystyle \operatorname {lambda-lift-tran} [\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\equiv \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p}

يمكن بعد ذلك استخدام دالة de-let meta لتحويل النتيجة مرة أخرى إلى حساب لامدا.

دهـ-لهـت[لأمبدأ-لأناوت-ترأن[λو.(λx.و (x x)) (λx.و (x x))]](λص.(λq.q ص) λص.λو.(ص و) (ص و)) λو.λx.و (x x){\displaystyle \operatorname {de-let} [\operatorname {lambda-lift-tran} [\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]]\equiv (\lambda p.(\lambda q.q\ p)\ \lambda p.\lambda f.(p\ f)\ (p\ f))\ \lambda f.\lambda x.f\ (x\ x)}

تتضمن عملية تحويل تعبير لامدا سلسلة من عمليات الرفع. كل عملية رفع تتضمن،

  • يتم اختيار تعبير فرعي بواسطة الدالة lift-choice . يجب اختيار التعبير الفرعي بحيث يمكن تحويله إلى معادلة بدون تعابير لامدا.
  • يتم تنفيذ عملية الرفع عن طريق استدعاء الدالة الوصفية lambda-lift ، الموضحة في القسم التالي.
{لأمبدأ-لأناوت-ترأن[L]=درoص-صأرأمs-ترأن[مهـرزهـ-لهـت[لأمبدأ-أصصلy[L]]]لأمبدأ-أصصلy[L]=لأمبدأ-صرoجهـss[لأناوت-جحoأناجهـ[L]،L]لأمبدأ-صرoجهـss[لا أحد،L]=Lلأمبدأ-صرoجهـss[S،L]=لأمبدأ-أصصلy[لأمبدأ-لأناوت[S،L]]{\displaystyle {\begin{cases}\operatorname {lambda-lift-tran} [L]=\operatorname {drop-params-tran} [\operatorname {merge-let} [\operatorname {lambda-apply} [L]]]\\\operatorname {lambda-apply} [L]=\operatorname {lambda-process} [\operatorname {lift-choice} [L],L]\\\operatorname {lambda-process} [\operatorname {none} ,L]=L\\\operatorname {lambda-process} [S,L]=\operatorname {lambda-apply} [\operatorname {lambda-lift} [S,L]]\end{cases}}}

بعد تركيب المصاعد، يتم دمج الأجزاء معًا في جزء واحد.

{مهـرزهـ-لهـت[يتركV:هـفييتركدبليو:Fفيجي]=مهـرزهـ-لهـت[يتركV،دبليو:هـFفيجي]مهـرزهـ-لهـت[هـ]=هـ{\displaystyle {\begin{cases}\operatorname {merge-let} [\operatorname {let} V:E\operatorname {in} \operatorname {let} W:F\operatorname {in} G]=\operatorname {merge-let} [\operatorname {let} V,W:E\land F\operatorname {in} G]\\\operatorname {merge-let} [E]=E\end{cases}}}

ثم يتم تطبيق حذف المعاملات لإزالة المعاملات غير الضرورية في تعبير "let". يسمح تعبير "let" لتعريفات الدوال بالإشارة إلى بعضها البعض مباشرةً، بينما تكون تجريدات لامدا هرمية تمامًا، ولا يجوز للدالة الإشارة إلى نفسها مباشرةً.

اختيار التعبير المناسب للرفع

هناك طريقتان مختلفتان لاختيار تعبير لرفعه. الأولى تُعامل جميع تجريدات لامدا على أنها تُعرّف دوالًا مجهولة. أما الثانية، فتُعامل تجريدات لامدا المُطبقة على مُعامل على أنها تُعرّف دالة. لتجريدات لامدا المُطبقة على مُعامل تفسيران: إما تعبير let يُعرّف دالة، أو يُعرّف دالة مجهولة. كلا التفسيرين صحيح.

هذان المسندان ضروريان لكلا التعريفين.

خالٍ من تعبيرات لامدا - تعبير لا يحتوي على أي تجريدات لامدا.

{لأمبدأ-ورهـهـ[λF.X]=خطأ شنيعلأمبدأ-ورهـهـ[V]=حقيقيلأمبدأ-ورهـهـ[م شمال]=لأمبدأ-ورهـهـ[م]لأمبدأ-ورهـهـ[شمال]{\displaystyle {\begin{cases}\operatorname {lambda-free} [\lambda F.X]=\operatorname {false} \\\operatorname {lambda-free} [V]=\operatorname {true} \\\operatorname {lambda-free} [M\ N]=\operatorname {lambda-free} [M]\land \operatorname {lambda-free} [N]\end{cases}}}

lambda-anon - دالة مجهولة. تعبير مثلλx1. ... λxن.X{\displaystyle \lambda x_{1}.\ ...\ \lambda x_{n}.X}حيث X خالية من لامدا.

{لأمبدأ-أنoن[λF.X]=لأمبدأ-ورهـهـ[X]لأمبدأ-أنoن[X]لأمبدأ-أنoن[V]=خطأ شنيعلأمبدأ-أنoن[م شمال]=خطأ شنيع{\displaystyle {\begin{cases}\operatorname {lambda-anon} [\lambda F.X]=\operatorname {lambda-free} [X]\lor \operatorname {lambda-anon} [X]\\\operatorname {lambda-anon} [V]=\operatorname {false} \\\operatorname {lambda-anon} [M\ N]=\operatorname {false} \end{cases}}}
اختيار الوظائف المجهولة فقط لأغراض الرفع

ابحث عن أعمق تجريد مجهول، بحيث يصبح عند تطبيق الرفع، الدالة المرفوعة معادلة بسيطة. لا يعتبر هذا التعريف تجريدات لامدا ذات المعامل تعريفًا لدالة. تُعتبر جميع تجريدات لامدا تعريفًا لدوال مجهولة.

lift-choice - أول مجهول يتم العثور عليه أثناء اجتياز التعبير أو لا شيء إذا لم تكن هناك دالة.

  1. لأمبدأ-أنoن[X]لأناوت-جحoأناجهـ[X]=X{\displaystyle \operatorname {lambda-anon} [X]\to \operatorname {lift-choice} [X]=X}
  2. لأناوت-جحoأناجهـ[λF.X]=لأناوت-جحoأناجهـ[X]{\displaystyle \operatorname {lift-choice} [\lambda F.X]=\operatorname {lift-choice} [X]}
  3. لأناوت-جحoأناجهـ[م]لا أحدلأناوت-جحoأناجهـ[م شمال]=لأناوت-جحoأناجهـ[م]{\displaystyle \operatorname {lift-choice} [M]\neq \operatorname {none} \to \operatorname {lift-choice} [M\ N]=\operatorname {lift-choice} [M]}
  4. لأناوت-جحoأناجهـ[م شمال]=لأناوت-جحoأناجهـ[شمال]{\displaystyle \operatorname {lift-choice} [M\ N]=\operatorname {lift-choice} [N]}
  5. لأناوت-جحoأناجهـ[V]=لا أحد{\displaystyle \operatorname {lift-choice} [V]=\operatorname {none} }

على سبيل المثال،

اختيار لامداλو.(λx.و (x x)) (λy.و (y y)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))}يكونλx.و (x x){\displaystyle \lambda x.f\ (x\ x)}
قاعدةنوع الوظيفةخيار
2لأناوت-جحoأناجهـ[λو.(λx.و (x x)) (λy.و (y y))]{\displaystyle \operatorname {lift-choice} [\lambda f.(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))]}
3لأناوت-جحoأناجهـ[(λx.و (x x)) (λy.و (y y))]{\displaystyle \operatorname {lift-choice} [(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))]}
1حالالأناوت-جحoأناجهـ[λx.و (x x)]{\displaystyle \operatorname {lift-choice} [\lambda x.f\ (x\ x)]}
λx.و (x x){\displaystyle \lambda x.f\ (x\ x)}
اختيار لامداλو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}يكونλو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}
قاعدةنوع الوظيفةخيار
2حالالأناوت-جحoأناجهـ[λو.(ص و) (ص و)]{\displaystyle \operatorname {lift-choice} [\lambda f.(p\ f)\ (p\ f)]}
2λو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}
اختيار الدوال المسماة والمجهولة لرفع البيانات

ابحث عن أعمق تعريف للدالة، سواءً كانت مُسماة أو مجهولة، بحيث تصبح الدالة المرفوعة معادلةً بسيطةً عند تطبيق عملية الرفع. يُعرّف هذا التعريف تجريد لامدا الذي يحتوي على مُعامل فعلي كدالة. أما تجريدات لامدا التي لا تحتوي على تطبيق، فتُعامل كدوال مجهولة.

لامدا-الاسم
دالة مُسماة. تعبير مثل(λF.م) شمال{\displaystyle (\lambda F.M)\ N}حيث M خالية من تعبيرات لامدا و N خالية من تعبيرات لامدا أو دالة مجهولة.
لأمبدأ-نأمهـد[(λF.م) شمال]=لأمبدأ-ورهـهـ[م]لأمبدأ-أنoن[شمال]لأمبدأ-نأمهـد[λF.X]=خطأ شنيعلأمبدأ-نأمهـد[V]=خطأ شنيع{\displaystyle {\begin{array}{l}\operatorname {lambda-named} [(\lambda F.M)\ N]=\operatorname {lambda-free} [M]\land \operatorname {lambda-anon} [N]\\\operatorname {lambda-named} [\lambda F.X]=\operatorname {false} \\\operatorname {lambda-named} [V]=\operatorname {false} \end{array}}}
اختيار المصعد
أول دالة مجهولة أو مسماة يتم العثور عليها أثناء اجتياز التعبير، أو لا شيء إذا لم تكن هناك دالة.
  1. لأمبدأ-نأمهـد[X]لأمبدأ-أنoن[X]لأناوت-جحoأناجهـ[X]=X{\displaystyle \operatorname {lambda-named} [X]\lor \operatorname {lambda-anon} [X]\to \operatorname {lift-choice} [X]=X}
  2. لأناوت-جحoأناجهـ[λF.X]=لأناوت-جحoأناجهـ[X]{\displaystyle \operatorname {lift-choice} [\lambda F.X]=\operatorname {lift-choice} [X]}
  3. لأناوت-جحoأناجهـ[م]لا أحدلأناوت-جحoأناجهـ[م شمال]=لأناوت-جحoأناجهـ[م]{\displaystyle \operatorname {lift-choice} [M]\neq \operatorname {none} \to \operatorname {lift-choice} [M\ N]=\operatorname {lift-choice} [M]}
  4. لأناوت-جحoأناجهـ[م شمال]=لأناوت-جحoأناجهـ[شمال]{\displaystyle \operatorname {lift-choice} [M\ N]=\operatorname {lift-choice} [N]}
  5. لأناوت-جحoأناجهـ[V]=لا أحد{\displaystyle \operatorname {lift-choice} [V]=\operatorname {none} }

على سبيل المثال،

اختيار لامداλو.(λx.و (x x)) (λy.و (y y)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))}يكون(λx.و (x x)) (λy.و (y y)){\displaystyle (\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))}
قاعدةنوع الوظيفةخيار
2لأناوت-جحoأناجهـ[λو.(λx.و (x x)) (λy.و (y y))]{\displaystyle \operatorname {lift-choice} [\lambda f.(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))]}
1اسملأناوت-جحoأناجهـ[(λx.و (x x)) (λy.و (y y))]{\displaystyle \operatorname {lift-choice} [(\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))]}
(λx.و (x x)) (λy.و (y y)){\displaystyle (\lambda x.f\ (x\ x))\ (\lambda y.f\ (y\ y))}
اختيار لامداλو.و ((x و) (x و)){\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))}يكونλو.و ((x و) (x و)){\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))}
قاعدةنوع الوظيفةخيار
1حالالأناوت-جحoأناجهـ[λو.و ((x و) (x و))]{\displaystyle \operatorname {lift-choice} [\lambda f.f\ ((x\ f)\ (x\ f))]}
λو.و ((x و) (x و)){\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))}

أمثلة

على سبيل المثال، مُركِّب Y ،

λو.(λx.و (x x)) (λx.و (x x)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}

تم رفعه على النحو التالي:

يتركx و y=و (y y)q x و=و ((x و) (x و))فيq x{\displaystyle \operatorname {let} x\ f\ y=f\ (y\ y)\land q\ x\ f=f\ ((x\ f)\ (x\ f))\operatorname {in} q\ x}

وبعد حذف المعلمة ،

يتركx و y=و (y y)q و=و ((x و) (x و))فيq{\displaystyle \operatorname {let} x\ f\ y=f\ (y\ y)\land q\ f=f\ ((x\ f)\ (x\ f))\operatorname {in} q}

كتعبير لامدا (انظر التحويل من تعبيرات let إلى تعبيرات لامدا

(λx.(λq.q) λو.و (x و) (x و)) λو.λy.و (y y){\displaystyle (\lambda x.(\lambda q.q)\ \lambda f.f\ (x\ f)\ (x\ f))\ \lambda f.\lambda y.f\ (y\ y)}
رفع الوظائف المسماة والمجهولة
تعبير لامداوظيفةمنلالمتغيرات
1λو.(λx.و (x x)) (λx.و (x x)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}حقيقي(λx.و (x x)) (λx.و (x x)){\displaystyle (\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}x و{\displaystyle x\ f}{x،و}{\displaystyle \{x,f\}}
2

(λو.(λx.و (x x))(λx.و (x x))){\displaystyle (\lambda f.(\lambda x.f\ (x\ x))(\lambda x.f\ (x\ x)))}

[(λx.و (x x)) (λx.و (x x)):=و ((x و) (x و))]{\displaystyle [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x)):=f\ ((x\ f)\ (x\ f))]}
x و=λy.و (y y){\displaystyle x\ f=\lambda y.f\ (y\ y)}{x،و،ص}{\displaystyle \{x,f,p\}}
3λو.و ((x و) (x و)){\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))}x و y=و (y y){\displaystyle x\ f\ y=f\ (y\ y)}λو.و ((x و) (x و)){\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))}q x{\displaystyle q\ x}{x،و،ص}{\displaystyle \{x,f,p\}}
4λو.و ((x و) (x و))[λو.و ((x و) (x و)):=q x]{\displaystyle \lambda f.f\ ((x\ f)\ (x\ f))[\lambda f.f\ ((x\ f)\ (x\ f)):=q\ x]}x و y=و (y y)q x=λو.و ((x و) (x و)){\displaystyle x\ f\ y=f\ (y\ y)\land q\ x=\lambda f.f\ ((x\ f)\ (x\ f))}{x،و،ص،q}{\displaystyle \{x,f,p,q\}}
5q x{\displaystyle q\ x}x و y=و (y y)q x و=و ((x و) (x و)){\displaystyle x\ f\ y=f\ (y\ y)\land q\ x\ f=f\ ((x\ f)\ (x\ f))}{x،و،ص،q}{\displaystyle \{x,f,p,q\}}

إذا اقتصر الأمر على رفع الدوال المجهولة فقط، فإن مُركِّب Y هو،

يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص{\displaystyle \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p}

وبعد حذف المعلمة ،

يتركص و x=و (x x)q و=(ص و) (ص و)فيq{\displaystyle \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ f=(p\ f)\ (p\ f)\operatorname {in} q}

كتعبير لامدا،

(λص.(λq.q) λو.(ص و) (ص و)) λو.λx.و (x x){\displaystyle (\lambda p.(\lambda q.q)\ \lambda f.(p\ f)\ (p\ f))\ \lambda f.\lambda x.f\ (x\ x)}
رفع الوظائف المجهولة فقط
تعبير لامداوظيفةمنلالمتغيرات
1λو.(λx.و (x x)) (λx.و (x x)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}حقيقيλx.و (x x){\displaystyle \lambda x.f\ (x\ x)}ص و{\displaystyle p\ f}{x،و}{\displaystyle \{x,f\}}
2(λو.(λx.و (x x))(λx.و (x x)))[λx.و (x x):=ص و]{\displaystyle (\lambda f.(\lambda x.f\ (x\ x))(\lambda x.f\ (x\ x)))[\lambda x.f\ (x\ x):=p\ f]}ص و=λx.و (x x){\displaystyle p\ f=\lambda x.f\ (x\ x)}{x،و،ص}{\displaystyle \{x,f,p\}}
3λو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}ص و x=و (x x){\displaystyle p\ f\ x=f\ (x\ x)}λو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}q ص{\displaystyle q\ p}{x،و،ص}{\displaystyle \{x,f,p\}}
4λو.(ص و) (ص و)[λو.(ص و) (ص و):=q ص]{\displaystyle \lambda f.(p\ f)\ (p\ f)[\lambda f.(p\ f)\ (p\ f):=q\ p]}ص و x=و (x x)q ص=λو.(ص و) (ص و){\displaystyle p\ f\ x=f\ (x\ x)\land q\ p=\lambda f.(p\ f)\ (p\ f)}{x،و،ص،q}{\displaystyle \{x,f,p,q\}}
5q ص{\displaystyle q\ p}ص و x=و (x x)q ص و=(ص و) (ص و){\displaystyle p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)}{x،و،ص،q}{\displaystyle \{x,f,p,q\}}

أول تعبير فرعي يتم اختياره للرفع هوλx.و (x x){\displaystyle \lambda x.f\ (x\ x)}وهذا يحول تعبير لامدا إلىλو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}وينشئ المعادلةص و x=و(x x){\displaystyle p\ f\ x=f(x\ x)}.

التعبير الفرعي الثاني الذي سيتم اختياره للرفع هوλو.(ص و) (ص و){\displaystyle \lambda f.(p\ f)\ (p\ f)}وهذا يحول تعبير لامدا إلىq ص{\displaystyle q\ p}وينشئ المعادلةq ص و=(ص و) (ص و){\displaystyle q\ p\ f=(p\ f)\ (p\ f)}.

والنتيجة هي،

يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص {\displaystyle \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p\ }

والمثير للدهشة أن هذه النتيجة أبسط من تلك التي تم الحصول عليها من رفع الدوال المسماة.

تنفيذ

تطبيق الدالة على K ،

{λو.(λx.و (x x)) (λx.و (x x)) ك يترك ص و x=و (x x)q ص و=(ص و) (ص و) في q ص ك(λx.ك (x x)) (λx.ك (x x)) يترك ص و x=و (x x)q ص و=(ص و) (ص و) في ص ك (ص ك)ك ((λx.ك (x x)) (λx.ك (x x))) يترك ص و x=و (x x)q ص و=ص و (ص و) في ك (ص ك (ص ك)){\displaystyle {\begin{cases}\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))\ K&\ \operatorname {let} \ p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} \ q\ p\ K\\(\lambda x.K\ (x\ x))\ (\lambda x.K\ (x\ x))&\ \operatorname {let} \ p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} \ p\ K\ (p\ K)\\K\ ((\lambda x.K\ (x\ x))\ (\lambda x.K\ (x\ x)))&\ \operatorname {let} \ p\ f\ x=f\ (x\ x)\land q\ p\ f=p\ f\ (p\ f)\ \operatorname {in} \ K\ (p\ K\ (p\ K))\\\end{cases}}}

لذا،

(λx.ك (x x)) (λx.ك (x x))=ك ((λx.ك (x x)) (λx.ك (x x)))) {\displaystyle (\lambda x.K\ (x\ x))\ (\lambda x.K\ (x\ x))=K\ ((\lambda x.K\ (x\ x))\ (\lambda x.K\ (x\ x))))\ }

أو

ص ك (ص ك)=ك (ص ك (ص ك)){\displaystyle p\ K\ (p\ K)=K\ (p\ K\ (p\ K))}

يستدعي مُركِّب Y مُعامله (الدالة) بشكل متكرر على نفسه. تُحدَّد القيمة إذا كانت للدالة نقطة ثابتة . لكن الدالة لن تنتهي أبدًا.

انخفاض قيمة لامدا في حساب التفاضل والتكامل لامدا

يُقلل حذف تعبيرات لامدا [ 4 ] نطاق الدوال، ويستخدم السياق الناتج من النطاق المُصغّر لتقليل عدد المعاملات. ويُسهّل تقليل عدد المعاملات فهم الدوال.

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

يتم تنفيذ عملية إسقاط لامدا على مرحلتين،

انخفاض لامدا

يتم تطبيق دالة حذف لامدا على تعبير ضمن برنامج. ويتم التحكم في عملية الحذف بواسطة مجموعة من التعبيرات التي سيتم استبعادها من عملية الحذف.

لأمبدأ-درoص-oص[L،P،X]=P[L:=درoص-صأرأمs-ترأن[sأنانك-تهـsت[L،X]]]{\displaystyle \operatorname {lambda-drop-op} [L,P,X]=P[L:=\operatorname {drop-params-tran} [\operatorname {sink-test} [L,X]]]}

أين،

L هو التجريد اللامدا الذي سيتم حذفه.
P هو البرنامج
X عبارة عن مجموعة من التعبيرات التي يجب استبعادها من عملية الحذف.

تحول قطرة لامدا

يُخفي تحويل لامدا دروب جميع التجريدات في التعبير. ويُستثنى من ذلك التعبيرات الموجودة ضمن مجموعة من التعبيرات.

لأمبدأ-درoص-ترأن[L،X]=درoص-صأرأمs-ترأن[sأنانك-ترأن[دهـ-لهـت[L،X]]]{\displaystyle \operatorname {lambda-drop-tran} [L,X]=\operatorname {drop-params-tran} [\operatorname {sink-tran} [\operatorname {de-let} [L,X]]]}

أين،

L هو التعبير المراد تحويله.
X عبارة عن مجموعة من التعبيرات الفرعية التي سيتم استبعادها من عملية الحذف.

يُغرق نظام sink-tran كل تجريد، بدءًا من الأعمق.

{sأنانك-ترأن[(λشمال.ب) Y،X]=sأنانك-تهـsت[(λشمال.sأنانك-ترأن[ب]) sأنانك-ترأن[Y]،X]sأنانك-ترأن[λشمال.ب،X]=λشمال.sأنانك-ترأن[ب،X]sأنانك-ترأن[م شمال،X]=sأنانك-ترأن[م،X] sأنانك-ترأن[م،X]sأنانك-ترأن[V،X]=V{\displaystyle {\begin{cases}\operatorname {sink-tran} [(\lambda N.B)\ Y,X]=\operatorname {sink-test} [(\lambda N.\operatorname {sink-tran} [B])\ \operatorname {sink-tran} [Y],X]\\\operatorname {sink-tran} [\lambda N.B,X]=\lambda N.\operatorname {sink-tran} [B,X]\\\operatorname {sink-tran} [M\ N,X]=\operatorname {sink-tran} [M,X]\ \operatorname {sink-tran} [M,X]\\\operatorname {sink-tran} [V,X]=V\end{cases}}}

غرق التجريد

الغرق هو نقل تجريد لامدا إلى الداخل قدر الإمكان بحيث يظل خارج جميع المراجع إلى المتغير.

التطبيق - 4 حالات.

{هـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]=جي حهـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]=sأنانك-تهـsت[جي sأنانك-تهـsت[(λهـ.ح) Y،X]]هـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]=(sأنانك-تهـsت[(λهـ.جي) Y،X]) حهـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]=(λهـ.جي ح) Y{\displaystyle {\begin{cases}E\not \in \operatorname {FV} [G]\land E\not \in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]=G\ H\\E\not \in \operatorname {FV} [G]\land E\in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]=\operatorname {sink-test} [G\ \operatorname {sink-test} [(\lambda E.H)\ Y,X]]\\E\in \operatorname {FV} [G]\land E\not \in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]=(\operatorname {sink-test} [(\lambda E.G)\ Y,X])\ H\\E\in \operatorname {FV} [G]\land E\in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]=(\lambda E.G\ H)\ Y\end{cases}}}

التجريد . استخدم إعادة التسمية لضمان أن تكون أسماء المتغيرات جميعها مميزة.

Vدبليوحوض[(λV.λدبليو.هـ) Y،X]=λدبليو.sأنانك-تهـsت[(λV.هـ) Y،X]{\displaystyle V\neq W\to \operatorname {sink} [(\lambda V.\lambda W.E)\ Y,X]=\lambda W.\operatorname {sink-test} [(\lambda V.E)\ Y,X]}

المتغير - حالتان.

هـVحوض[(λهـ.V) Y،X]=V{\displaystyle E\neq V\to \operatorname {sink} [(\lambda E.V)\ Y,X]=V}
هـ=Vحوض[(λهـ.V) Y،X]=Y{\displaystyle E=V\to \operatorname {sink} [(\lambda E.V)\ Y,X]=Y}

اختبار الاستبعاد يمنع إسقاط التعبيرات،

LXsأنانك-تهـsت[L،X]=L{\displaystyle L\in X\to \operatorname {sink-test} [L,X]=L}
LXsأنانك-تهـsت[L،X]=حوض[L،X]{\displaystyle L\not \in X\to \operatorname {sink-test} [L,X]=\operatorname {sink} [L,X]}

مثال

مثال على الغرق

على سبيل المثال،

قاعدةتعبير
إلغاء التأجيرsأنانك-ترأن[دهـ-لهـت[يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص]]{\displaystyle \operatorname {sink-tran} [\operatorname {de-let} [\operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p]]}
غرق-نقلsأنانك-ترأن[(λص.(λq.q ص) (λص.λو.(ص و) (ص و))) (λو.λx.و (x x))]{\displaystyle \operatorname {sink-tran} [(\lambda p.(\lambda q.q\ p)\ (\lambda p.\lambda f.(p\ f)\ (p\ f)))\ (\lambda f.\lambda x.f\ (x\ x))]}
طلب
حوض[(λص.حوض[(λq.q ص) (λص.λو.(ص و) (ص و))]) (λو.λx.و (x x))]{\displaystyle \operatorname {sink} [(\lambda p.\operatorname {sink} [(\lambda q.q\ p)\ (\lambda p.\lambda f.(p\ f)\ (p\ f))])\ (\lambda f.\lambda x.f\ (x\ x))]}
حوض[(λq.q ص) (λص.λو.(ص و) (ص و))]{\displaystyle \operatorname {sink} [(\lambda q.q\ p)\ (\lambda p.\lambda f.(p\ f)\ (p\ f))]}
هـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]{\displaystyle E\in \operatorname {FV} [G]\land E\not \in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]}
هـ=q،جي=q،ح=ص،Y=(λص.λو.(ص و) (ص و))،X={}{\displaystyle E=q,G=q,H=p,Y=(\lambda p.\lambda f.(p\ f)\ (p\ f)),X=\{\}}
(حوض[(λهـ.جي) Y،X]) ح{\displaystyle (\operatorname {sink} [(\lambda E.G)\ Y,X])\ H}
(حوض[(λq.q) (λص.λو.(ص و) (ص و))،X]) ص{\displaystyle (\operatorname {sink} [(\lambda q.q)\ (\lambda p.\lambda f.(p\ f)\ (p\ f)),X])\ p}
عامل
حوض[(λص.حوض[(λq.q) (λص.λو.(ص و) (ص و))] ص) (λو.λx.و (x x))]{\displaystyle \operatorname {sink} [(\lambda p.\operatorname {sink} [(\lambda q.q)\ (\lambda p.\lambda f.(p\ f)\ (p\ f))]\ p)\ (\lambda f.\lambda x.f\ (x\ x))]}
حوض[(λq.q) (λص.λو.(ص و) (ص و))]{\displaystyle \operatorname {sink} [(\lambda q.q)\ (\lambda p.\lambda f.(p\ f)\ (p\ f))]}
هـ=Vحوض[(λهـ.V) Y،X]{\displaystyle E=V\to \operatorname {sink} [(\lambda E.V)\ Y,X]}
هـ=q،V=q،Y=(λص.λو.(ص و) (ص و))،X={}{\displaystyle E=q,V=q,Y=(\lambda p.\lambda f.(p\ f)\ (p\ f)),X=\{\}}
Y{\displaystyle Y}
(λص.λو.(ص و) (ص و)){\displaystyle (\lambda p.\lambda f.(p\ f)\ (p\ f))}
طلب
حوض[(λص.(λص.λو.(ص و) (ص و)) ص) (λو.λx.و (x x))]{\displaystyle \operatorname {sink} [(\lambda p.(\lambda p.\lambda f.(p\ f)\ (p\ f))\ p)\ (\lambda f.\lambda x.f\ (x\ x))]}
هـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]{\displaystyle E\not \in \operatorname {FV} [G]\land E\in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]}
هـ=ص،جي=(λص.λو.(ص و) (ص و))،ح=ص،Y=(λو.λx.و (x x)){\displaystyle E=p,G=(\lambda p.\lambda f.(p\ f)\ (p\ f)),H=p,Y=(\lambda f.\lambda x.f\ (x\ x))}
حوض[جي حوض[(λهـ.ح) Y،X]]{\displaystyle \operatorname {sink} [G\ \operatorname {sink} [(\lambda E.H)\ Y,X]]}
عامل
حوض[(λص.λو.(ص و) (ص و)) sأنانك-تهـsت[(λص.ص) (λو.λx.و (x x))،X]]{\displaystyle \operatorname {sink} [(\lambda p.\lambda f.(p\ f)\ (p\ f))\ \operatorname {sink-test} [(\lambda p.p)\ (\lambda f.\lambda x.f\ (x\ x)),X]]}
حوض[(λص.ص) (λو.λx.و (x x))،X]{\displaystyle \operatorname {sink} [(\lambda p.p)\ (\lambda f.\lambda x.f\ (x\ x)),X]}
هـ=Vحوض[(λهـ.V) Y،X]{\displaystyle E=V\to \operatorname {sink} [(\lambda E.V)\ Y,X]}
هـ=ص،V=ص،Y=(λو.λx.و (x x))،X={}{\displaystyle E=p,V=p,Y=(\lambda f.\lambda x.f\ (x\ x)),X=\{\}}
Y{\displaystyle Y}
(λو.λx.و (x x)){\displaystyle (\lambda f.\lambda x.f\ (x\ x))}
التجريد
حوض[(λص.λو.(ص و) (ص و)) (λو.λx.و (x x))]{\displaystyle \operatorname {sink} [(\lambda p.\lambda f.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))]}
Vدبليوحوض[(λV.λدبليو.هـ) Y،X]{\displaystyle V\neq W\to \operatorname {sink} [(\lambda V.\lambda W.E)\ Y,X]}
V=ص،دبليو=و،هـ=(ص و) (ص و)،Y=(λو.λx.و (x x)){\displaystyle V=p,W=f,E=(p\ f)\ (p\ f),Y=(\lambda f.\lambda x.f\ (x\ x))}
λدبليو.حوض[(λV.هـ) Y،X]{\displaystyle \lambda W.\operatorname {sink} [(\lambda V.E)\ Y,X]}
طلب
λو.حوض[(λص.(ص و) (ص و)) (λو.λx.و (x x))،X]{\displaystyle \lambda f.\operatorname {sink} [(\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x)),X]}
حوض[(λص.(ص و) (ص و)) (λو.λx.و (x x))،X]{\displaystyle \operatorname {sink} [(\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x)),X]}
هـFV[جي]هـFV[ح]حوض[(λهـ.جي ح) Y،X]{\displaystyle E\in \operatorname {FV} [G]\land E\in \operatorname {FV} [H]\to \operatorname {sink} [(\lambda E.G\ H)\ Y,X]}
هـ=ص،جي=(ص و)،ح=(ص و)،Y=(λو.λx.و (x x)){\displaystyle E=p,G=(p\ f),H=(p\ f),Y=(\lambda f.\lambda x.f\ (x\ x))}
(λهـ.جي ح) Y{\displaystyle (\lambda E.G\ H)\ Y}
(λص.(ص و) (ص و)) (λو.λx.و (x x)){\displaystyle (\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))}
λو.(λص.(ص و) (ص و)) (λو.λx.و (x x)){\displaystyle \lambda f.(\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))}

إسقاط المعلمات

يُقصد بحذف المعاملات تحسين وظيفة ما بناءً على موقعها داخلها. أما رفع المعاملات (Lambda lift) فيضيف المعاملات الضرورية لنقل الوظيفة خارج سياقها. في عملية الحذف، تُعكس هذه العملية، ويمكن إزالة المعاملات الزائدة التي تحتوي على متغيرات غير مستخدمة.

حذف مُعامل يعني إزالة مُعامل غير ضروري من دالة، حيث يكون المُعامل الفعلي المُمرر هو نفس التعبير دائمًا. يجب أن تكون المتغيرات الحرة للتعبير حرة أيضًا في موضع تعريف الدالة. في هذه الحالة، يُستبدل المُعامل المحذوف بالتعبير الموجود في متن تعريف الدالة، مما يجعله غير ضروري.

على سبيل المثال، لنفترض،

λم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y{\displaystyle \lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y}

في هذا المثال، يكون المعامل الفعلي للمعامل الرسمي o هو p دائمًا . وبما أن p متغير حر في التعبير بأكمله، يمكن حذف هذا المعامل. أما المعامل الفعلي للمعامل الرسمي y فهو n دائمًا . ومع ذلك، فإن n مرتبط في تجريد لامدا، لذا لا يمكن حذف هذا المعامل.

نتيجة حذف المعامل هي،

درoص-صأرأمs-ترأن[λم،ص،q.(λز.λن.ن (ز م ص ن) (ز q ص ن)) λx.λo.λy.o x y{\displaystyle \operatorname {drop-params-tran} [\lambda m,p,q.(\lambda g.\lambda n.n\ (g\ m\ p\ n)\ (g\ q\ p\ n))\ \lambda x.\lambda o.\lambda y.o\ x\ y}
λم،ص،q.(λز.λن.ن (ز م ن) (ز q ن)) λx.λy.ص x y{\displaystyle \equiv \lambda m,p,q.(\lambda g.\lambda n.n\ (g\ m\ n)\ (g\ q\ n))\ \lambda x.\lambda y.p\ x\ y}

على سبيل المثال الرئيسي،

درoص-صأرأمs-ترأن[λو.(λص.(ص و) (ص و)) (λو.λx.و (x x))]{\displaystyle \operatorname {drop-params-tran} [\lambda f.(\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))]}
λو.(λص.ص ص) (λx.و (x x)){\displaystyle \equiv \lambda f.(\lambda p.p\ p)\ (\lambda x.f\ (x\ x))}

تعريف drop-params-tran هو،

درoص-صأرأمs-ترأن[L](درoص-صأرأمs[L،د،FV[L]،[]]){\displaystyle \operatorname {drop-params-tran} [L]\equiv (\operatorname {drop-params} [L,D,FV[L],[]])}

أين،

بuأنالد-صأرأم-لأناsت[L،د،V،_]{\displaystyle \operatorname {build-param-list} [L,D,V,\_]}

إنشاء قوائم المعلمات

لكل تجريد يُعرّف دالة، قم بإنشاء المعلومات اللازمة لاتخاذ قرارات بشأن حذف الأسماء. تصف هذه المعلومات كل مُعامل؛ اسم المُعامل، والتعبير عن القيمة الفعلية، وإشارة إلى أن جميع التعبيرات لها نفس القيمة.

على سبيل المثال، في

λم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y{\displaystyle \lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y}

معاملات الدالة g هي:

المعامل الرسميجميعها لها نفس القيمةالتعبير الفعلي للمعامل
xخطأ شنيع_
oحقيقيص
yحقيقين

يُعاد تسمية كل تجريد باسم فريد، وتُربط قائمة المعاملات باسم التجريد. على سبيل المثال، g لها قائمة معاملات.

د[ز]=[[x،خطأ شنيع،_]،[o،_،ص]،[y،_،ن]]{\displaystyle D[g]=[[x,\operatorname {false} ,\_],[o,\_,p],[y,\_,n]]}

تقوم الدالة build-param-lists بإنشاء جميع القوائم الخاصة بتعبير معين، وذلك من خلال المرور على التعبير. ولها أربعة معلمات؛

  • التعبير اللامدا قيد التحليل.
  • قائمة معلمات الجدول للأسماء.
  • جدول قيم المعلمات.
  • قائمة المعلمات المُعادة، والتي تُستخدم داخليًا بواسطة

التجريد - تعبير لامدا من الشكل(λشمال.S) L{\displaystyle (\lambda N.S)\ L}يتم تحليلها لاستخراج أسماء معلمات الدالة.

{بuأنالد-صأرأم-لأناsتs[(λشمال.S) L،د،V،R]بuأنالد-صأرأم-لأناsتs[S،د،V،R]بuأنالد-لأناsت[L،د،V،د[شمال]]بuأنالد-صأرأم-لأناsتs[λشمال.S،د،V،R]بuأنالد-صأرأم-لأناsتs[S،د،V،R]{\displaystyle {\begin{cases}\operatorname {build-param-lists} [(\lambda N.S)\ L,D,V,R]\equiv \operatorname {build-param-lists} [S,D,V,R]\land \operatorname {build-list} [L,D,V,D[N]]\\\operatorname {build-param-lists} [\lambda N.S,D,V,R]\equiv \operatorname {build-param-lists} [S,D,V,R]\end{cases}}}

حدد الاسم وابدأ في إنشاء قائمة المعاملات الخاصة به، مع ملء أسماء المعاملات الرسمية. استقبل أيضًا أي قائمة معاملات فعلية من نص التعبير، وأرجعها كقائمة المعاملات الفعلية لهذا التعبير.

{بuأنالد-لأناsت[λP.ب،د،V،[X،_،_]::L]بuأنالد-لأناsت[ب،د،V،L]بuأنالد-لأناsت[ب،د،V،[]]بuأنالد-صأرأم-لأناsتs[ب،د،V،_]{\displaystyle {\begin{cases}\operatorname {build-list} [\lambda P.B,D,V,[X,\_,\_]::L]\equiv \operatorname {build-list} [B,D,V,L]\\\operatorname {build-list} [B,D,V,[]]\equiv \operatorname {build-param-lists} [B,D,V,\_]\end{cases}}}

المتغير - استدعاء لدالة.

بuأنالد-صأرأم-لأناsتs[شمال،د،V،د[شمال]]{\displaystyle \operatorname {build-param-lists} [N,D,V,D[N]]}

بالنسبة لاسم دالة أو معلمة، ابدأ بتعبئة قائمة المعلمات الفعلية عن طريق إخراج قائمة المعلمات لهذا الاسم.

التطبيق - تتم معالجة التطبيق (استدعاء الدالة) لاستخراج تفاصيل المعلمات الفعلية.

بuأنالد-صأرأم-لأناsتs[هـ P،د،V،R]بuأنالد-صأرأم-لأناsتs[هـ،د،V،تي]بuأنالد-صأرأم-لأناsتs[P،د،V،ك]{\displaystyle \operatorname {build-param-lists} [E\ P,D,V,R]\equiv \operatorname {build-param-lists} [E,D,V,T]\land \operatorname {build-param-lists} [P,D,V,K]}
تي=[F،S،أ]::R(S(مساواة[أ،P]V[F]=أ))د[F]=ك{\displaystyle \land T=[F,S,A]::R\land (S\implies (\operatorname {equate} [A,P]\land V[F]=A))\land D[F]=K}

استرجع قوائم المعاملات الخاصة بالتعبير، والمعامل نفسه. استرجع سجل المعامل من قائمة المعاملات الخاصة بالتعبير، وتحقق من تطابق قيمة المعامل الحالية مع هذا المعامل. سجّل قيمة اسم المعامل لاستخدامها لاحقًا في عملية التحقق.

{مساواة[أ،شمال]أ=شمال(تعريف[V[شمال]]أ=V[شمال])لو شمال هو متغير.مساواة[أ،هـ]أ=هـخلاف ذلك.{\displaystyle {\begin{cases}\operatorname {equate} [A,N]\equiv A=N\lor (\operatorname {def} [V[N]]\land A=V[N])&{\text{if }}N{\text{ is a variable.}}\\\operatorname {equate} [A,E]\equiv A=E&{\text{otherwise.}}\end{cases}}}

المنطق المذكور أعلاه دقيقٌ للغاية في طريقة عمله. لا يتم تعيين مؤشر القيمة نفسه إلى "صحيح" مطلقًا، وإنما إلى "خطأ" فقط في حال تعذّر مطابقة جميع القيم. تُسترجع القيمة باستخدام S لإنشاء مجموعة من القيم المنطقية المسموح بها لـ S. إذا كانت القيمة "صحيح" ضمن هذه المجموعة، فإن جميع قيم هذا المعامل متساوية، ويمكن حذف المعامل.

بسأل[S]S{X:X=S}{\displaystyle \operatorname {ask} [S]\equiv S\in \{X:X=S\}}

وبالمثل، تستخدم الدالة def نظرية المجموعات للاستعلام عما إذا تم إعطاء قيمة لمتغير ما؛

تعريف[F]|{X:X=F}|{\displaystyle \operatorname {def} [F]\equiv |\{X:X=F\}|}

ليكن - تعبير ليكن.

بuأنالد-صأرأم-لأناsت[يتركV:هـفيL،د،V،_]بuأنالد-صأرأم-لأناsت[هـ،د،V،_]بuأنالد-صأرأم-لأناsت[L،د،V،_]{\displaystyle \operatorname {build-param-list} [\operatorname {let} V:E\operatorname {in} L,D,V,\_]\equiv \operatorname {build-param-list} [E,D,V,\_]\land \operatorname {build-param-list} [L,D,V,\_]}

و - للاستخدام في "let".

بuأنالد-صأرأم-لأناsتs[هـF،د،V،_]بuأنالد-صأرأم-لأناsتs[هـ،د،V،_]بuأنالد-صأرأم-لأناsتs[F،د،V،_]{\displaystyle \operatorname {build-param-lists} [E\land F,D,V,\_]\equiv \operatorname {build-param-lists} [E,D,V,\_]\land \operatorname {build-param-lists} [F,D,V,\_]}
أمثلة

على سبيل المثال، بناء قوائم المعلمات لـ،

λم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y{\displaystyle \lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y}

يعطي،

د[ز]=[[x،خطأ شنيع،_]،[o،حقيقي،ص]،[y،حقيقي،ن]]{\displaystyle D[g]=[[x,\operatorname {false} ,\_],[o,\operatorname {true} ,p],[y,\operatorname {true} ,n]]}

ويتم حذف المعامل o للحصول على،

λم،ص،q.(λز.λن.(ن (ز م ن) (ز q ن))) λx.λy.ص x y{\displaystyle \lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ n)\ (g\ q\ n)))\ \lambda x.\lambda y.p\ x\ y}
إنشاء قائمة المعلمات لـλم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y{\displaystyle \lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y}
مثال على قائمة معلمات البناء
بuأنالد-صأرأم-لأناsت[λم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y،د،V،_]{\displaystyle \operatorname {build-param-list} [\lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y,D,V,\_]}
قاعدةتعبير
التجريدبuأنالد-صأرأم-لأناsت[λم،ص،q.(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y،د،V،_]{\displaystyle \operatorname {build-param-list} [\lambda m,p,q.(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y,D,V,\_]}
التجريدبuأنالد-صأرأم-لأناsت[(λز.λن.(ن (ز م ص ن) (ز q ص ن))) λx.λo.λy.o x y،د،V،_]{\displaystyle \operatorname {build-param-list} [(\lambda g.\lambda n.(n\ (g\ m\ p\ n)\ (g\ q\ p\ n)))\ \lambda x.\lambda o.\lambda y.o\ x\ y,D,V,\_]}
بuأنالد-صأرأم-لأناsتs[ن (ز م ص ن) (ز q ص ن)،د،V،R]بuأنالد-لأناsت[λx.λo.λy.o x y،د،V،د[ز]]{\displaystyle \operatorname {build-param-lists} [n\ (g\ m\ p\ n)\ (g\ q\ p\ n),D,V,R]\land \operatorname {build-list} [\lambda x.\lambda o.\lambda y.o\ x\ y,D,V,D[g]]}
بuأنالد-لأناsت[λx.λo.λy.o x y،د،V،د[ز]]{\displaystyle \operatorname {build-list} [\lambda x.\lambda o.\lambda y.o\ x\ y,D,V,D[g]]}
قاعدةتعبير
أضف معلمة

بuأنالد-لأناsت[λx.λo.λy.o x y،د،V،د[ز]]د[ز]=L1{\displaystyle \operatorname {build-list} [\lambda x.\lambda o.\lambda y.o\ x\ y,D,V,D[g]]\land D[g]=L_{1}}

أضف معلمة

بuأنالد-لأناsت[λo.λy.o x y،د،V،L1]د[ز]=[x،_،_]::L1{\displaystyle \operatorname {build-list} [\lambda o.\lambda y.o\ x\ y,D,V,L_{1}]\land D[g]=[x,\_,\_]::L_{1}}

أضف معلمة

بuأنالد-لأناsت[λy.o x y،د،V،L2]د[ز]=[x،_،_]::[o،_،_]::L2{\displaystyle \operatorname {build-list} [\lambda y.o\ x\ y,D,V,L_{2}]\land D[g]=[x,\_,\_]::[o,\_,\_]::L_{2}}

إندريبuأنالد-لأناsت[o x y،د،V،L3]د[ز]=[x،_،_]::[o،_،_]::[y،_،_]::L3{\displaystyle \operatorname {build-list} [o\ x\ y,D,V,L_{3}]\land D[g]=[x,\_,\_]::[o,\_,\_]::[y,\_,\_]::L_{3}}
بuأنالد-صأرأم-لأناsتs[o x y،د،V،[]]د[ز]=[x،_،_]::[o،_،_]::[y،_،_]::[]{\displaystyle \operatorname {build-param-lists} [o\ x\ y,D,V,[]]\land D[g]=[x,\_,\_]::[o,\_,\_]::[y,\_,\_]::[]}
بuأنالد-صأرأم-لأناsتs[ن (ز م ص ن) (ز q ص ن)،د،V،R]{\displaystyle \operatorname {build-param-lists} [n\ (g\ m\ p\ n)\ (g\ q\ p\ n),D,V,R]}
قاعدةتعبير
طلببuأنالد-صأرأم-لأناsتs[ن (ز م ص ن) (ز q ص ن)،د،V،R]{\displaystyle \operatorname {build-param-lists} [n\ (g\ m\ p\ n)\ (g\ q\ p\ n),D,V,R]}
طلب

بuأنالد-صأرأم-لأناsتs[ن (ز م ص ن)،د،V،تي1]بuأنالد-صأرأم-لأناsتs[ز q ص ن،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [n\ (g\ m\ p\ n),D,V,T_{1}]\land \operatorname {build-param-lists} [g\ q\ p\ n,D,V,K_{1}]}

((تي1=[F1،S1،أ1]::R{\displaystyle \land ((T_{1}=[F_{1},S_{1},A_{1}]::R}
(S1(مساواة[أ1،ز q ص ن]V[F1]=ز q ص ن))د[F1]=ك1){\displaystyle \land (S_{1}\implies (\operatorname {equate} [A_{1},g\ q\ p\ n]\land V[F_{1}]=g\ q\ p\ n))\land D[F_{1}]=K_{1})}
عامل

بuأنالد-صأرأم-لأناsتs[ن،د،V،تي2]بuأنالد-صأرأم-لأناsتs[ز م ص ن،د،V،ك2]بuأنالد-صأرأم-لأناsتs[ز q ص ن،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [n,D,V,T_{2}]\land \operatorname {build-param-lists} [g\ m\ p\ n,D,V,K_{2}]\land \operatorname {build-param-lists} [g\ q\ p\ n,D,V,K_{1}]}

((تي2=[F2،S2،أ2]::[F1،S1،أ1]::R{\displaystyle \land ((T_{2}=[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::R}
(S1(مساواة[أ1،ز q ص ن]V[F1]=ز q ص ن))د[F1]=ك1){\displaystyle \land (S_{1}\implies (\operatorname {equate} [A_{1},g\ q\ p\ n]\land V[F_{1}]=g\ q\ p\ n))\land D[F_{1}]=K_{1})}
(S2(مساواة[أ2،ز م ص ن]V[F2]=ز م ص ن))د[F2]=ك2){\displaystyle \land (S_{2}\implies (\operatorname {equate} [A_{2},g\ m\ p\ n]\land V[F_{2}]=g\ m\ p\ n))\land D[F_{2}]=K_{2})}
عامل

بuأنالد-صأرأم-لأناsتs[ز م ص ن،د،V،ك2]بuأنالد-صأرأم-لأناsتs[ز q ص ن،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [g\ m\ p\ n,D,V,K_{2}]\land \operatorname {build-param-lists} [g\ q\ p\ n,D,V,K_{1}]}

((د[ن]=[F2،S2،أ2]::[F1،S1،أ1]::R{\displaystyle \land ((D[n]=[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::R}
(S1(مساواة[أ1،ز q ص ن]V[F1]=ز q ص ن))د[F1]=ك1){\displaystyle \land (S_{1}\implies (\operatorname {equate} [A_{1},g\ q\ p\ n]\land V[F_{1}]=g\ q\ p\ n))\land D[F_{1}]=K_{1})}
(S2(مساواة[أ2،ز م ص ن]V[F2]=ز م ص ن))د[F2]=ك2){\displaystyle \land (S_{2}\implies (\operatorname {equate} [A_{2},g\ m\ p\ n]\land V[F_{2}]=g\ m\ p\ n))\land D[F_{2}]=K_{2})}

يعطي،

د[ن]=[_،_،ز م ص ن]::[_،_،ز q ص ن]::R{\displaystyle D[n]=[\_,\_,g\ m\ p\ n]::[\_,\_,g\ q\ p\ n]::R}
بuأنالد-صأرأم-لأناsتs[ز م ص ن،د،V،ك2]{\displaystyle \operatorname {build-param-lists} [g\ m\ p\ n,D,V,K_{2}]}
قاعدةتعبير
طلب

بuأنالد-صأرأم-لأناsتs[ز م ص ن،د،V،ك2]{\displaystyle \operatorname {build-param-lists} [g\ m\ p\ n,D,V,K_{2}]}

بuأنالد-صأرأم-لأناsتs[ز م ص،د،V،تي3]بuأنالد-صأرأم-لأناsتs[ن،د،V،ك3]{\displaystyle \operatorname {build-param-lists} [g\ m\ p,D,V,T_{3}]\land \operatorname {build-param-lists} [n,D,V,K_{3}]}

((تي3=[F3،S3،أ3]::ك2{\displaystyle \land ((T_{3}=[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،ن]V[F3]=ن))د[F3]=د[ن]){\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},n]\land V[F_{3}]=n))\land D[F_{3}]=D[n])}
التطبيق، متغير

بuأنالد-صأرأم-لأناsتs[ز م،د،V،تي4]بuأنالد-صأرأم-لأناsتs[ص،د،V،ك4]{\displaystyle \operatorname {build-param-lists} [g\ m,D,V,T_{4}]\land \operatorname {build-param-lists} [p,D,V,K_{4}]}

تي4=[_،S4،أ4]::[_،S3،أ3]::ك2{\displaystyle \land T_{4}=[\_,S_{4},A_{4}]::[\_,S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،ن]V[F3]=ن))د[F3]=د[ن]){\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},n]\land V[F_{3}]=n))\land D[F_{3}]=D[n])}
(S4(مساواة[أ4،ص]V[F4]=ص))د[F4]=د[ص]{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[F_{4}]=p))\land D[F_{4}]=D[p]}
التطبيق، متغير

بuأنالد-صأرأم-لأناsتs[ز،د،V،تي5]بuأنالد-صأرأم-لأناsتs[م،د،V،ك5]{\displaystyle \operatorname {build-param-lists} [g,D,V,T_{5}]\land \operatorname {build-param-lists} [m,D,V,K_{5}]}

تي5=[F5،S5،أ5]::[F4،S4،أ4]::[F3،S3،أ3]::ك2{\displaystyle \land T_{5}=[F_{5},S_{5},A_{5}]::[F_{4},S_{4},A_{4}]::[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،ن]V[F3]=ن))د[F3]=د[ن]){\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},n]\land V[F_{3}]=n))\land D[F_{3}]=D[n])}
(S4(مساواة[أ4،ص]V[F4]=ص))د[F4]=د[ص]{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[F_{4}]=p))\land D[F_{4}]=D[p]}
(S5(مساواة[أ5،م]V[F5]=م))د[F5]=د[م]{\displaystyle \land (S_{5}\implies (\operatorname {equate} [A_{5},m]\land V[F_{5}]=m))\land D[F_{5}]=D[m]}
عامل

د[ز]=[x،S5،أ5]::[o،S4،أ4]::[y،S3،أ3]::ك2{\displaystyle D[g]=[x,S_{5},A_{5}]::[o,S_{4},A_{4}]::[y,S_{3},A_{3}]::K_{2}}

(S3(مساواة[أ3،ن]V[y]=ن))د[y]=د[ن]){\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},n]\land V[y]=n))\land D[y]=D[n])}
(S4(مساواة[أ4،ص]V[o]=ص))د[o]=د[ص]{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[o]=p))\land D[o]=D[p]}
(S5(مساواة[أ5،م]V[x]=م))د[x]=د[م]{\displaystyle \land (S_{5}\implies (\operatorname {equate} [A_{5},m]\land V[x]=m))\land D[x]=D[m]}
بuأنالد-صأرأم-لأناsتs[ز q ص ن،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [g\ q\ p\ n,D,V,K_{1}]}
قاعدةتعبير
طلب

بuأنالد-صأرأم-لأناsتs[ز q ص ن،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [g\ q\ p\ n,D,V,K_{1}]}

بuأنالد-صأرأم-لأناsتs[ز q ص،د،V،تي6]بuأنالد-صأرأم-لأناsتs[ن،د،V،ك6]{\displaystyle \operatorname {build-param-lists} [g\ q\ p,D,V,T_{6}]\land \operatorname {build-param-lists} [n,D,V,K_{6}]}

((تي6=[F6،S6،أ6]::ك1{\displaystyle \land ((T_{6}=[F_{6},S_{6},A_{6}]::K_{1}}
(S6(مساواة[أ6،ن]V[F6]=ن))د[F6]=د[ن]){\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},n]\land V[F_{6}]=n))\land D[F_{6}]=D[n])}
التطبيق، متغير

بuأنالد-صأرأم-لأناsتs[ز q،د،V،تي7]بuأنالد-صأرأم-لأناsتs[ص،د،V،ك7]{\displaystyle \operatorname {build-param-lists} [g\ q,D,V,T_{7}]\land \operatorname {build-param-lists} [p,D,V,K_{7}]}

تي7=[_،S7،أ7]::[_،S6،أ6]::ك1{\displaystyle \land T_{7}=[\_,S_{7},A_{7}]::[\_,S_{6},A_{6}]::K_{1}}
(S6(مساواة[أ6،ن]V[F6]=ن))د[F6]=د[ن]){\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},n]\land V[F_{6}]=n))\land D[F_{6}]=D[n])}
(S7(مساواة[أ7،ص]V[F7]=ص))د[F7]=د[ص]{\displaystyle \land (S_{7}\implies (\operatorname {equate} [A_{7},p]\land V[F_{7}]=p))\land D[F_{7}]=D[p]}
التطبيق، متغير

بuأنالد-صأرأم-لأناsتs[ز،د،V،تي8]بuأنالد-صأرأم-لأناsتs[م،د،V،ك8]{\displaystyle \operatorname {build-param-lists} [g,D,V,T_{8}]\land \operatorname {build-param-lists} [m,D,V,K_{8}]}

تي8=[F8،S8،أ8]::[F7،S7،أ7]::[F6،S6،أ6]::ك1{\displaystyle \land T_{8}=[F_{8},S_{8},A_{8}]::[F_{7},S_{7},A_{7}]::[F_{6},S_{6},A_{6}]::K_{1}}
(S6(مساواة[أ6،ن]V[F6]=ن))د[F6]=د[ن]){\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},n]\land V[F_{6}]=n))\land D[F_{6}]=D[n])}
(S7(مساواة[أ7،ص]V[F7]=ص))د[F7]=د[ص]{\displaystyle \land (S_{7}\implies (\operatorname {equate} [A_{7},p]\land V[F_{7}]=p))\land D[F_{7}]=D[p]}
(S8(مساواة[أ8،q]V[F8]=q))د[F8]=د[q]{\displaystyle \land (S_{8}\implies (\operatorname {equate} [A_{8},q]\land V[F_{8}]=q))\land D[F_{8}]=D[q]}
عامل

د[ز]=[x،S8،أ8]::[o،S6،أ7]::[y،S6،أ6]::ك1{\displaystyle D[g]=[x,S_{8},A_{8}]::[o,S_{6},A_{7}]::[y,S_{6},A_{6}]::K_{1}}

(S6(مساواة[أ6،ن]V[y]=ن))د[y]=د[ن]){\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},n]\land V[y]=n))\land D[y]=D[n])}
(S7(مساواة[أ7،ص]V[o]=ص))د[o]=د[ص]{\displaystyle \land (S_{7}\implies (\operatorname {equate} [A_{7},p]\land V[o]=p))\land D[o]=D[p]}
(S8(مساواة[أ8،q]V[x]=q))د[x]=د[q]{\displaystyle \land (S_{8}\implies (\operatorname {equate} [A_{8},q]\land V[x]=q))\land D[x]=D[q]}

بما أنه لا توجد تعريفات لـ،V[ن]،V[ص]،V[q]،V[م]{\displaystyle V[n],V[p],V[q],V[m]}ويمكن تبسيط المعادلة إلى:

مساواة[أ،شمال]أ=شمال(تعريف[V[شمال]]أ=V[شمال])أ=شمال{\displaystyle \operatorname {equate} [A,N]\equiv A=N\lor (\operatorname {def} [V[N]]\land A=V[N])\equiv A=N}

بإزالة التعبيرات غير الضرورية، د[ز]=[x،S5،أ5]::[o،S4،أ4]::[y،S3،أ3]::ك2{\displaystyle D[g]=[x,S_{5},A_{5}]::[o,S_{4},A_{4}]::[y,S_{3},A_{3}]::K_{2}}

S3أ3=ن{\displaystyle \land S_{3}\implies A_{3}=n}
S4أ4=ص{\displaystyle \land S_{4}\implies A_{4}=p}
S5أ5=م{\displaystyle \land S_{5}\implies A_{5}=m}

د[ز]=[x،S8،أ8]::[o،S6،أ7]::[y،S6،أ6]::ك1{\displaystyle D[g]=[x,S_{8},A_{8}]::[o,S_{6},A_{7}]::[y,S_{6},A_{6}]::K_{1}}

S6أ6=ن{\displaystyle \land S_{6}\implies A_{6}=n}
S7أ7=ص{\displaystyle \land S_{7}\implies A_{7}=p}
S8أ8=q{\displaystyle \land S_{8}\implies A_{8}=q}

بمقارنة التعبيرين لـد[ز]{\displaystyle D[g]}، يحصل،

S5=S8،أ5=أ8،S4=S7،أ4=أ7،S3=S6،أ3=أ6{\displaystyle S_{5}=S_{8},A_{5}=A_{8},S_{4}=S_{7},A_{4}=A_{7},S_{3}=S_{6},A_{3}=A_{6}}

لوS3{\displaystyle S_{3}}صحيح؛

ن=أ3=أ6=ن{\displaystyle n=A_{3}=A_{6}=n}

لوS3{\displaystyle S_{3}}إذا كان هذا غير صحيح، فلا يوجد أي دلالة.S3=_{\displaystyle S_{3}=\_}وهذا يعني أنه قد يكون صحيحاً أو خاطئاً.

لوS4{\displaystyle S_{4}}صحيح؛

ص=أ4=أ7=ص{\displaystyle p=A_{4}=A_{7}=p}

لوS5{\displaystyle S_{5}}صحيح؛

م=أ5=أ8=q{\displaystyle m=A_{5}=A_{8}=q}

لذاS5{\displaystyle S_{5}}هذا غير صحيح.

والنتيجة هي، د[ز]=[x،خطأ شنيع،_]::[o،_،ص]::[y،_،ن]::_{\displaystyle D[g]=[x,\operatorname {false} ,\_]::[o,\_,p]::[y,\_,n]::\_}

بuأنالد-صأرأم-لأناsتs[o x y،د،V،L]{\displaystyle \operatorname {build-param-lists} [o\ x\ y,D,V,L]}
قاعدةتعبير
طلببuأنالد-صأرأم-لأناsتs[o x y،د،V،L]{\displaystyle \operatorname {build-param-lists} [o\ x\ y,D,V,L]}
طلب

بuأنالد-صأرأم-لأناsتs[o x،د،V،تي9]بuأنالد-صأرأم-لأناsتs[y،د،V،ك9]{\displaystyle \operatorname {build-param-lists} [o\ x,D,V,T_{9}]\land \operatorname {build-param-lists} [y,D,V,K_{9}]}

تي9=[F9،S9،أ9]::L{\displaystyle \land T_{9}=[F_{9},S_{9},A_{9}]::L}
(S9(مساواة[أ9،y]V[F9]=أ9)ك9=د[F9]{\displaystyle \land (S_{9}\implies (\operatorname {equate} [A_{9},y]\land V[F_{9}]=A_{9})\land K_{9}=D[F_{9}]}
عامل

بuأنالد-صأرأم-لأناsتs[o،د،V،تي10]بuأنالد-صأرأم-لأناsتs[x،د،V،ك10]بuأنالد-صأرأم-لأناsتs[y،د،V،ك10]{\displaystyle \operatorname {build-param-lists} [o,D,V,T_{10}]\land \operatorname {build-param-lists} [x,D,V,K_{10}]\land \operatorname {build-param-lists} [y,D,V,K_{10}]}

تي10=[F10،S10،أ10]::[F9،S9،أ9]::L{\displaystyle \land T_{10}=[F_{10},S_{10},A_{10}]::[F_{9},S_{9},A_{9}]::L}
(S9(مساواة[أ9،y]V[F9]=أ9)ك9=د[F9]{\displaystyle \land (S_{9}\implies (\operatorname {equate} [A_{9},y]\land V[F_{9}]=A_{9})\land K_{9}=D[F_{9}]}
(S10(مساواة[أ10،y]V[F10]=أ10)ك10=د[F10]{\displaystyle \land (S_{10}\implies (\operatorname {equate} [A_{10},y]\land V[F_{10}]=A_{10})\land K_{10}=D[F_{10}]}
د[o]=[F10،S10،أ10]::[F9،S9،أ9]::L{\displaystyle \land D[o]=[F_{10},S_{10},A_{10}]::[F_{9},S_{9},A_{9}]::L}
(S9(مساواة[أ9،y]V[F9]=أ9)ك9=د[F9]{\displaystyle \land (S_{9}\implies (\operatorname {equate} [A_{9},y]\land V[F_{9}]=A_{9})\land K_{9}=D[F_{9}]}
(S10(مساواة[أ10،y]V[F10]=أ10)ك10=د[F10]{\displaystyle \land (S_{10}\implies (\operatorname {equate} [A_{10},y]\land V[F_{10}]=A_{10})\land K_{10}=D[F_{10}]}

وباستخدام حجج مماثلة لتلك المستخدمة أعلاه، نحصل على:

د[o]=[_،_،x]::[_،_،y]::_{\displaystyle D[o]=[\_,\_,x]::[\_,\_,y]::\_}

ومن السابق،

د[ز]=[[x،خطأ شنيع،_]،[o،حقيقي،ص]،[y،حقيقي،ن]]{\displaystyle D[g]=[[x,\operatorname {false} ,\_],[o,\operatorname {true} ,p],[y,\operatorname {true} ,n]]}
د[ن]=[[_،_،(ز م ص ن)]،[_،_،(ز q ص ن)]]{\displaystyle D[n]=[[\_,\_,(g\ m\ p\ n)],[\_,\_,(g\ q\ p\ n)]]}
د[م]=_{\displaystyle D[m]=\_}
د[ص]=_{\displaystyle D[p]=\_}
د[q]=_{\displaystyle D[q]=\_}

مثال آخر هو،

λو.((λص.و (ص ص و)) (λq.λx.x (q q x)){\displaystyle \lambda f.((\lambda p.f\ (p\ p\ f))\ (\lambda q.\lambda x.x\ (q\ q\ x))}

هنا، x تساوي f. ويكون تعيين قائمة المعاملات كما يلي:

د[ص]=[[q،_،ص]،[x،_،و]]{\displaystyle D[p]=[[q,\_,p],[x,\_,f]]}

ويتم حذف المعامل x للحصول على،

λو.((λq.و (q q)) (λq.و (q q)){\displaystyle \lambda f.((\lambda q.f\ (q\ q))\ (\lambda q.f\ (q\ q))}
إنشاء قائمة المعلمات لـλو.((λص.و (ص ص و)) (λq.λx.x (q q x)){\displaystyle \lambda f.((\lambda p.f\ (p\ p\ f))\ (\lambda q.\lambda x.x\ (q\ q\ x))}

يتم استخدام المنطق الموجود في برنامج equate في هذا المثال الأكثر صعوبة.

بuأنالد-صأرأم-لأناsت[λو.((λص.و (ص ص و)) (λq.λx.x (q q x))،د،V،_]{\displaystyle \operatorname {build-param-list} [\lambda f.((\lambda p.f\ (p\ p\ f))\ (\lambda q.\lambda x.x\ (q\ q\ x)),D,V,\_]}
قاعدةتعبير
التجريدبuأنالد-صأرأم-لأناsت[λو.((λص.و (ص ص و)) (λq.λx.x (q q x))،د،V،_]{\displaystyle \operatorname {build-param-list} [\lambda f.((\lambda p.f\ (p\ p\ f))\ (\lambda q.\lambda x.x\ (q\ q\ x)),D,V,\_]}
التجريدبuأنالد-صأرأم-لأناsت[(λص.و (ص ص و)) (λq.λx.x (q q x))،د،V،_]{\displaystyle \operatorname {build-param-list} [(\lambda p.f\ (p\ p\ f))\ (\lambda q.\lambda x.x\ (q\ q\ x)),D,V,\_]}
بuأنالد-صأرأم-لأناsتs[و (ص ص و)،د،_]بuأنالد-لأناsت[λq.λx.x (q q x)،د،د[ص]]{\displaystyle \operatorname {build-param-lists} [f\ (p\ p\ f),D,\_]\land \operatorname {build-list} [\lambda q.\lambda x.x\ (q\ q\ x),D,D[p]]}
بuأنالد-صأرأم-لأناsتs[و (ص ص و)،د،_]بuأنالد-لأناsت[λq.λx.x (q q x)،د،د[ص]]{\displaystyle \operatorname {build-param-lists} [f\ (p\ p\ f),D,\_]\land \operatorname {build-list} [\lambda q.\lambda x.x\ (q\ q\ x),D,D[p]]}
بuأنالد-لأناsت[λq.λx.x (q q x)،د،د[ص]]{\displaystyle \operatorname {build-list} [\lambda q.\lambda x.x\ (q\ q\ x),D,D[p]]}
قاعدةتعبير
أضف معلمةبuأنالد-لأناsت[λq.λx.x (q q x)،د،د[ص]]د[ص]=L1{\displaystyle \operatorname {build-list} [\lambda q.\lambda x.x\ (q\ q\ x),D,D[p]]\land D[p]=L_{1}}
أضف معلمةبuأنالد-لأناsت[λx.x (q q x)،د،L2]د[ص]=[q،_،_]::L2{\displaystyle \operatorname {build-list} [\lambda x.x\ (q\ q\ x),D,L_{2}]\land D[p]=[q,\_,\_]::L_{2}}
إندريبuأنالد-لأناsت[x (q q x)،د،L3]د[ص]=[q،_،_]::[x،_،_]::L3{\displaystyle \operatorname {build-list} [x\ (q\ q\ x),D,L_{3}]\land D[p]=[q,\_,\_]::[x,\_,\_]::L_{3}}
بuأنالد-صأرأم-لأناsتs[x (q q x)،د،[]]د[ص]=[q،_،_]::[x،_،_]::[]{\displaystyle \operatorname {build-param-lists} [x\ (q\ q\ x),D,[]]\land D[p]=[q,\_,\_]::[x,\_,\_]::[]}
بuأنالد-صأرأم-لأناsتs[λص.و (ص ص و)،د،V،تي1]{\displaystyle \operatorname {build-param-lists} [\lambda p.f\ (p\ p\ f),D,V,T_{1}]}
قاعدةتعبير
التجريدبuأنالد-صأرأم-لأناsتs[λص.و (ص ص و)،د،V،تي1]{\displaystyle \operatorname {build-param-lists} [\lambda p.f\ (p\ p\ f),D,V,T_{1}]}
طلببuأنالد-صأرأم-لأناsتs[و (ص ص و)،د،V،تي1]{\displaystyle \operatorname {build-param-lists} [f\ (p\ p\ f),D,V,T_{1}]}
اسمبuأنالد-صأرأم-لأناsتs[و،د،V،تي2]بuأنالد-صأرأم-لأناsتs[ص ص و،د،V،ك2]{\displaystyle \operatorname {build-param-lists} [f,D,V,T_{2}]\land \operatorname {build-param-lists} [p\ p\ f,D,V,K_{2}]}
تي2=[F2،S2،أ2]::[F1،S1،أ1]::_{\displaystyle \land T_{2}=[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_}
(S2(مساواة[أ2،ص ص و]V[F2]=أ2))د[F2]=ك2{\displaystyle \land (S_{2}\implies (\operatorname {equate} [A_{2},p\ p\ f]\land V[F_{2}]=A_{2}))\land D[F_{2}]=K_{2}}
اسمبuأنالد-صأرأم-لأناsتs[ص ص و،د،V،ك2]{\displaystyle \operatorname {build-param-lists} [p\ p\ f,D,V,K_{2}]}

د[و]=[F2،S2،أ2]::[F1،S1،أ1]::_{\displaystyle \land D[f]=[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_}

(S2(مساواة[أ2،ص ص و]V[F2]=أ2))د[F2]=ك2{\displaystyle \land (S_{2}\implies (\operatorname {equate} [A_{2},p\ p\ f]\land V[F_{2}]=A_{2}))\land D[F_{2}]=K_{2}}
اسمبuأنالد-صأرأم-لأناsتs[ص ص،د،V،تي3]بuأنالد-صأرأم-لأناsتs[و،د،V،ك3]{\displaystyle \operatorname {build-param-lists} [p\ p,D,V,T_{3}]\land \operatorname {build-param-lists} [f,D,V,K_{3}]}
تي3=[F3،S3،أ3]::ك2{\displaystyle \land T_{3}=[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،و]V[F3]=أ3))د[F3]=ك3{\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[F_{3}]=A_{3}))\land D[F_{3}]=K_{3}}
طلببuأنالد-صأرأم-لأناsتs[ص ص،د،V،تي3]{\displaystyle \operatorname {build-param-lists} [p\ p,D,V,T_{3}]}
تي3=[F3،S3،أ3]::ك2{\displaystyle \land T_{3}=[F_{3},S_{3},A_{3}]::K_{2}}
(S2(مساواة[أ2،ص ص و]V[F2]=أ2))د[F2]=ك2{\displaystyle \land (S_{2}\implies (\operatorname {equate} [A_{2},p\ p\ f]\land V[F_{2}]=A_{2}))\land D[F_{2}]=K_{2}}
(S3(مساواة[أ3،و]V[F3]=أ3))د[F3]=د[و]{\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[F_{3}]=A_{3}))\land D[F_{3}]=D[f]}
اسمبuأنالد-صأرأم-لأناsتs[ص،د،V،تي4]بuأنالد-صأرأم-لأناsتs[ص،د،V،ك4]{\displaystyle \operatorname {build-param-lists} [p,D,V,T_{4}]\land \operatorname {build-param-lists} [p,D,V,K_{4}]}
تي4=[F4،S4،أ4]::[F3،S3،أ3]::ك2{\displaystyle \land T_{4}=[F_{4},S_{4},A_{4}]::[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،و]V[F3]=أ3))د[F3]=د[و]{\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[F_{3}]=A_{3}))\land D[F_{3}]=D[f]}
(S4(مساواة[أ4،ص]V[F4]=أ4))د[F4]=ك4{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[F_{4}]=A_{4}))\land D[F_{4}]=K_{4}}
د[ص]=[F4،S4،أ4]::[F3،S3،أ3]::ك2{\displaystyle D[p]=[F_{4},S_{4},A_{4}]::[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،و]V[F3]=أ3))د[F3]=د[و]{\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[F_{3}]=A_{3}))\land D[F_{3}]=D[f]}
(S4(مساواة[أ4،ص]V[F4]=أ4))د[F4]=د[ص]{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[F_{4}]=A_{4}))\land D[F_{4}]=D[p]}
بuأنالد-صأرأم-لأناsتs[x (q q x))،د،V،_]{\displaystyle \operatorname {build-param-lists} [x\ (q\ q\ x)),D,V,\_]}
قاعدةتعبير
التجريدبuأنالد-صأرأم-لأناsتs[λq.λx.x (q q x))،د،V،_]{\displaystyle \operatorname {build-param-lists} [\lambda q.\lambda x.x\ (q\ q\ x)),D,V,\_]}
طلببuأنالد-صأرأم-لأناsتs[x (q q x))،د،V،ك1]{\displaystyle \operatorname {build-param-lists} [x\ (q\ q\ x)),D,V,K_{1}]}
اسمبuأنالد-صأرأم-لأناsتs[x،د،V،تي5]بuأنالد-صأرأم-لأناsتs[q q x،د،V،ك5]{\displaystyle \operatorname {build-param-lists} [x,D,V,T_{5}]\land \operatorname {build-param-lists} [q\ q\ x,D,V,K_{5}]}
تي5=[F5،S5،أ5]::_{\displaystyle \land T_{5}=[F_{5},S_{5},A_{5}]::\_}
(S5(مساواة[أ5،q q x]V[F5]=أ5))د[F5]=ك5{\displaystyle \land (S_{5}\implies (\operatorname {equate} [A_{5},q\ q\ x]\land V[F_{5}]=A_{5}))\land D[F_{5}]=K_{5}}
اسمبuأنالد-صأرأم-لأناsتs[q q x،د،V،ك5]{\displaystyle \operatorname {build-param-lists} [q\ q\ x,D,V,K_{5}]}
د[x]=[F5،S5،أ5]::_{\displaystyle \land D[x]=[F_{5},S_{5},A_{5}]::\_}
(S5(مساواة[أ5،q q x]V[F5]=أ5))د[F5]=ك5{\displaystyle \land (S_{5}\implies (\operatorname {equate} [A_{5},q\ q\ x]\land V[F_{5}]=A_{5}))\land D[F_{5}]=K_{5}}
اسمبuأنالد-صأرأم-لأناsتs[q q،د،V،تي6]بuأنالد-صأرأم-لأناsتs[x،د،V،ك6]{\displaystyle \operatorname {build-param-lists} [q\ q,D,V,T_{6}]\land \operatorname {build-param-lists} [x,D,V,K_{6}]}
تي6=[F6،S6،أ6]::ك5{\displaystyle \land T_{6}=[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=ك6{\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=K_{6}}
طلببuأنالد-صأرأم-لأناsتs[q q،د،V،تي6]{\displaystyle \operatorname {build-param-lists} [q\ q,D,V,T_{6}]}
تي6=[F6،S6،أ6]::ك5{\displaystyle \land T_{6}=[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=د[x]{\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=D[x]}
اسمبuأنالد-صأرأم-لأناsتs[q،د،V،تي7]بuأنالد-صأرأم-لأناsتs[q،د،V،ك7]{\displaystyle \operatorname {build-param-lists} [q,D,V,T_{7}]\land \operatorname {build-param-lists} [q,D,V,K_{7}]}
تي7=[F7،S7،أ7]::[F6،S6،أ6]::ك5{\displaystyle \land T_{7}=[F_{7},S_{7},A_{7}]::[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=د[x]{\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=D[x]}
(S7(مساواة[أ7،q]V[F7]=أ7))د[F7]=ك7{\displaystyle \land (S_{7}\implies (\operatorname {equate} [A_{7},q]\land V[F_{7}]=A_{7}))\land D[F_{7}]=K_{7}}
اسمبuأنالد-صأرأم-لأناsتs[q،د،V،ك7]{\displaystyle \operatorname {build-param-lists} [q,D,V,K_{7}]}
د[q]=[F7،S7،أ7]::[F6،S6،أ6]::ك5{\displaystyle \land D[q]=[F_{7},S_{7},A_{7}]::[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=د[x]{\displaystyle \land (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=D[x]}
(S7(مساواة[أ7،q]V[F7]=أ7))د[F7]=د[q]{\displaystyle \land (S_{7}\implies (\operatorname {equate} [A_{7},q]\land V[F_{7}]=A_{7}))\land D[F_{7}]=D[q]}

بعد جمع النتائج معًا،

د[ص]=[q،_،_]::[x،_،_]::L3{\displaystyle D[p]=[q,\_,\_]::[x,\_,\_]::L_{3}}
د[ص]=[F4،S4،أ4]::[F3،S3،أ3]::ك2{\displaystyle D[p]=[F_{4},S_{4},A_{4}]::[F_{3},S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،و]V[F3]=أ3))د[F3]=د[و]{\displaystyle \land (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[F_{3}]=A_{3}))\land D[F_{3}]=D[f]}
(S4(مساواة[أ4،ص]V[F4]=أ4))د[F4]=د[ص]{\displaystyle \land (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[F_{4}]=A_{4}))\land D[F_{4}]=D[p]}
د[q]=[F7،S7،أ7]::[F6،S6،أ6]::ك5{\displaystyle D[q]=[F_{7},S_{7},A_{7}]::[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=د[x]{\displaystyle (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=D[x]}
(S7(مساواة[أ7،q]V[F7]=أ7))د[F7]=د[q]{\displaystyle (S_{7}\implies (\operatorname {equate} [A_{7},q]\land V[F_{7}]=A_{7}))\land D[F_{7}]=D[q]}

من التعريفين لـد[ص]{\displaystyle D[p]}؛

F4=q{\displaystyle F_{4}=q}
F3=x{\displaystyle F_{3}=x}

لذا

د[ص]=[q،S4،أ4]::[x،S3،أ3]::ك2{\displaystyle D[p]=[q,S_{4},A_{4}]::[x,S_{3},A_{3}]::K_{2}}
(S3(مساواة[أ3،و]V[x]=أ3))د[x]=د[و]{\displaystyle (S_{3}\implies (\operatorname {equate} [A_{3},f]\land V[x]=A_{3}))\land D[x]=D[f]}
(S4(مساواة[أ4،ص]V[q]=أ4))د[q]=د[ص]{\displaystyle (S_{4}\implies (\operatorname {equate} [A_{4},p]\land V[q]=A_{4}))\land D[q]=D[p]}

استخدامد[q]=د[ص]{\displaystyle D[q]=D[p]}و

د[ص]=[F7،S7،أ7]::[F6،S6،أ6]::ك5{\displaystyle D[p]=[F_{7},S_{7},A_{7}]::[F_{6},S_{6},A_{6}]::K_{5}}
(S6(مساواة[أ6،x]V[F6]=أ6))د[F6]=د[x]{\displaystyle (S_{6}\implies (\operatorname {equate} [A_{6},x]\land V[F_{6}]=A_{6}))\land D[F_{6}]=D[x]}
(S7(مساواة[أ7،q]V[F7]=أ7))د[F7]=د[q]{\displaystyle (S_{7}\implies (\operatorname {equate} [A_{7},q]\land V[F_{7}]=A_{7}))\land D[F_{7}]=D[q]}

بالمقارنة مع ما سبق،

F7=q،F6=x،أ3=أ6،أ4=أ7،S3=S6،S4=S7{\displaystyle F_{7}=q,F_{6}=x,A_{3}=A_{6},A_{4}=A_{7},S_{3}=S_{6},S_{4}=S_{7}}

لذا،

V[x]=أ3{\displaystyle V[x]=A_{3}}
V[q]=أ4{\displaystyle V[q]=A_{4}}

في،

S3أ3=و{\displaystyle S_{3}\implies A_{3}=f}
S3(أ3=xأ3=v[x]){\displaystyle S_{3}\implies (A_{3}=x\lor A_{3}=v[x])}

يختزل إلى،

S3أ3=و{\displaystyle S_{3}\implies A_{3}=f}

أيضًا،

S4أ4=ص{\displaystyle S_{4}\implies A_{4}=p}
S4(أ4=qأ4=v[q]){\displaystyle S_{4}\implies (A_{4}=q\lor A_{4}=v[q])}

يختزل إلى،

S4أ4=ص{\displaystyle S_{4}\implies A_{4}=p}

لذا فإن قائمة المعاملات لـ p هي فعلياً؛

د[ص]=[q،_،ص]::[x،_،و]::_{\displaystyle D[p]=[q,\_,p]::[x,\_,f]::\_}

معلمات الإسقاط

استخدم المعلومات التي تم الحصول عليها من خلال إنشاء قوائم المعلمات لحذف المعلمات الفعلية التي لم تعد مطلوبة. تحتوي قائمة المعلمات على drop-params .

  • تعبير لامدا الذي سيتم فيه حذف المعاملات.
  • ربط أسماء المتغيرات بقوائم المعلمات (مضمنة في إنشاء قوائم المعلمات).
  • مجموعة المتغيرات الحرة في تعبير لامدا.
  • قائمة المعاملات المُعادة. معامل يُستخدم داخليًا في الخوارزمية.

التجريد

درoص-صأرأمs[(λشمال.S) L،د،V،R](λشمال.درoص-صأرأمs[S،د،F،R]) درoص-وoرمأل[د[شمال]،L،F]{\displaystyle \operatorname {drop-params} [(\lambda N.S)\ L,D,V,R]\equiv (\lambda N.\operatorname {drop-params} [S,D,F,R])\ \operatorname {drop-formal} [D[N],L,F]}

أين،

F=FV[(λشمال.S) L]{\displaystyle F=FV[(\lambda N.S)\ L]}
درoص-صأرأمs[λشمال.S،د،V،R](λشمال.درoص-صأرأمs[S،د،F،R]){\displaystyle \operatorname {drop-params} [\lambda N.S,D,V,R]\equiv (\lambda N.\operatorname {drop-params} [S,D,F,R])}

أين،

F=FV[λشمال.S]{\displaystyle F=FV[\lambda N.S]}

عامل

درoص-صأرأمs[شمال،د،V،د[شمال]]شمال{\displaystyle \operatorname {drop-params} [N,D,V,D[N]]\equiv N}

بالنسبة لاسم دالة أو معلمة، ابدأ بتعبئة قائمة المعلمات الفعلية عن طريق إخراج قائمة المعلمات لهذا الاسم.

التطبيق - تتم معالجة تطبيق (استدعاء دالة) لاستخراج

(تعريف[F]بسأل[S]FV[أ]V)درoص-صأرأمs[هـ P،د،V،R]درoص-صأرأمs[هـ،د،V،[F،S،أ]::R]{\displaystyle (\operatorname {def} [F]\land \operatorname {ask} [S]\land FV[A]\subset V)\to \operatorname {drop-params} [E\ P,D,V,R]\equiv \operatorname {drop-params} [E,D,V,[F,S,A]::R]}
¬(تعريف[F]بسأل[S]FV[أ]V)درoص-صأرأمs[هـ P،د،V،R]درoص-صأرأمs[هـ،د،V،[F،S،أ]::R] درoص-صأرأمs[P،د،V،_]{\displaystyle \neg (\operatorname {def} [F]\land \operatorname {ask} [S]\land FV[A]\subset V)\to \operatorname {drop-params} [E\ P,D,V,R]\equiv \operatorname {drop-params} [E,D,V,[F,S,A]::R]\ \operatorname {drop-params} [P,D,V,\_]}

ليكن - تعبير ليكن.

درoص-صأرأمs[يتركV:هـفيL]يتركV:درoص-صأرأمs[هـ،د،FV[هـ]،[]]فيدرoص-صأرأمs[L،د،FV[L]،[]]{\displaystyle \operatorname {drop-params} [\operatorname {let} V:E\operatorname {in} L]\equiv \operatorname {let} V:\operatorname {drop-params} [E,D,FV[E],[]]\operatorname {in} \operatorname {drop-params} [L,D,FV[L],[]]}

و - للاستخدام في "let".

درoص-صأرأمs[هـF،د،V،_]درoص-صأرأمs[هـ،د،V،_]درoص-صأرأمs[F،د،V،_]{\displaystyle \operatorname {drop-params} [E\land F,D,V,\_]\equiv \operatorname {drop-params} [E,D,V,\_]\land \operatorname {drop-params} [F,D,V,\_]}
حذف المعلمات من التطبيقات
λز.λن.ن (ز م ص ن) (ز q ص ن){\displaystyle \lambda g.\lambda n.n\ (g\ m\ p\ n)\ (g\ q\ p\ n)}
حالةتعبير
درoص-صأرأم[λز.λن.ن (ز م ص ن) (ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \operatorname {drop-param} [\lambda g.\lambda n.n\ (g\ m\ p\ n)\ (g\ q\ p\ n),D,\{p,q,m\},\_]}
λز.درoص-صأرأم[λن.ن (ز م ص ن) (ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \lambda g.\operatorname {drop-param} [\lambda n.n\ (g\ m\ p\ n)\ (g\ q\ p\ n),D,\{p,q,m\},\_]}
¬(تعريف[F1]...){\displaystyle \neg (\operatorname {def} [F_{1}]\land ...)}λز.λن.درoص-صأرأم[ن (ز م ص ن)،د،{ص،q،م}،[F1،S1،أ1]::_] درoص-صأرأم[(ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \lambda g.\lambda n.\operatorname {drop-param} [n\ (g\ m\ p\ n),D,\{p,q,m\},[F_{1},S_{1},A_{1}]::\_]\ \operatorname {drop-param} [(g\ q\ p\ n),D,\{p,q,m\},\_]}
¬(تعريف[F2]...){\displaystyle \neg (\operatorname {def} [F_{2}]\land ...)}λز.λن.درoص-صأرأم[ن ،د،{ص،q،م}،[F2،S2،أ2]::[F1،S1،أ1]::_] درoص-صأرأم[(ز م ص ن)،د،{ص،q،م}،_] درoص-صأرأم[(ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \lambda g.\lambda n.\operatorname {drop-param} [n\ ,D,\{p,q,m\},[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_]\ \operatorname {drop-param} [(g\ m\ p\ n),D,\{p,q,m\},\_]\ \operatorname {drop-param} [(g\ q\ p\ n),D,\{p,q,m\},\_]}
د[ن]=[F2،S2،أ2]::[F1،S1،أ1]::_]{\displaystyle D[n]=[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_]}λز.λن.ن درoص-صأرأم[(ز م ص ن)،د،{ص،q،م}،_] درoص-صأرأم[(ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \lambda g.\lambda n.n\ \operatorname {drop-param} [(g\ m\ p\ n),D,\{p,q,m\},\_]\ \operatorname {drop-param} [(g\ q\ p\ n),D,\{p,q,m\},\_]}

من نتائج بناء قوائم المعلمات؛

د[ن]=[[_،_،(ز م ص ن)]،[_،_،(ز q ص ن)]]{\displaystyle D[n]=[[\_,\_,(g\ m\ p\ n)],[\_,\_,(g\ q\ p\ n)]]}

لذا،

F1=_{\displaystyle F_{1}=\_}
F2=_{\displaystyle F_{2}=\_}

لذا،

تعريف[F1]=خطأ شنيع{\displaystyle \operatorname {def} [F_{1}]=\operatorname {false} }
تعريف[F2]=خطأ شنيع{\displaystyle \operatorname {def} [F_{2}]=\operatorname {false} }
درoص-صأرأم[(ز م ص ن)،د،{ص،q،م}،_]{\displaystyle \operatorname {drop-param} [(g\ m\ p\ n),D,\{p,q,m\},\_]}
حالةموسعتعبير
V={ص،q،م}{\displaystyle V=\{p,q,m\}}درoص-صأرأم[(ز م ص ن)،د،V،_]{\displaystyle \operatorname {drop-param} [(g\ m\ p\ n),D,V,\_]}
FV(أ1){ص،q،م}{\displaystyle FV(A_{1})\not \subset \{p,q,m\}}ن{ص،q،م}{\displaystyle n\not \subset \{p,q,m\}}درoص-صأرأمs[ز م ص،د،V،[F1،S1،أ1]::_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g\ m\ p,D,V,[F_{1},S_{1},A_{1}]::\_]\ \operatorname {drop-params} [n,D,V,\_]}
تعريف[F2]بسأل[S2]FV[أ2]V{\displaystyle \operatorname {def} [F_{2}]\land \operatorname {ask} [S_{2}]\land FV[A_{2}]\subset V}تعريف[y]بسأل[_]FV[ص]{ص،q،م}{\displaystyle \operatorname {def} [y]\land \operatorname {ask} [\_]\land FV[p]\subset \{p,q,m\}}درoص-صأرأمs[ز م،د،V،[F2،S2،أ2]::[F1،S1،أ1]::_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g\ m,D,V,[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_]\ \operatorname {drop-params} [n,D,V,\_]}
¬بسأل[S3]{\displaystyle \neg \operatorname {ask} [S_{3}]}¬بسأل[خطأ شنيع]{\displaystyle \neg \operatorname {ask} [\operatorname {false} ]}درoص-صأرأمs[ز،د،V،[F3،S3،أ3]::[F2،S2،أ2]::[F1،S1،أ1]::_] درoص-صأرأمs[م،د،V،_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g,D,V,[F_{3},S_{3},A_{3}]::[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_]\ \operatorname {drop-params} [m,D,V,\_]\ \operatorname {drop-params} [n,D,V,\_]}

د[ز]=[[x،خطأ شنيع،_]،[o،_،ص]،[y،_،ن]]{\displaystyle D[g]=[[x,\operatorname {false} ,\_],[o,\_,p],[y,\_,n]]}=[F3،S3،أ3]::[F2،S2،أ2]::[F1،S1،أ1]::_]{\displaystyle =[F_{3},S_{3},A_{3}]::[F_{2},S_{2},A_{2}]::[F_{1},S_{1},A_{1}]::\_]}

F3=x،S3=خطأ شنيع،أ3=_{\displaystyle F_{3}=x,S_{3}=\operatorname {false} ,A_{3}=\_}F2=o،S2=_،أ2=ص{\displaystyle F_{2}=o,S_{2}=\_,A_{2}=p}F1=y،S1=_،أ1=ن{\displaystyle F_{1}=y,S_{1}=\_,A_{1}=n}

ز م ن{\displaystyle g\ m\ n}

درoص-صأرأم[(ز q ص ن)،د،{ص،q،م}،_]{\displaystyle \operatorname {drop-param} [(g\ q\ p\ n),D,\{p,q,m\},\_]}
حالةموسعتعبير
V = {p, q, m}درoص-صأرأم[(ز q ص ن)،د،V،_]{\displaystyle \operatorname {drop-param} [(g\ q\ p\ n),D,V,\_]}
FV(أ4)V{\displaystyle FV(A_{4})\not \subset V}ن{ص،q،م}{\displaystyle n\not \subset \{p,q,m\}}درoص-صأرأمs[ز q ص،د،V،[F4،S4،أ4]::_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g\ q\ p,D,V,[F_{4},S_{4},A_{4}]::\_]\ \operatorname {drop-params} [n,D,V,\_]}
تعريف[F5]بسأل[S5]FV[أ5]V{\displaystyle \operatorname {def} [F_{5}]\land \operatorname {ask} [S_{5}]\land FV[A_{5}]\subset V}تعريف[o]بسأل[_]ص{ص،q،م}){\displaystyle \operatorname {def} [o]\land \operatorname {ask} [\_]\land p\subset \{p,q,m\})}درoص-صأرأمs[ز q،د،V،[F5،S5،أ5]::[F4،S4،أ4]::_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g\ q,D,V,[F_{5},S_{5},A_{5}]::[F_{4},S_{4},A_{4}]::\_]\ \operatorname {drop-params} [n,D,V,\_]}
¬بسأل[S-6]{\displaystyle \neg \operatorname {ask} [S-6]}¬بسأل[خطأ شنيع]{\displaystyle \neg \operatorname {ask} [\operatorname {false} ]}درoص-صأرأمs[ز،د،V،[F6،S6،أ6]::[F5،S5،أ5]::[F4،S4،أ4]::_] درoص-صأرأمs[م،د،V،_] درoص-صأرأمs[ن،د،V،_]{\displaystyle \operatorname {drop-params} [g,D,V,[F_{6},S_{6},A_{6}]::[F_{5},S_{5},A_{5}]::[F_{4},S_{4},A_{4}]::\_]\ \operatorname {drop-params} [m,D,V,\_]\ \operatorname {drop-params} [n,D,V,\_]}

د[ز]=[[x،خطأ شنيع،_]،[o،_،ص]،[y،_،ن]]{\displaystyle D[g]=[[x,\operatorname {false} ,\_],[o,\_,p],[y,\_,n]]}=[F6،S6،أ6]::[F5،S5،أ5]::[F4،S4،أ4]::_]{\displaystyle =[F_{6},S_{6},A_{6}]::[F_{5},S_{5},A_{5}]::[F_{4},S_{4},A_{4}]::\_]}

F6=x،S6=خطأ شنيع،أ6=_{\displaystyle F_{6}=x,S_{6}=\operatorname {false} ,A_{6}=\_}F5=o،S5=_،أ5=ص{\displaystyle F_{5}=o,S_{5}=\_,A_{5}=p}F4=y،S4=_،أ4=ن{\displaystyle F_{4}=y,S_{4}=\_,A_{4}=n}

ز q ن{\displaystyle g\ q\ n}

حذف المعاملات الرسمية

تقوم الدالة drop-formal بإزالة المعاملات الرسمية، بناءً على محتويات القوائم المنسدلة. معاملاتها هي:

  • قائمة الحذف،
  • تعريف الدالة (تجريد لامدا).
  • المتغيرات الحرة من تعريف الدالة.

يُعرَّف حذف الصيغة الرسمية على النحو التالي:

  1. (بسأل[S]FV[أ]V)درoص-وoرمأل[[F،S،أ]::Z،λF.Y،V]درoص-وoرمأل[[F،S،أ]::Z،Y[F:=أ]،L]{\displaystyle (\operatorname {ask} [S]\land FV[A]\subset V)\to \operatorname {drop-formal} [[F,S,A]::Z,\lambda F.Y,V]\equiv \operatorname {drop-formal} [[F,S,A]::Z,Y[F:=A],L]}
  2. ¬(بسأل[S]FV[أ]V)درoص-وoرمأل[[F،S،أ]::Z،λF.Y،V]λF.درoص-وoرمأل[[F،S،أ]::Z،Y،V]{\displaystyle \neg (\operatorname {ask} [S]\land FV[A]\subset V)\to \operatorname {drop-formal} [[F,S,A]::Z,\lambda F.Y,V]\equiv \lambda F.\operatorname {drop-formal} [[F,S,A]::Z,Y,V]}
  3. درoص-وoرمأل[Z،Y،V]Y{\displaystyle \operatorname {drop-formal} [Z,Y,V]\equiv Y}

ويمكن تفسير ذلك على النحو التالي:

  1. إذا كانت جميع المعلمات الفعلية لها نفس القيمة، وكانت جميع المتغيرات الحرة لتلك القيمة متاحة لتعريف الدالة، فقم بإسقاط المعلمة، واستبدل المعلمة القديمة بقيمتها.
  2. وإلا فلا تحذف المعامل.
  3. وإلا، فأعد جسم الدالة.
حالةتعبير
خطأ شنيع{\displaystyle \operatorname {false} }درoص-وoرمأل[د،λx.λo.λy.o x y،F]{\displaystyle \operatorname {drop-formal} [D,\lambda x.\lambda o.\lambda y.o\ x\ y,F]}
حقيقي{ص}F{\displaystyle \operatorname {true} \land \{p\}\subset F}λx.درoص-وoرمأل[د،λo.λy.o x y،F]{\displaystyle \lambda x.\operatorname {drop-formal} [D,\lambda o.\lambda y.o\ x\ y,F]}
¬(حقيقي{ن}F{\displaystyle \neg (\operatorname {true} \land \{n\}\subset F})λx.درoص-وoرمأل[د،(λy.o x y)[o:=ص]،F]{\displaystyle \lambda x.\operatorname {drop-formal} [D,(\lambda y.o\ x\ y)[o:=p],F]}
λx.λy.درoص-وoرمأل[د،ص x y،F]{\displaystyle \lambda x.\lambda y.\operatorname {drop-formal} [D,p\ x\ y,F]}
λx.λy.ص x y{\displaystyle \lambda x.\lambda y.p\ x\ y}

مثال

بدءًا من تعريف دالة مُركِّب Y،

يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص {\displaystyle \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p\ }
تحويلتعبير
يتركص و x=و (x x)q ص و=(ص و) (ص و)فيq ص{\displaystyle \operatorname {let} p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\operatorname {in} q\ p}
ملخص * 4يتركص=λو.λx.و (x x)q=λص.λو.(ص و) (ص و)فيq ص{\displaystyle \operatorname {let} p=\lambda f.\lambda x.f\ (x\ x)\land q=\lambda p.\lambda f.(p\ f)\ (p\ f)\operatorname {in} q\ p}
لامدا-مجرد-ترجمة(λq.(λص.q ص) (λو.λx.و (x x))) (λص.λو.(ص و) (ص و)){\displaystyle (\lambda q.(\lambda p.q\ p)\ (\lambda f.\lambda x.f\ (x\ x)))\ (\lambda p.\lambda f.(p\ f)\ (p\ f))}
غرق-نقل(λص.λو.(ص و) (ص و)) (λو.λx.و (x x)){\displaystyle (\lambda p.\lambda f.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))}
غرق-نقلλو.(λص.(ص و) (ص و)) (λو.λx.و (x x)){\displaystyle \lambda f.(\lambda p.(p\ f)\ (p\ f))\ (\lambda f.\lambda x.f\ (x\ x))}
حذف المعاملλو.(λص.ص ص) (λx.و (x x)){\displaystyle \lambda f.(\lambda p.p\ p)\ (\lambda x.f\ (x\ x))}
بيتا ريدكسλو.(λx.و (x x)) (λx.و (x x)) {\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))\ }

مما يعيد مُركِّب Y ،

λو.(λx.و (x x)) (λx.و (x x)){\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}

انظر أيضاً

مراجع

  1. جونسون، توماس (1985). "رفع لامدا: تحويل البرامج إلى معادلات تكرارية". في: جوانو، جيه بي (محرر). لغات البرمجة الوظيفية وهندسة الحاسوب. FPCA 1985. سلسلة محاضرات في علوم الحاسوب. المجلد  201. سبرينغر. CiteSeerX 10.1.1.48.4346 . doi : 10.1007/3-540-15975-4_37 . ISBN  3-540-15975-4.
  2. مورازان، ماركو ت.؛ شولتز، أولريك ب. (2008). "الرفع الأمثل لدالة لامدا في زمن تربيعي". تنفيذ وتطبيق اللغات الوظيفية - أوراق مختارة منقحة . ص 37-56 . doi : 10.1007/978-3-540-85373-2_3 . ISBN  978-3-540-85372-5.
  3. دانفي، أو.؛ ​​شولتز، يو بي (1997). "إسقاط لامدا" . إشعارات ACM SIGPLAN . 32 (12): 90-106 . doi : 10.1145/258994.259007 .
  4. دانفي، أوليفييه؛ شولتز، أولريك ب. (أكتوبر 2000). "حذف لامدا: تحويل المعادلات التكرارية إلى برامج ذات بنية كتلية" (ملف PDF) . علوم الحاسوب النظرية . 248 ( 1-2 ): 243-287 . CiteSeerX 10.1.1.16.3943 . doi : 10.1016/S0304-3975(00)00054-2 . BRICS-RS-99-27.