تحتاج هذه المقالة إلى مصادر إضافية للتحقق . يُرجى المساعدة في تحسين هذه المقالة بإضافة مصادر موثوقة . قد يتم الطعن في المواد غير الموثقة وإزالتها. البحث عن المصادر: "Let expression" – news · journalist · books · scholar · JSTOR ( March 2017 ) ( Learn how and when to remove this message )
في علوم الكمبيوتر، يربط تعبير "let" تعريف الدالة بنطاق مقيد .
يمكن أيضًا تعريف تعبير "let" في الرياضيات، حيث يربط شرطًا منطقيًا بنطاق مقيد.
يمكن اعتبار تعبير "let" بمثابة تجريد لامدا مطبق على قيمة. وفي الرياضيات، يمكن اعتبار تعبير "let" أيضًا بمثابة اقتران للتعبيرات، ضمن كمية وجودية تحد من نطاق المتغير.
توجد عبارة let في العديد من اللغات الوظيفية للسماح بالتعريف المحلي للتعبير، لاستخدامه في تعريف تعبير آخر. توجد عبارة let في بعض اللغات الوظيفية في شكلين؛ let أو "let rec". Let rec هو امتداد لتعبير let البسيط الذي يستخدم مجموعة النقطة الثابتة لتنفيذ التكرار .
تاريخ
كانت لغة LCF الخاصة بدانا سكوت [1] مرحلة في تطور حساب لامدا إلى لغات وظيفية حديثة. قدمت هذه اللغة تعبير let، الذي ظهر في معظم اللغات الوظيفية منذ ذلك الوقت.
لقد ورثت
اللغات Scheme و [2] ML ومؤخرًا Haskell [3] تعبيرات let من LCF.
تطبق اللغات الأمرية ذات الحالة مثل ALGOL و Pascal بشكل أساسي تعبير let، لتنفيذ نطاق محدود من الوظائف، في هياكل الكتل. [ بحاجة لمصدر ]
ظهرت بالفعل جملة " where " وثيقة الصلة ، إلى جانب متغيرها المتكرر " where rec "، في كتاب بيتر لاندين "التقييم الميكانيكي للتعبيرات" . [4]
وصف
يحدد تعبير "let" دالة أو قيمة لاستخدامها في تعبير آخر. بالإضافة إلى كونه بنية مستخدمة في العديد من لغات البرمجة الوظيفية، فهو عبارة عن بنية لغة طبيعية تُستخدم غالبًا في النصوص الرياضية. وهو عبارة عن بنية نحوية بديلة لشرط where.
دع التعبير
بند أين
يترك
أ
=
3
{\displaystyle أ=3}
و
ب
=
4
{\displaystyle b=4}
في
أ
2
+
ب
2
{\displaystyle {\sqrt {a^{2}+b^{2}}}}
أ
2
+
ب
2
{\displaystyle {\sqrt {a^{2}+b^{2}}}}
أين
أ
=
3
{\displaystyle أ=3}
و
ب
=
4
{\displaystyle b=4}
في كلتا الحالتين، يكون البناء بأكمله عبارة عن تعبير قيمته 5. وكما هو الحال مع if-then-else، فإن النوع الذي يتم إرجاعه بواسطة التعبير ليس بالضرورة منطقيًا.
يأتي تعبير let في أربعة أشكال رئيسية،
استمارة
و
متكرر
التعريف / القيد
وصف
بسيط
لا
لا
تعريف
تعريف وظيفة بسيطة غير متكررة.
متكرر
لا
نعم
تعريف
تعريف الدالة المتكررة (تم تنفيذها باستخدام مجموعة Y ).
مشترك
نعم
نعم
تعريف
تعريف الدالة التكرارية المتبادلة.
رياضيات
نعم
نعم
القيد
تعريف رياضي يدعم شرطًا منطقيًا عامًا.
في اللغات الوظيفية، يحدد تعبير let الوظائف التي يمكن استدعاؤها في التعبير. يقتصر نطاق اسم الوظيفة على بنية تعبير let.
في الرياضيات، يحدد تعبير let شرطًا، وهو قيد على التعبير. قد يدعم بناء الجملة أيضًا إعلان المتغيرات الكمية الوجودية المحلية لتعبير let.
تختلف المصطلحات والنحو والدلالات من لغة إلى أخرى. في Scheme ، يتم استخدام let للشكل البسيط و let rec للشكل المتكرر. في ML، يشير let فقط إلى بداية كتلة من الإعلانات بينما يشير fun إلى بداية تعريف الوظيفة. في Haskell، قد يكون let متكررًا بشكل متبادل، حيث يكتشف المترجم ما هو مطلوب.
تعريف
يمثل تجريد لامدا دالة بدون اسم. وهذا مصدر التناقض في تعريف تجريد لامدا. ومع ذلك، يمكن تكوين تجريدات لامدا لتمثيل دالة لها اسم. في هذا الشكل، يتم إزالة التناقض. مصطلح لامدا،
(
λ
ف
.
ز
)
(
λ
س
.
ي
)
{\displaystyle (\lambda fz)\ (\lambda xy)}
يعادل تعريف الدالة بواسطة في التعبير ، والذي يمكن كتابته على هيئة تعبير let ؛
ف
{\displaystyle f}
ف
س
=
ي
{\displaystyle f\x=y}
ز
{\displaystyle z}
يترك
ف
س
=
ي
في
ز
{\displaystyle \operatorname {دع} f\ x=y\operatorname {في} z}
يمكن فهم تعبير let باعتباره تعبيرًا بلغة طبيعية. يمثل تعبير let استبدال متغير بقيمة. تصف قاعدة الاستبدال آثار المساواة باعتبارها استبدالًا.
دعونا التعريف في الرياضيات
في الرياضيات، يُوصَف تعبير let بأنه اقتران التعبيرات. وفي اللغات الوظيفية، يُستخدم تعبير let أيضًا لتحديد النطاق. وفي الرياضيات، يُوصَف النطاق باستخدام المحددات الكمية. تعبير let هو اقتران داخل محدد كمية وجودي.
(
∃
س
هـ
∧
ف
)
⟺
يترك
س
:
هـ
في
ف
{\displaystyle (\exists xE\land F)\iff \operatorname {دع} x:E\operatorname {في} F}
حيث أن E و F من النوع المنطقي.
يسمح تعبير let بتطبيق الاستبدال على تعبير آخر. يمكن تطبيق هذا الاستبدال ضمن نطاق مقيد، على تعبير فرعي. الاستخدام الطبيعي لتعبير let هو في التطبيق على نطاق مقيد (يسمى إسقاط lambda ). تحدد هذه القواعد كيفية تقييد النطاق؛
{
س
∉
ف ف
(
هـ
)
∧
س
∈
ف ف
(
ف
)
⟹
يترك
س
:
ج
في
هـ
ف
=
هـ
(
يترك
س
:
ج
في
ف
)
س
∈
ف ف
(
هـ
)
∧
س
∉
ف ف
(
ف
)
⟹
يترك
س
:
ج
في
هـ
ف
=
(
يترك
س
:
ج
في
هـ
)
ف
س
∉
ف ف
(
هـ
)
∧
س
∉
ف ف
(
ف
)
⟹
يترك
س
:
ج
في
هـ
ف
=
هـ
ف
{\displaystyle {\begin{cases}x\not \in \operatorname {FV} (E)\land x\in \operatorname {FV} (F)\implies \operatorname {let} x:G\operatorname {in} E\ F=E\ (\operatorname {let} x:G\operatorname {in} F)\\x\in \operatorname {FV} (E)\land x\not \in \operatorname {FV} (F)\implies \operatorname {let} x:G\operatorname {in} E\ F=(\operatorname {let} x:G\operatorname {in} E)\ F\\x\not \in \operatorname {FV} (E)\land x\not \in \operatorname {FV} (F)\implies \operatorname {let} x:G\operatorname {in} E\ F=E\ F\end{cases}}}
حيث F ليس من النوع المنطقي. ومن هذا التعريف، يمكن استخلاص التعريف القياسي التالي لتعبير let، كما هو مستخدم في لغة وظيفية.
س
∉
ف ف
(
ي
)
⟹
(
يترك
س
:
س
=
ي
في
ز
)
=
ز
[
س
:=
ي
]
=
(
λ
س
.
ز
)
ي
{\displaystyle x\not \in \operatorname {FV} (y)\implies (\operatorname {دع} x:x=y\operatorname {in} z)=z[x:=y]=(\lambda xz)\y}
من أجل التبسيط، سيتم حذف العلامة التي تحدد المتغير الوجودي، من التعبيرات عندما يكون ذلك واضحًا من السياق.
س
:
{\displaystyle x:}
س
∉
ف ف
(
ي
)
⟹
(
يترك
س
=
ي
في
ز
)
=
ز
[
س
:=
ي
]
=
(
λ
س
.
ز
)
ي
{\displaystyle x\not \in \operatorname {FV} (y)\implies (\operatorname {دع} x=y\operatorname {in} z)=z[x:=y]=(\lambda xz)\y}
الاشتقاق
وللتوصل إلى هذه النتيجة، افترض أولاً،
س
∉
ف ف
(
ل
)
{\displaystyle x\not \in \operatorname {FV} (L)}
ثم
ل
(
يترك
س
:
س
=
ي
في
ز
)
⟺
(
يترك
س
:
س
=
ي
في
ل
ز
)
⟺
س
=
ي
∧
ل
ز
{\displaystyle {\begin{aligned}L\ (\operatorname {let} x:x=y\operatorname {in} z)&\iff (\operatorname {let} x:x=y\operatorname {in} L\ z)\\&\iff x=y\land L\ z\end{aligned}}}
باستخدام قاعدة الاستبدال،
⟺
س
=
ي
∧
(
ل
ز
)
[
س
:=
ي
]
⟺
س
=
ي
∧
(
ل
[
س
:=
ي
]
ز
[
س
:=
ي
]
)
⟺
س
=
ي
∧
ل
ز
[
س
:=
ي
]
⟹
ل
ز
[
س
:=
ي
]
{\displaystyle {\begin{aligned}&\iff x=y\land (L\z)[x:=y]\\&\iff x=y\land (L[x:=y]\z[x:=y])\\&\iff x=y\land L\z[x:=y]\\&\implies L\z[x:=y]\end{aligned}}}
لذلك بالنسبة لجميع L ،
ل
يترك
س
:
س
=
ي
في
ز
⟹
ل
ز
[
س
:=
ي
]
{\displaystyle L\operatorname {دع} x:x=y\operatorname {في} z\يعني L\z[x:=y]}
ليكن حيث K هو متغير جديد. إذن،
ل
إكس
=
(
إكس
=
ك
)
{\displaystyle L\ X=(X=K)}
(
يترك
س
:
س
=
ي
في
ز
)
=
ك
⟹
ز
[
س
:=
ي
]
=
ك
{\displaystyle (\operatorname {دع} x:x=y\operatorname {في} z)=K\يعني z[x:=y]=K}
لذا،
يترك
س
:
س
=
ي
في
ز
=
ز
[
س
:=
ي
]
{\displaystyle \operatorname {let} x:x=y\operatorname {in} z=z[x:=y]}
ولكن من التفسير الرياضي لتخفيض بيتا،
(
λ
x
.
z
)
y
=
z
[
x
:=
y
]
{\displaystyle (\lambda x.z)\ y=z[x:=y]}
هنا، إذا كانت y دالة للمتغير x، فهي ليست نفس x كما في z. يمكن تطبيق إعادة التسمية ألفا. لذا يجب أن يكون لدينا،
x
∉
FV
(
y
)
{\displaystyle x\not \in \operatorname {FV} (y)}
لذا،
x
∉
FV
(
y
)
⟹
let
x
:
x
=
y
in
z
=
(
λ
x
.
z
)
y
{\displaystyle x\not \in \operatorname {FV} (y)\implies \operatorname {let} x:x=y\operatorname {in} z=(\lambda x.z)\ y}
ويتم تمثيل هذه النتيجة بلغة وظيفية في شكل مختصر، حيث يكون المعنى لا لبس فيه؛
x
∉
FV
(
y
)
⟹
(
let
x
=
y
in
z
)
=
z
[
x
:=
y
]
=
(
λ
x
.
z
)
y
{\displaystyle x\not \in \operatorname {FV} (y)\implies (\operatorname {let} x=y\operatorname {in} z)=z[x:=y]=(\lambda x.z)\ y}
هنا يتم التعرف ضمناً على المتغير x باعتباره جزءًا من المعادلة التي تحدد x، والمتغير في الكم الوجودي.
لا يتم الرفع من القيمة المنطقية
ينشأ التناقض إذا تم تعريف E بواسطة . في هذه الحالة،
E
=
¬
{\displaystyle E=\neg }
x
∉
FV
(
E
)
∧
x
∈
FV
(
F
)
⟹
let
x
:
G
in
E
F
=
E
(
let
x
:
G
in
F
)
{\displaystyle x\not \in \operatorname {FV} (E)\land x\in \operatorname {FV} (F)\implies \operatorname {let} x:G\operatorname {in} E\ F=E\ (\operatorname {let} x:G\operatorname {in} F)}
يصبح،
let
x
:
G
in
¬
F
=
¬
(
let
x
:
G
in
F
)
{\displaystyle \operatorname {let} x:G\operatorname {in} \neg F=\neg \ (\operatorname {let} x:G\operatorname {in} F)}
واستخدامها،
(
∃
x
E
∧
F
)
⟺
let
x
:
E
in
F
{\displaystyle (\exists xE\land F)\iff \operatorname {let} x:E\operatorname {in} F}
(
∃
x
G
∧
¬
F
)
=
¬
(
∃
x
G
∧
F
)
{\displaystyle (\exists xG\land \neg F)=\neg \ (\exists xG\land F)}
=
(
∃
x
¬
G
∨
¬
F
)
{\displaystyle =(\exists x\neg G\lor \neg F)}
هذا غير صحيح إذا كانت G خاطئة. لتجنب هذا التناقض، لا يُسمح لـ F بأن تكون من النوع المنطقي. بالنسبة لـ F المنطقي، يستخدم البيان الصحيح لقاعدة الإسقاط التضمين بدلاً من المساواة،
x
∉
FV
(
E
)
∧
x
∈
FV
(
F
)
⟹
(
let
x
:
G
in
E
F
→
E
(
let
x
:
G
in
F
)
)
{\displaystyle x\not \in \operatorname {FV} (E)\land x\in \operatorname {FV} (F)\implies (\operatorname {let} x:G\operatorname {in} E\ F\to E\ (\operatorname {let} x:G\operatorname {in} F))}
قد يبدو من الغريب أن تنطبق قاعدة مختلفة على القيم المنطقية عن الأنواع الأخرى. والسبب في ذلك هو أن القاعدة،
(
∃
x
E
∧
F
)
⟺
let
x
:
E
in
F
{\displaystyle (\exists xE\land F)\iff \operatorname {let} x:E\operatorname {in} F}
لا ينطبق هذا إلا عندما تكون F قيمة منطقية. ويؤدي الجمع بين القاعدتين إلى تناقض، لذا عندما تنطبق قاعدة واحدة، لا تنطبق القاعدة الأخرى.
الانضمام إلى تعبيرات let
دع التعبيرات يمكن تعريفها بمتغيرات متعددة،
(
∃
v
⋯
∃
w
∃
x
E
∧
F
)
⟺
let
v
,
…
,
w
,
x
:
E
in
F
{\displaystyle (\exists v\cdots \exists w\exists xE\land F)\iff \operatorname {let} v,\ldots ,w,x:E\operatorname {in} F}
ومن ثم يمكن اشتقاقه،
x
∉
F
V
(
E
)
⟹
(
∃
v
⋯
∃
w
∃
x
E
∧
F
)
⟺
(
∃
v
⋯
∃
w
(
E
∧
∃
x
F
)
)
{\displaystyle x\not \in FV(E)\implies (\exists v\cdots \exists w\exists xE\land F)\iff (\exists v\cdots \exists w(E\land \exists xF))}
لذا،
x
∉
F
V
(
E
)
⟹
(
let
v
,
…
,
w
,
x
:
E
∧
F
in
L
≡
let
v
,
…
,
w
:
E
in
let
x
:
F
in
L
)
{\displaystyle x\not \in FV(E)\implies (\operatorname {let} v,\ldots ,w,x:E\land F\operatorname {in} L\equiv \operatorname {let} v,\ldots ,w:E\operatorname {in} \operatorname {let} x:F\operatorname {in} L)}
القوانين المتعلقة بحساب لامدا وتعبيرات السماح
يقدم اختزال إيتا قاعدة لوصف تجريدات لامدا. تحدد هذه القاعدة، إلى جانب القانونين المستمدين أعلاه، العلاقة بين حساب لامدا وتعبيرات Let.
اسم
قانون
تكافؤ تخفيض إيتا
f
x
=
y
≡
f
=
λ
x
.
y
{\displaystyle f\ x=y\equiv f=\lambda x.y}
تكافؤ لامدا-ليت
f
∉
F
V
(
E
)
⟹
(
let
f
:
f
=
E
in
L
≡
(
λ
f
.
L
)
E
)
{\displaystyle f\notin FV(E)\implies (\operatorname {let} f:f=E\operatorname {in} L\equiv (\lambda f.L)\ E)}
(أين اسم المتغير.)
f
{\displaystyle f}
دعونا نجمع
x
∉
F
V
(
E
)
⟹
(
let
v
,
…
,
w
,
x
:
E
∧
F
in
L
≡
let
v
,
…
,
w
:
E
in
let
x
:
F
in
L
)
{\displaystyle x\notin FV(E)\implies (\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)}
دعونا نتعرف على التعريف من حساب لامدا
لتجنب المشكلات المحتملة المرتبطة بالتعريف الرياضي، قام دانا سكوت في الأصل بتعريف تعبير let من حساب لامدا. يمكن اعتبار هذا التعريف من الأسفل إلى الأعلى أو البنّاء لتعبير let ، على النقيض من التعريف الرياضي من الأعلى إلى الأسفل أو البديهي.
تم تعريف تعبير let البسيط غير المتكرر بأنه عبارة عن سكر نحوي لتجريد lambda المطبق على مصطلح. في هذا التعريف،
(
let
s
x
=
y
in
z
)
≡
(
λ
x
.
z
)
y
{\displaystyle (\operatorname {let} _{s}x=y\operatorname {in} z)\equiv (\lambda x.z)\ y}
تم بعد ذلك توسيع تعريف تعبير let البسيط للسماح بالتكرار باستخدام مجموعة النقطة الثابتة .
مُجمِّع النقطة الثابتة
يمكن تمثيل مركب النقطة الثابتة بالتعبير،
λ
f
.
let
x
=
f
x
in
x
{\displaystyle \lambda f.\operatorname {let} x=f\ x\operatorname {in} x}
يمكن تحويل هذا التمثيل إلى مصطلح lambda. لا يدعم تجريد lambda الإشارة إلى اسم المتغير في التعبير المطبق، لذا يجب تمرير x كمعلمة إلى x .
λ
f
.
let
x
x
=
f
(
x
x
)
in
x
x
{\displaystyle \lambda f.\operatorname {let} x\ x=f\ (x\ x)\operatorname {in} x\ x}
باستخدام قاعدة تخفيض إيتا،
f
x
=
y
≡
f
=
λ
x
.
y
{\displaystyle f\ x=y\equiv f=\lambda x.y}
يعطي،
λ
f
.
let
x
=
λ
x
.
f
(
x
x
)
in
x
x
{\displaystyle \lambda f.\operatorname {let} x=\lambda x.f\ (x\ x)\operatorname {in} x\ x}
يمكن التعبير عن تعبير let باعتباره تجريدًا لامدا باستخدام،
n
∉
F
V
(
E
)
→
(
let
n
=
E
in
L
≡
(
λ
n
.
L
)
E
)
{\displaystyle n\not \in FV(E)\to (\operatorname {let} n=E\operatorname {in} L\equiv (\lambda n.L)\ E)}
يعطي،
λ
f
.
(
λ
x
.
x
x
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle \lambda f.(\lambda x.x\ x)\ (\lambda x.f\ (x\ x))}
ربما يكون هذا أبسط تنفيذ لمركب النقطة الثابتة في حساب لامدا. ومع ذلك، فإن الاختزال بيتا يعطي الشكل الأكثر تناسقًا لمركب Y الخاص بكاري.
λ
f
.
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}
تعبير دع متكرر
يتم تعريف تعبير let المتكرر المسمى "let rec" باستخدام مجموعة Y لتعبيرات let المتكررة.
(
l
e
t
r
e
c
x
=
y
in
z
)
≡
(
λ
x
.
z
)
(
Y
(
λ
x
.
y
)
)
{\displaystyle (\operatorname {let\ rec} x=y\operatorname {in} z)\equiv (\lambda x.z)\ (Y\ (\lambda x.y))}
تعبير let المتكرر المتبادل
يتم تعميم هذا النهج بعد ذلك لدعم التكرار المتبادل. يمكن تكوين تعبير let متبادل التكرار عن طريق إعادة ترتيب التعبير لإزالة أي شروط و. يتم تحقيق ذلك عن طريق استبدال تعريفات الوظائف المتعددة بتعريف وظيفة واحد، والذي يحدد قائمة من المتغيرات تساوي قائمة من التعبيرات. ثم يتم استخدام نسخة من مركب Y، تسمى مركب نقطة التثبيت متعدد المتغيرات
Y* [5] لحساب النقطة الثابتة لجميع الوظائف في نفس الوقت. والنتيجة هي تنفيذ متبادل التكرار لتعبير let .
قيم متعددة
يمكن استخدام تعبير let لتمثيل قيمة هي عضو في مجموعة،
let
x
∈
X
in
x
{\displaystyle \operatorname {let} x\in X\operatorname {in} x}
في تطبيق الوظيفة، من تعبير let إلى تعبير آخر،
(
let
x
∈
X
in
x
)
(
let
y
∈
Y
in
y
)
=
let
x
∈
X
∧
y
∈
Y
in
x
y
=
let
(
x
,
y
)
∈
X
×
Y
in
x
y
{\displaystyle {\begin{aligned}&(\operatorname {let} x\in X\operatorname {in} x)\ (\operatorname {let} y\in Y\operatorname {in} y)\\&=\operatorname {let} x\in X\land y\in Y\operatorname {in} x\ y\\&=\operatorname {let} (x,y)\in X\times Y\operatorname {in} x\ y\end{aligned}}}
ولكن هناك قاعدة مختلفة تنطبق على تطبيق تعبير let على نفسه.
(
let
x
∈
X
in
x
)
(
let
x
∈
X
in
x
)
=
let
x
∈
X
in
x
x
{\displaystyle {\begin{aligned}&(\operatorname {let} x\in X\operatorname {in} x)\ (\operatorname {let} x\in X\operatorname {in} x)\\&=\operatorname {let} x\in X\operatorname {in} x\ x\end{aligned}}}
لا يبدو أن هناك قاعدة بسيطة لدمج القيم. ما هو مطلوب هو شكل عام من التعبير يمثل متغيرًا تكون قيمته عضوًا في مجموعة من القيم. يجب أن يعتمد التعبير على المتغير والمجموعة.
يجب أن يعطي تطبيق الوظيفة المطبق على هذا النموذج تعبيرًا آخر بنفس النموذج. وبهذه الطريقة، يمكن التعامل مع أي تعبير على وظائف ذات قيم متعددة كما لو كان له قيمة واحدة.
لا يكفي أن يمثل النموذج مجموعة القيم فقط. يجب أن يكون لكل قيمة شرط يحدد متى يأخذ التعبير القيمة. والبناء الناتج هو مجموعة من أزواج الشروط والقيم، تسمى "مجموعة القيم". راجع تضييق مجموعات القيم الجبرية .
قواعد التحويل بين حساب لامدا وتعبيرات Let
سيتم تقديم الدوال الوصفية التي تصف التحويل بين تعبيرات lambda و let . الدالة الوصفية هي دالة تأخذ برنامجًا كمعامل. البرنامج عبارة عن بيانات للبرنامج الوصفي. البرنامج والبرنامج الوصفي يقعان على مستويات وصفية مختلفة.
سيتم استخدام الاتفاقيات التالية للتمييز بين البرنامج والبرنامج الوصفي،
سيتم استخدام الأقواس المربعة [] لتمثيل تطبيق الوظيفة في البرنامج التعريفي.
سيتم استخدام الأحرف الكبيرة للمتغيرات في البرنامج الوصفي. تمثل الأحرف الصغيرة المتغيرات في البرنامج.
≡
{\displaystyle \equiv }
سيتم استخدامها للمساواة في برنامج meta.
من أجل التبسيط، القاعدة الأولى هي أنه سيتم تطبيق المطابقات. تفترض القواعد أيضًا أن تعبيرات lambda تمت معالجتها مسبقًا بحيث يكون لكل تجريد lambda اسم فريد.
كما يتم استخدام عامل الاستبدال. ويعني التعبير استبدال كل تكرار لـ G في L بـ S وإرجاع التعبير. ويمتد التعريف المستخدم لتغطية استبدال التعبيرات، من التعريف الوارد في صفحة حساب لامدا . يجب أن تقارن مطابقة التعبيرات التعبيرات من أجل تكافؤ ألفا (إعادة تسمية المتغيرات).
L
[
G
:=
S
]
{\displaystyle L[G:=S]}
التحويل من تعبيرات lambda إلى تعبيرات let
تصف القواعد التالية كيفية التحويل من تعبير lambda إلى تعبير let ، دون تغيير البنية.
d
e
-
l
a
m
b
d
a
[
V
]
≡
V
{\displaystyle \operatorname {de-lambda} [V]\equiv V}
d
e
-
l
a
m
b
d
a
[
M
N
]
≡
d
e
-
l
a
m
b
d
a
[
M
]
d
e
-
l
a
m
b
d
a
[
N
]
{\displaystyle \operatorname {de-lambda} [M\ N]\equiv \operatorname {de-lambda} [M]\ \operatorname {de-lambda} [N]}
d
e
-
l
a
m
b
d
a
[
F
=
λ
P
.
E
]
≡
d
e
-
l
a
m
b
d
a
[
F
P
=
E
]
{\displaystyle \operatorname {de-lambda} [F=\lambda P.E]\equiv \operatorname {de-lambda} [F\ P=E]}
d
e
-
l
a
m
b
d
a
[
E
=
F
]
≡
d
e
-
l
a
m
b
d
a
[
E
]
=
d
e
-
l
a
m
b
d
a
[
F
]
{\displaystyle \operatorname {de-lambda} [E=F]\equiv \operatorname {de-lambda} [E]=\operatorname {de-lambda} [F]}
d
e
-
l
a
m
b
d
a
[
(
λ
F
.
E
)
L
]
≡
l
e
t
-
c
o
m
b
i
n
e
[
let
F
:
d
e
-
l
a
m
b
d
a
[
F
=
L
]
in
E
]
{\displaystyle \operatorname {de-lambda} [(\lambda F.E)L]\equiv \operatorname {let-combine} [\operatorname {let} F:\operatorname {de-lambda} [F=L]\operatorname {in} E]}
V
∉
FV
[
λ
F
.
E
]
→
d
e
-
l
a
m
b
d
a
[
λ
F
.
E
]
≡
l
e
t
-
c
o
m
b
i
n
e
[
let
V
:
d
e
-
l
a
m
b
d
a
[
V
F
=
E
]
in
V
]
{\displaystyle V\not \in \operatorname {FV} [\lambda F.E]\to \operatorname {de-lambda} [\lambda F.E]\equiv \operatorname {let-combine} [\operatorname {let} V:\operatorname {de-lambda} [V\ F=E]\operatorname {in} V]}
V
≠
W
→
l
e
t
-
c
o
m
b
i
n
e
[
let
V
:
E
in
let
W
:
F
in
G
]
≡
let
V
,
W
:
E
∧
F
in
G
{\displaystyle V\neq W\to \operatorname {let-combine} [\operatorname {let} V:E\operatorname {in} \operatorname {let} W:F\operatorname {in} G]\equiv \operatorname {let} V,W:E\land F\operatorname {in} G}
l
e
t
-
c
o
m
b
i
n
e
[
let
V
:
E
in
F
]
≡
let
V
:
E
in
F
{\displaystyle \operatorname {let-combine} [\operatorname {let} V:E\operatorname {in} F]\equiv \operatorname {let} V:E\operatorname {in} F}
القاعدة 6 تنشئ متغيرًا فريدًا V، كاسم للوظيفة.
مثال
على سبيل المثال، مجموعة Y ،
λ
f
.
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}
يتم تحويله إلى،
let
p
:
p
f
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
in
p
{\displaystyle \operatorname {let} p:p\ f=\operatorname {let} x:x\ q=f\ (q\ q)\operatorname {in} f\ (x\ x)\operatorname {in} p}
قاعدة
تعبير لامدا
6
d
e
-
l
a
m
b
d
a
[
λ
f
.
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
{\displaystyle \operatorname {de-lambda} [\lambda f.(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]}
V
∉
FV
[
λ
F
.
E
]
→
d
e
-
l
a
m
b
d
a
[
λ
F
.
E
]
{\displaystyle V\not \in \operatorname {FV} [\lambda F.E]\to \operatorname {de-lambda} [\lambda F.E]}
V
=
p
,
F
=
f
,
E
=
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle V=p,F=f,E=(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}
l
e
t
-
c
o
m
b
i
n
e
[
let
V
:
d
e
-
l
a
m
b
d
a
[
V
F
=
E
]
in
V
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} V:\operatorname {de-lambda} [V\ F=E]\operatorname {in} V]}
4
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
=
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f=(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\operatorname {in} p]}
d
e
-
l
a
m
b
d
a
[
p
f
=
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
{\displaystyle \operatorname {de-lambda} [p\ f=(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]}
d
e
-
l
a
m
b
d
a
[
E
=
F
]
{\displaystyle \operatorname {de-lambda} [E=F]}
E
=
p
f
,
F
=
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle E=p\ f,F=(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))}
d
e
-
l
a
m
b
d
a
[
E
]
=
d
e
-
l
a
m
b
d
a
[
F
]
{\displaystyle \operatorname {de-lambda} [E]=\operatorname {de-lambda} [F]}
d
e
-
l
a
m
b
d
a
[
p
f
]
=
d
e
-
l
a
m
b
d
a
[
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
{\displaystyle \operatorname {de-lambda} [p\ f]=\operatorname {de-lambda} [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]}
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
d
e
-
l
a
m
b
d
a
[
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {de-lambda} [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\operatorname {in} p]}
5
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
d
e
-
l
a
m
b
d
a
[
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {de-lambda} [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]\operatorname {in} p]}
d
e
-
l
a
m
b
d
a
[
(
λ
x
.
f
(
x
x
)
)
(
λ
x
.
f
(
x
x
)
)
]
{\displaystyle \operatorname {de-lambda} [(\lambda x.f\ (x\ x))\ (\lambda x.f\ (x\ x))]}
d
e
-
l
a
m
b
d
a
[
(
λ
F
.
E
)
L
]
{\displaystyle \operatorname {de-lambda} [(\lambda F.E)L]}
F
=
x
,
E
=
f
(
x
x
)
,
L
=
(
λ
x
.
f
(
x
x
)
)
{\displaystyle F=x,E=f\ (x\ x),L=(\lambda x.f\ (x\ x))}
l
e
t
-
c
o
m
b
i
n
e
[
let
F
:
d
e
-
l
a
m
b
d
a
[
F
=
L
]
in
E
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} F:\operatorname {de-lambda} [F=L]\operatorname {in} E]}
l
e
t
-
c
o
m
b
i
n
e
[
let
x
:
d
e
-
l
a
m
b
d
a
[
x
=
λ
x
.
f
(
x
x
)
]
in
f
(
x
x
)
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} x:\operatorname {de-lambda} [x=\lambda x.f\ (x\ x)]\operatorname {in} f\ (x\ x)]}
3
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
l
e
t
-
c
o
m
b
i
n
e
[
let
x
:
d
e
-
l
a
m
b
d
a
[
x
=
λ
x
.
f
(
x
x
)
]
in
f
(
x
x
)
]
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {let-combine} [\operatorname {let} x:\operatorname {de-lambda} [x=\lambda x.f\ (x\ x)]\operatorname {in} f\ (x\ x)]\operatorname {in} p]}
d
e
-
l
a
m
b
d
a
[
x
=
λ
x
.
f
(
x
x
)
]
{\displaystyle \operatorname {de-lambda} [x=\lambda x.f\ (x\ x)]}
d
e
-
l
a
m
b
d
a
[
F
=
λ
P
.
E
]
{\displaystyle \operatorname {de-lambda} [F=\lambda P.E]}
F
=
x
,
P
=
x
,
E
=
f
(
x
x
)
{\displaystyle F=x,P=x,E=f\ (x\ x)}
d
e
-
l
a
m
b
d
a
[
F
P
=
E
]
{\displaystyle \operatorname {de-lambda} [F\ P=E]}
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
{\displaystyle \operatorname {de-lambda} [x\ x=f\ (x\ x)]}
8
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
l
e
t
-
c
o
m
b
i
n
e
[
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
]
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {let-combine} [\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)]\operatorname {in} p]}
l
e
t
-
c
o
m
b
i
n
e
[
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)]}
l
e
t
-
c
o
m
b
i
n
e
[
Y
]
{\displaystyle \operatorname {let-combine} [Y]}
Y
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
{\displaystyle Y=\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)}
Y
{\displaystyle Y}
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
{\displaystyle \operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)}
8
l
e
t
-
c
o
m
b
i
n
e
[
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
in
p
]
{\displaystyle \operatorname {let-combine} [\operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)\operatorname {in} p]}
l
e
t
-
c
o
m
b
i
n
e
[
Y
]
{\displaystyle \operatorname {let-combine} [Y]}
Y
=
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
]
in
p
{\displaystyle Y=\operatorname {let} p:\operatorname {de-lambda} [p\ f=\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)]\operatorname {in} p}
Y
{\displaystyle Y}
let
p
:
p
f
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
in
p
{\displaystyle \operatorname {let} p:p\ f=\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)\operatorname {in} p}
4
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
in
f
(
x
x
)
in
p
{\displaystyle \operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {let} x:\operatorname {de-lambda} [x\ x=f\ (x\ x)]\operatorname {in} f\ (x\ x)\operatorname {in} p}
d
e
-
l
a
m
b
d
a
[
x
x
=
f
(
x
x
)
]
{\displaystyle \operatorname {de-lambda} [x\ x=f\ (x\ x)]}
d
e
-
l
a
m
b
d
a
[
E
=
F
]
{\displaystyle \operatorname {de-lambda} [E=F]}
E
=
x
x
,
F
=
f
(
x
x
)
{\displaystyle E=x\ x,F=f\ (x\ x)}
d
e
-
l
a
m
b
d
a
[
E
]
=
d
e
-
l
a
m
b
d
a
[
F
]
{\displaystyle \operatorname {de-lambda} [E]=\operatorname {de-lambda} [F]}
d
e
-
l
a
m
b
d
a
[
x
x
]
=
d
e
-
l
a
m
b
d
a
[
f
(
x
x
)
]
{\displaystyle \operatorname {de-lambda} [x\ x]=\operatorname {de-lambda} [f\ (x\ x)]}
2
let
p
:
d
e
-
l
a
m
b
d
a
[
p
f
]
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
x
]
=
d
e
-
l
a
m
b
d
a
[
f
(
x
x
)
]
in
f
(
x
x
)
in
p
{\displaystyle \operatorname {let} p:\operatorname {de-lambda} [p\ f]=\operatorname {let} x:\operatorname {de-lambda} [x\ x]=\operatorname {de-lambda} [f\ (x\ x)]\operatorname {in} f\ (x\ x)\operatorname {in} p}
d
e
-
l
a
m
b
d
a
[
x
x
]
,
d
e
-
l
a
m
b
d
a
[
f
(
x
x
)
]
{\displaystyle \operatorname {de-lambda} [x\ x],\operatorname {de-lambda} [f\ (x\ x)]}
d
e
-
l
a
m
b
d
a
[
p
f
]
,
d
e
-
l
a
m
b
d
a
[
M
1
N
1
]
,
d
e
-
l
a
m
b
d
a
[
M
2
N
2
]
,
{\displaystyle \operatorname {de-lambda} [p\ f],\operatorname {de-lambda} [M_{1}\ N_{1}],\operatorname {de-lambda} [M_{2}\ N_{2}],}
M
1
=
p
,
N
1
=
f
,
M
2
=
x
,
N
2
=
x
,
M
3
=
f
,
N
3
=
x
x
{\displaystyle M_{1}=p,N_{1}=f,M_{2}=x,N_{2}=x,M_{3}=f,N_{3}=x\ x}
d
e
-
l
a
m
b
d
a
[
M
1
]
d
e
-
l
a
m
b
d
a
[
N
1
]
,
d
e
-
l
a
m
b
d
a
[
M
2
]
d
e
-
l
a
m
b
d
a
[
N
2
]
,
d
e
-
l
a
m
b
d
a
[
M
3
]
d
e
-
l
a
m
b
d
a
[
N
3
]
{\displaystyle \operatorname {de-lambda} [M_{1}]\ \operatorname {de-lambda} [N_{1}],\operatorname {de-lambda} [M_{2}]\ \operatorname {de-lambda} [N_{2}],\operatorname {de-lambda} [M_{3}]\ \operatorname {de-lambda} [N_{3}]}
d
e
-
l
a
m
b
d
a
[
p
]
d
e
-
l
a
m
b
d
a
[
f
]
,
d
e
-
l
a
m
b
d
a
[
x
]
d
e
-
l
a
m
b
d
a
[
x
]
,
d
e
-
l
a
m
b
d
a
[
f
]
d
e
-
l
a
m
b
d
a
[
x
]
d
e
-
l
a
m
b
d
a
[
x
]
{\displaystyle \operatorname {de-lambda} [p]\ \operatorname {de-lambda} [f],\operatorname {de-lambda} [x]\ \operatorname {de-lambda} [x],\operatorname {de-lambda} [f]\ \operatorname {de-lambda} [x]\ \operatorname {de-lambda} [x]}
1
let
p
:
d
e
-
l
a
m
b
d
a
[
p
]
d
e
-
l
a
m
b
d
a
[
f
]
=
let
x
:
d
e
-
l
a
m
b
d
a
[
x
]
d
e
-
l
a
m
b
d
a
[
x
]
=
d
e
-
l
a
m
b
d
a
[
f
]
(
d
e
-
l
a
m
b
d
a
[
x
]
d
e
-
l
a
m
b
d
a
[
x
]
)
in
f
(
x
x
)
]
in
p
{\displaystyle \operatorname {let} p:\operatorname {de-lambda} [p]\ \operatorname {de-lambda} [f]=\operatorname {let} x:\operatorname {de-lambda} [x]\ \operatorname {de-lambda} [x]=\operatorname {de-lambda} [f]\ (\operatorname {de-lambda} [x]\ \operatorname {de-lambda} [x])\operatorname {in} f\ (x\ x)]\operatorname {in} p}
d
e
-
l
a
m
b
d
a
[
V
]
{\displaystyle \operatorname {de-lambda} [V]}
V
{\displaystyle V}
let
p
:
p
f
=
let
x
:
x
x
=
f
(
x
x
)
in
f
(
x
x
)
]
in
p
{\displaystyle \operatorname {let} p:p\ f=\operatorname {let} x:x\ x=f\ (x\ x)\operatorname {in} f\ (x\ x)]\operatorname {in} p}
التحويل من تعبيرات let إلى تعبيرات lambda
تعكس هذه القواعد التحويل الموصوف أعلاه. فهي تحول من تعبير let إلى تعبير lambda، دون تغيير البنية. لا يمكن تحويل جميع تعبيرات let باستخدام هذه القواعد. تفترض القواعد أن التعبيرات مرتبة بالفعل كما لو كانت قد تم إنشاؤها بواسطة de-lambda .
g
e
t
-
l
a
m
b
d
a
[
F
,
G
V
=
E
]
=
g
e
t
-
l
a
m
b
d
a
[
F
,
G
=
λ
V
.
E
]
{\displaystyle \operatorname {get-lambda} [F,G\ V=E]=\operatorname {get-lambda} [F,G=\lambda V.E]}
g
e
t
-
l
a
m
b
d
a
[
F
,
F
=
E
]
=
d
e
-
l
e
t
[
E
]
{\displaystyle \operatorname {get-lambda} [F,F=E]=\operatorname {de-let} [E]}
d
e
-
l
e
t
[
λ
V
.
E
]
≡
λ
V
.
d
e
-
l
e
t
[
E
]
{\displaystyle \operatorname {de-let} [\lambda V.E]\equiv \lambda V.\operatorname {de-let} [E]}
d
e
-
l
e
t
[
M
N
]
≡
d
e
-
l
e
t
[
M
]
d
e
-
l
e
t
[
N
]
{\displaystyle \operatorname {de-let} [M\ N]\equiv \operatorname {de-let} [M]\ \operatorname {de-let} [N]}
d
e
-
l
e
t
[
V
]
≡
V
{\displaystyle \operatorname {de-let} [V]\equiv V}
V
∉
F
V
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
:
E
in
V
]
≡
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
{\displaystyle V\not \in FV[\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} V]\equiv \operatorname {get-lambda} [V,E]}
V
∉
F
V
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
:
E
in
L
]
≡
(
λ
V
.
d
e
-
l
e
t
[
L
]
)
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
{\displaystyle V\not \in FV[\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} L]\equiv (\lambda V.\operatorname {de-let} [L])\ \operatorname {get-lambda} [V,E]}
W
∉
FV
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
,
W
:
E
∧
F
in
G
]
≡
d
e
-
l
e
t
[
let
V
:
E
in
let
W
:
F
in
G
]
{\displaystyle W\not \in \operatorname {FV} [\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V,W:E\land F\ \operatorname {in} G]\equiv \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} \operatorname {let} W:F\ \operatorname {in} G]}
V
∈
FV
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
:
E
in
L
]
≡
d
e
-
l
e
t
[
let
V
:
V
V
=
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
[
V
:=
V
V
]
in
L
[
V
:=
V
V
]
]
{\displaystyle V\in \operatorname {FV} [\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} L]\equiv \operatorname {de-let} [\operatorname {let} V:V\ V=\operatorname {get-lambda} [V,E][V:=V\ V]\ \operatorname {in} L[V:=V\ V]]}
W
∈
FV
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
,
W
:
E
∧
F
in
L
]
≡
d
e
-
l
e
t
[
let
V
:
V
W
=
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
[
V
:=
V
W
]
in
let
W
:
F
[
V
:=
V
W
]
in
L
[
V
:=
V
W
]
]
{\displaystyle W\in \operatorname {FV} [\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V,W:E\land F\ \operatorname {in} L]\equiv \operatorname {de-let} [\operatorname {let} V:V\ W=\operatorname {get-lambda} [V,E][V:=V\ W]\ \operatorname {in} \operatorname {let} W:F[V:=V\ W]\ \operatorname {in} L[V:=V\ W]]}
لا يوجد معادل هيكلي دقيق في حساب لامدا لتعبيرات let التي تحتوي على متغيرات حرة يتم استخدامها بشكل متكرر. في هذه الحالة، يلزم إضافة بعض المعلمات. تضيف القاعدتان 8 و10 هذه المعلمات.
القاعدتان 8 و10 كافيتين لمعادلتين متبادلتين التكرار في تعبير let . ومع ذلك، لن تعملا لثلاث معادلات متبادلة التكرار أو أكثر. تحتاج الحالة العامة إلى مستوى إضافي من التكرار مما يجعل الدالة الوصفية أكثر صعوبة بعض الشيء. تحل القواعد التالية محل القاعدتين 8 و10 في تنفيذ الحالة العامة. تم ترك القاعدتين 8 و10 حتى يمكن دراسة الحالة الأبسط أولاً.
lambda-form - تحويل التعبير إلى مجموعة من التعبيرات، كل منها من النموذج المتغير = expression .
l
a
m
b
d
a
-
f
o
r
m
[
G
V
=
E
]
=
l
a
m
b
d
a
-
f
o
r
m
[
G
=
λ
V
.
E
]
{\displaystyle \operatorname {lambda-form} [G\ V=E]=\operatorname {lambda-form} [G=\lambda V.E]}
l
a
m
b
d
a
-
f
o
r
m
[
E
∧
F
]
=
l
a
m
b
d
a
-
f
o
r
m
[
E
]
∧
l
a
m
b
d
a
-
f
o
r
m
[
F
]
{\displaystyle \operatorname {lambda-form} [E\land F]=\operatorname {lambda-form} [E]\land \operatorname {lambda-form} [F]}
l
a
m
b
d
a
-
f
o
r
m
[
V
=
E
]
=
V
=
E
{\displaystyle \operatorname {lambda-form} [V=E]=V=E}
...... حيث V هو متغير.
lift-vars - الحصول على مجموعة المتغيرات التي تحتاج إلى X كمعلمة، لأن التعبير يحتوي على X كمتغير حر.
X
∈
FV
[
E
]
→
l
i
f
t
-
v
a
r
s
[
X
,
V
=
E
]
=
{
V
}
{\displaystyle X\in \operatorname {FV} [E]\to \operatorname {lift-vars} [X,V=E]=\{V\}}
X
∉
FV
[
E
]
→
l
i
f
t
-
v
a
r
s
[
X
,
V
=
E
]
=
{
}
{\displaystyle X\not \in \operatorname {FV} [E]\to \operatorname {lift-vars} [X,V=E]=\{\}}
l
i
f
t
-
v
a
r
s
[
X
,
E
∧
F
]
=
l
i
f
t
-
v
a
r
s
[
X
,
E
]
∪
l
i
f
t
-
v
a
r
s
[
X
.
F
]
{\displaystyle \operatorname {lift-vars} [X,E\land F]=\operatorname {lift-vars} [X,E]\cup \operatorname {lift-vars} [X.F]}
المتغيرات الفرعية - لكل متغير في المجموعة، استبدله بالمتغير المطبق على X في التعبير. هذا يجعل X متغيرًا يتم تمريره كمعلمة، بدلاً من كونه متغيرًا حرًا في الجانب الأيمن من المعادلة.
s
u
b
-
v
a
r
s
[
E
,
{
V
}
∪
S
,
X
]
=
s
u
b
-
v
a
r
s
[
E
[
V
:=
V
X
]
,
S
,
X
]
{\displaystyle \operatorname {sub-vars} [E,\{V\}\cup S,X]=\operatorname {sub-vars} [E[V:=V\ X],S,X]}
s
u
b
-
v
a
r
s
[
E
,
{
}
,
X
]
=
E
{\displaystyle \operatorname {sub-vars} [E,\{\},X]=E}
إزالة - رفع كل شرط في E بحيث لا يكون X متغيرًا حرًا على الجانب الأيمن من المعادلة.
L
=
l
a
m
b
d
a
-
f
o
r
m
[
E
]
∧
S
=
l
i
f
t
-
v
a
r
s
[
X
,
L
]
→
d
e
-
l
e
t
[
let
V
…
W
,
X
:
E
∧
F
in
G
]
≡
d
e
-
l
e
t
[
let
V
…
W
:
s
u
b
-
v
a
r
s
[
L
,
S
,
X
]
in
let
s
u
b
-
v
a
r
s
[
l
a
m
b
d
a
-
f
o
r
m
[
F
]
,
S
,
X
]
in
s
u
b
-
v
a
r
s
[
G
,
S
,
X
]
]
{\displaystyle {\begin{aligned}L&=\operatorname {lambda-form} [E]\land S=\operatorname {lift-vars} [X,L]\to \operatorname {de-let} [\operatorname {let} V\ldots W,X:E\land F\ \operatorname {in} G]\\&\equiv \operatorname {de-let} [\operatorname {let} V\ldots W:\operatorname {sub-vars} [L,S,X]\ \operatorname {in} \operatorname {let} \operatorname {sub-vars} [\operatorname {lambda-form} [F],S,X]\ \operatorname {in} \operatorname {sub-vars} [G,S,X]]\end{aligned}}}
أمثلة
على سبيل المثال، تعبير let الذي تم الحصول عليه من مجموعة Y ،
let
p
:
p
f
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
in
p
{\displaystyle \operatorname {let} p:p\ f=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)\ \operatorname {in} p}
يتم تحويله إلى،
λ
f
.
(
λ
x
.
f
(
x
x
)
)
(
λ
q
.
f
(
q
q
)
)
{\displaystyle \lambda f.(\lambda x.f\ (x\ x))\ (\lambda q.f\ (q\ q))}
قاعدة
تعبير لامدا
6
d
e
-
l
e
t
[
let
p
:
p
f
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
in
p
]
{\displaystyle \operatorname {de-let} [\operatorname {let} p:p\ f=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)\ \operatorname {in} p]}
d
e
-
l
e
t
[
let
V
:
E
in
V
]
{\displaystyle \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} V]}
V
=
p
,
E
=
p
f
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
{\displaystyle V=p,E=p\ f=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)}
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
{\displaystyle \operatorname {get-lambda} [V,E]}
1
g
e
t
-
l
a
m
b
d
a
[
p
,
p
f
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
]
{\displaystyle \operatorname {get-lambda} [p,p\ f=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)]}
g
e
t
-
l
a
m
b
d
a
[
F
,
G
V
=
E
]
{\displaystyle \operatorname {get-lambda} [F,G\ V=E]}
F
=
p
,
G
=
p
,
V
=
f
,
E
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
{\displaystyle F=p,G=p,V=f,E=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)}
g
e
t
-
l
a
m
b
d
a
[
F
,
G
=
λ
V
.
E
]
{\displaystyle \operatorname {get-lambda} [F,G=\lambda V.E]}
2
g
e
t
-
l
a
m
b
d
a
[
p
,
p
=
λ
f
.
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
]
{\displaystyle \operatorname {get-lambda} [p,p=\lambda f.\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)]}
g
e
t
-
l
a
m
b
d
a
[
F
,
F
=
E
]
{\displaystyle \operatorname {get-lambda} [F,F=E]}
F
=
p
,
E
=
λ
f
.
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
{\displaystyle F=p,E=\lambda f.\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)}
d
e
-
l
e
t
[
E
]
{\displaystyle \operatorname {de-let} [E]}
3
d
e
-
l
e
t
[
λ
f
.
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
]
{\displaystyle \operatorname {de-let} [\lambda f.\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)]}
d
e
-
l
e
t
[
λ
V
.
E
]
{\displaystyle \operatorname {de-let} [\lambda V.E]}
V
=
f
,
E
=
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
{\displaystyle V=f,E=\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)}
λ
V
.
d
e
-
l
e
t
[
E
]
{\displaystyle \lambda V.\operatorname {de-let} [E]}
7
λ
f
.
d
e
-
l
e
t
[
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
]
{\displaystyle \lambda f.\operatorname {de-let} [\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)]}
d
e
-
l
e
t
[
let
x
:
x
q
=
f
(
q
q
)
in
f
(
x
x
)
]
{\displaystyle \operatorname {de-let} [\operatorname {let} x:x\ q=f\ (q\ q)\ \operatorname {in} f\ (x\ x)]}
V
∉
F
V
[
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
]
→
d
e
-
l
e
t
[
let
V
:
E
in
L
]
{\displaystyle V\not \in FV[\operatorname {get-lambda} [V,E]]\to \operatorname {de-let} [\operatorname {let} V:E\ \operatorname {in} L]}
V
=
x
,
E
=
x
q
=
f
(
q
q
)
,
L
=
f
(
x
x
)
{\displaystyle V=x,E=x\ q=f\ (q\ q),L=f\ (x\ x)}
(
λ
V
.
d
e
-
l
e
t
[
L
]
)
g
e
t
-
l
a
m
b
d
a
[
V
,
E
]
{\displaystyle (\lambda V.\operatorname {de-let} [L])\ \operatorname {get-lambda} [V,E]}
4
(
λ
x
.
d
e
-
l
e
t
[
f
(
x
x
)
]
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
q
=
f
(
q
q
)
]
{\displaystyle (\lambda x.\operatorname {de-let} [f\ (x\ x)])\ \operatorname {get-lambda} [x,x\ q=f\ (q\ q)]}
d
e
-
l
e
t
[
f
(
x
x
)
]
{\displaystyle \operatorname {de-let} [f\ (x\ x)]}
d
e
-
l
e
t
[
M
N
]
{\displaystyle \operatorname {de-let} [M\ N]}
M
=
f
,
N
=
(
x
x
)
{\displaystyle M=f,N=(x\ x)}
d
e
-
l
e
t
[
M
]
d
e
-
l
e
t
[
N
]
{\displaystyle \operatorname {de-let} [M]\ \operatorname {de-let} [N]}
d
e
-
l
e
t
[
f
]
d
e
-
l
e
t
[
x
x
]
{\displaystyle \operatorname {de-let} [f]\ \operatorname {de-let} [x\ x]}
4
(
λ
x
.
d
e
-
l
e
t
[
f
]
d
e
-
l
e
t
[
x
x
]
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
q
=
f
(
q
q
)
]
{\displaystyle (\lambda x.\operatorname {de-let} [f]\ \operatorname {de-let} [x\ x])\ \operatorname {get-lambda} [x,x\ q=f\ (q\ q)]}
d
e
-
l
e
t
[
x
x
]
{\displaystyle \operatorname {de-let} [x\ x]}
d
e
-
l
e
t
[
M
N
]
{\displaystyle \operatorname {de-let} [M\ N]}
M
=
x
,
N
=
x
{\displaystyle M=x,N=x}
d
e
-
l
e
t
[
M
]
d
e
-
l
e
t
[
N
]
{\displaystyle \operatorname {de-let} [M]\ \operatorname {de-let} [N]}
d
e
-
l
e
t
[
x
]
d
e
-
l
e
t
[
x
]
{\displaystyle \operatorname {de-let} [x]\ \operatorname {de-let} [x]}
5
(
λ
x
.
d
e
-
l
e
t
[
f
]
(
d
e
-
l
e
t
[
x
]
d
e
-
l
e
t
[
x
]
)
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
q
=
f
(
q
q
)
]
{\displaystyle (\lambda x.\operatorname {de-let} [f]\ (\operatorname {de-let} [x]\ \operatorname {de-let} [x]))\ \operatorname {get-lambda} [x,x\ q=f\ (q\ q)]}
d
e
-
l
e
t
[
V
]
{\displaystyle \operatorname {de-let} [V]}
V
{\displaystyle V}
1
(
λ
x
.
f
(
x
x
)
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
q
=
f
(
q
q
)
]
{\displaystyle (\lambda x.f\ (x\ x))\ \operatorname {get-lambda} [x,x\ q=f\ (q\ q)]}
g
e
t
-
l
a
m
b
d
a
[
x
,
x
q
=
f
(
q
q
)
]
{\displaystyle \operatorname {get-lambda} [x,x\ q=f\ (q\ q)]}
g
e
t
-
l
a
m
b
d
a
[
F
,
G
V
=
E
]
{\displaystyle \operatorname {get-lambda} [F,G\ V=E]}
F
=
x
,
G
=
x
,
V
=
q
,
E
=
f
(
q
q
)
{\displaystyle F=x,G=x,V=q,E=f\ (q\ q)}
g
e
t
-
l
a
m
b
d
a
[
F
,
G
=
λ
V
.
E
]
{\displaystyle \operatorname {get-lambda} [F,G=\lambda V.E]}
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
q
.
f
(
q
q
)
]
{\displaystyle \operatorname {get-lambda} [x,x=\lambda q.f\ (q\ q)]}
2
(
λ
x
.
f
(
x
x
)
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
q
.
f
(
q
q
)
]
{\displaystyle (\lambda x.f\ (x\ x))\ \operatorname {get-lambda} [x,x=\lambda q.f\ (q\ q)]}
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
q
.
f
(
q
q
)
]
{\displaystyle \operatorname {get-lambda} [x,x=\lambda q.f\ (q\ q)]}
g
e
t
-
l
a
m
b
d
a
[
F
,
F
=
E
]
{\displaystyle \operatorname {get-lambda} [F,F=E]}
F
=
x
,
E
=
λ
q
.
f
(
q
q
)
{\displaystyle F=x,E=\lambda q.f\ (q\ q)}
d
e
-
l
e
t
[
E
]
{\displaystyle \operatorname {de-let} [E]}
d
e
-
l
e
t
[
λ
q
.
f
(
q
q
)
]
{\displaystyle \operatorname {de-let} [\lambda q.f\ (q\ q)]}
3
(
λ
x
.
f
(
x
x
)
)
d
e
-
l
e
t
[
λ
q
.
f
(
q
q
)
]
{\displaystyle (\lambda x.f\ (x\ x))\ \operatorname {de-let} [\lambda q.f\ (q\ q)]}
d
e
-
l
e
t
[
λ
q
.
f
(
q
q
)
]
{\displaystyle \operatorname {de-let} [\lambda q.f\ (q\ q)]}
d
e
-
l
e
t
[
λ
V
.
E
]
{\displaystyle \operatorname {de-let} [\lambda V.E]}
V
=
q
,
E
=
f
(
q
q
)
{\displaystyle V=q,E=f\ (q\ q)}
λ
V
.
d
e
-
l
e
t
[
E
]
{\displaystyle \lambda V.\operatorname {de-let} [E]}
λ
q
.
d
e
-
l
e
t
[
f
(
q
q
)
]
{\displaystyle \lambda q.\operatorname {de-let} [f\ (q\ q)]}
4
(
λ
x
.
f
(
x
x
)
)
(
λ
q
.
d
e
-
l
e
t
[
f
(
q
q
)
]
)
{\displaystyle (\lambda x.f\ (x\ x))\ (\lambda q.\operatorname {de-let} [f\ (q\ q)])}
d
e
-
l
e
t
[
f
(
q
q
)
]
{\displaystyle \operatorname {de-let} [f\ (q\ q)]}
d
e
-
l
e
t
[
M
1
N
1
]
{\displaystyle \operatorname {de-let} [M_{1}\ N_{1}]}
M
1
=
f
,
N
1
=
q
q
{\displaystyle M_{1}=f,N_{1}=q\ q}
d
e
-
l
e
t
[
M
1
]
d
e
-
l
e
t
[
N
1
]
{\displaystyle \operatorname {de-let} [M_{1}]\ \operatorname {de-let} [N_{1}]}
d
e
-
l
e
t
[
f
]
d
e
-
l
e
t
[
q
q
]
{\displaystyle \operatorname {de-let} [f]\ \operatorname {de-let} [q\ q]}
d
e
-
l
e
t
[
M
2
N
2
]
{\displaystyle \operatorname {de-let} [M_{2}\ N_{2}]}
M
2
=
q
,
N
2
=
q
{\displaystyle M_{2}=q,N_{2}=q}
d
e
-
l
e
t
[
q
]
d
e
-
l
e
t
[
q
]
{\displaystyle \operatorname {de-let} [q]\ \operatorname {de-let} [q]}
5
(
λ
x
.
f
(
x
x
)
)
(
λ
q
.
d
e
-
l
e
t
[
f
]
(
d
e
-
l
e
t
[
q
]
d
e
-
l
e
t
[
q
]
)
)
{\displaystyle (\lambda x.f\ (x\ x))\ (\lambda q.\operatorname {de-let} [f]\ (\operatorname {de-let} [q]\ \operatorname {de-let} [q]))}
d
e
-
l
e
t
[
V
]
{\displaystyle \operatorname {de-let} [V]}
{\displaystyle }
V
{\displaystyle V}
(
λ
x
.
f
(
x
x
)
)
(
λ
q
.
f
(
q
q
)
)
{\displaystyle (\lambda x.f\ (x\ x))\ (\lambda q.f\ (q\ q))}
للحصول على مثال ثانٍ، خذ النسخة المرفوعة من مُركب Y ،
let
p
,
q
:
p
f
x
=
f
(
x
x
)
∧
q
p
f
=
(
p
f
)
(
p
f
)
in
q
p
{\displaystyle \operatorname {let} p,q:p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} q\ p}
يتم تحويله إلى،
(
λ
p
.
(
λ
q
.
q
p
)
λ
p
.
λ
f
.
(
p
f
)
(
p
f
)
)
λ
f
.
λ
x
.
f
(
x
x
)
{\displaystyle (\lambda p.(\lambda q.q\ p)\ \lambda p.\lambda f.(p\ f)\ (p\ f))\ \lambda f.\lambda x.f\ (x\ x)}
قاعدة
تعبير لامدا
8
d
e
-
l
e
t
[
let
p
,
q
:
p
f
x
=
f
(
x
x
)
∧
q
p
f
=
(
p
f
)
(
p
f
)
in
q
p
]
{\displaystyle \operatorname {de-let} [\operatorname {let} p,q:p\ f\ x=f\ (x\ x)\land q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} q\ p]}
7
d
e
-
l
e
t
[
let
p
:
p
f
x
=
f
(
x
x
)
in
let
q
:
q
p
f
=
(
p
f
)
(
p
f
)
in
q
p
]
{\displaystyle \operatorname {de-let} [\operatorname {let} p:p\ f\ x=f\ (x\ x)\ \operatorname {in} \operatorname {let} q:q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} q\ p]}
1, 2
(
λ
p
.
d
e
-
l
e
t
[
let
q
:
q
p
f
=
(
p
f
)
(
p
f
)
in
q
p
]
)
g
e
t
-
l
a
m
b
d
a
[
p
,
p
f
x
=
f
(
x
x
)
]
{\displaystyle (\lambda p.\operatorname {de-let} [\operatorname {let} q:q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} q\ p])\ \operatorname {get-lambda} [p,p\ f\ x=f\ (x\ x)]}
7، 4، 5
(
λ
p
.
d
e
-
l
e
t
[
let
q
:
q
p
f
=
(
p
f
)
(
p
f
)
in
q
p
]
)
λ
f
.
λ
x
.
f
(
x
x
)
{\displaystyle (\lambda p.\operatorname {de-let} [\operatorname {let} q:q\ p\ f=(p\ f)\ (p\ f)\ \operatorname {in} q\ p])\ \lambda f.\lambda x.f\ (x\ x)}
1, 2
(
λ
p
.
(
λ
q
.
q
p
)
g
e
t
-
l
a
m
b
d
a
[
q
,
q
p
f
=
(
p
f
)
(
p
f
)
]
)
λ
f
.
λ
x
.
f
(
x
x
)
{\displaystyle (\lambda p.(\lambda q.q\ p)\ \operatorname {get-lambda} [q,q\ p\ f=(p\ f)\ (p\ f)])\ \lambda f.\lambda x.f\ (x\ x)}
(
λ
p
.
(
λ
q
.
q
p
)
λ
p
.
λ
f
.
(
p
f
)
(
p
f
)
)
λ
f
.
λ
x
.
f
(
x
x
)
{\displaystyle (\lambda p.(\lambda q.q\ p)\ \lambda p.\lambda f.(p\ f)\ (p\ f))\ \lambda f.\lambda x.f\ (x\ x)}
وللحصول على مثال ثالث، فإن ترجمة،
let
x
:
x
f
=
f
(
x
f
)
in
x
{\displaystyle \operatorname {let} x:x\ f=f\ (x\ f)\ \operatorname {in} x}
يكون،
(
λ
x
.
x
x
)
(
λ
x
.
λ
f
.
f
(
x
x
f
)
)
{\displaystyle (\lambda x.x\ x)\ (\lambda x.\lambda f.f\ (x\ x\ f))}
قاعدة
تعبير لامدا
9
let
x
:
x
f
=
f
(
x
f
)
in
x
{\displaystyle \operatorname {let} x:x\ f=f\ (x\ f)\ \operatorname {in} x}
1
let
x
:
x
x
=
g
e
t
-
l
a
m
b
d
a
[
x
,
x
f
=
f
(
x
f
)
]
[
x
:=
x
x
]
in
x
[
x
:=
x
x
]
{\displaystyle \operatorname {let} x:x\ x=\operatorname {get-lambda} [x,x\ f=f\ (x\ f)][x:=x\ x]\ \operatorname {in} x[x:=x\ x]}
2
let
x
:
x
x
=
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
f
.
f
(
x
f
)
]
[
x
:=
x
x
]
in
x
x
{\displaystyle \operatorname {let} x:x\ x=\operatorname {get-lambda} [x,x=\lambda f.f\ (x\ f)][x:=x\ x]\ \operatorname {in} x\ x}
let
x
:
x
x
=
(
λ
f
.
f
(
x
f
)
)
[
x
:=
x
x
]
in
x
x
{\displaystyle \operatorname {let} x:x\ x=(\lambda f.f\ (x\ f))[x:=x\ x]\ \operatorname {in} x\ x}
7
let
x
:
x
x
=
λ
f
.
f
(
x
x
f
)
in
x
x
{\displaystyle \operatorname {let} x:x\ x=\lambda f.f\ (x\ x\ f)\ \operatorname {in} x\ x}
1
(
λ
x
.
x
x
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
x
=
λ
f
.
f
(
x
x
f
)
]
{\displaystyle (\lambda x.x\ x)\ \operatorname {get-lambda} [x,x\ x=\lambda f.f\ (x\ x\ f)]}
2
(
λ
x
.
x
x
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
x
.
λ
f
.
f
(
x
x
f
)
]
{\displaystyle (\lambda x.x\ x)\ \operatorname {get-lambda} [x,x=\lambda x.\lambda f.f\ (x\ x\ f)]}
(
λ
x
.
x
x
)
(
λ
x
.
λ
f
.
f
(
x
x
f
)
)
{\displaystyle (\lambda x.x\ x)\ (\lambda x.\lambda f.f\ (x\ x\ f))}
على سبيل المثال الرابع، ترجمة،
let
x
:
x
=
f
x
in
x
{\displaystyle \operatorname {let} x:x=f\ x\ \operatorname {in} x}
يكون،
(
λ
x
.
x
x
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle (\lambda x.x\ x)\ (\lambda x.f\ (x\ x))}
وهو المركب y الشهير .
قاعدة
تعبير لامدا
9
let
x
:
x
=
f
x
in
x
{\displaystyle \operatorname {let} x:x=f\ x\ \operatorname {in} x}
2
let
x
:
x
x
=
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
f
x
]
[
x
:=
x
x
]
in
x
[
x
:=
x
x
]
{\displaystyle \operatorname {let} x:x\ x=\operatorname {get-lambda} [x,x=f\ x][x:=x\ x]\ \operatorname {in} x[x:=x\ x]}
let
x
:
x
x
=
(
f
x
)
[
x
:=
x
x
]
in
x
x
{\displaystyle \operatorname {let} x:x\ x=(f\ x)[x:=x\ x]\ \operatorname {in} x\ x}
7
let
x
:
x
x
=
f
(
x
x
)
in
x
x
{\displaystyle \operatorname {let} x:x\ x=f\ (x\ x)\ \operatorname {in} x\ x}
1
(
λ
x
.
x
x
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
x
=
f
(
x
x
)
]
{\displaystyle (\lambda x.x\ x)\ \operatorname {get-lambda} [x,x\ x=f\ (x\ x)]}
2
(
λ
x
.
x
x
)
g
e
t
-
l
a
m
b
d
a
[
x
,
x
=
λ
x
.
f
(
x
x
)
]
{\displaystyle (\lambda x.x\ x)\ \operatorname {get-lambda} [x,x=\lambda x.f\ (x\ x)]}
(
λ
x
.
x
x
)
(
λ
x
.
f
(
x
x
)
)
{\displaystyle (\lambda x.x\ x)\ (\lambda x.f\ (x\ x))}
الأشخاص الرئيسيون
انظر أيضا
مراجع
^ "PCF هي لغة برمجة للوظائف القابلة للحساب، استنادًا إلى LCF، منطق سكوت للوظائف القابلة للحساب" (Plotkin 1977). يستخدم برمجة الوظائف القابلة للحساب (Mitchell 1996). يُشار إليها أيضًا باسم البرمجة باستخدام الوظائف القابلة للحساب أو لغة برمجة للوظائف القابلة للحساب .
^ "المخطط - المتغيرات وتعبيرات Let".
^ سيمون، مارلو (2010). "تقرير لغة هاسكل 2010 - تعبيرات دع".
^ Landin, Peter J. (1964). "التقييم الميكانيكي للتعبيرات". مجلة الكمبيوتر . 6 (4). الجمعية البريطانية للحاسب الآلي : 308-320. doi : 10.1093/comjnl/6.4.308 .
^ "أبسط مجموعات نقطة الإصلاح متعددة المتغيرات للتكرار المتبادل".
الأعمال المذكورة
ميتشل، جون سي. (1996). أساسيات لغات البرمجة. مطبعة معهد ماساتشوستس للتكنولوجيا. رقم ISBN 978-0-262-13321-0 .
بلوتكين، جي دي (ديسمبر 1977). "LCF تعتبر لغة برمجة". علوم الكمبيوتر النظرية . 5 (3): 223-255. doi : 10.1016/0304-3975(77)90044-5 .
Rate this translation
Your feedback will be used to help improve Google Translate