ΠΡΠΈΠΌΠ΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ
Let String Expr Expr — Π±Π»ΠΎΠΊ Π ΡΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠ°. ΠΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ, Ρ. Π΅. ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅Π»Π΅ Π±Π»ΠΎΠΊΠ°, Π½ΠΎ ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅ΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ. Π‘ΡΠΈΡΠ°Ρ Y-ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ Y, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΡΠΈΠΌΠ΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
ΠΠ°Π΄Π°ΡΠ° 11.1. ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π»ΡΠΌΠ±Π΄Π°-ΠΈΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π² ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ΅ 11.1:
data ΠΡ ΡΠ³ =
Integral Integer | — ΡΠ΅Π»ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
Logical Bool | — Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
Function String | — ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Variable String | — ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ.
Lambda String Expr | — Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
Application Expr Expr | — ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
Let String Expr Expr | — ΠΏΡΠΎΡΡΠΎΠΉ Π±Π»ΠΎΠΊ.
Letrec [ (String, Expr)] Expr — ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ ΠΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°-ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ, Π·Π°ΠΌΠ΅Π½ΡΡ Π²ΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π°. Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ , ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ Lambda, Let ΠΈ Letrec. ΠΡΠ»ΠΈ ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΌ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΡΠΎ Π²Π½ΡΡΡΠΈ ΡΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ. ΠΡΡΡΠ΄Π° ΡΡΠ°Π·Ρ ΠΆΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠΎΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ: alpha:: String -> String -> Expr -> Expr alpha old new e@ (Variable x) | x == old = Variable new.
| otherwise = e.
alpha old new (Application el e2) = Application (alpha old new el).
(alpha old new e2).
alpha old new e0 (Lambda x body).
| x == old = e.
| otherwise = Lambda x $ alpha old new body alpha old new (Let x el e2).
| x == old = Let x (alpha old new el) e2 | otherwise = Let x (alpha old new el) (alpha old new e2) alpha old new e@(Letrec pairs body).
| old 'elem' (map fst pairs) = e.
I otherwise = Letrec (map rename pairs) $ alpha old new body where rename (name, expr) = (name, alpha old new expr) alpha _ _ e = e.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ (Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ) Π±Π»ΠΎΠΊΠ° ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅Π»Π΅ Π±Π»ΠΎΠΊΠ°, Π½ΠΎ Π½Π΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ let Ρ = Ρ +1 in Ρ +2 Π² ΡΠ°ΡΡΠΈ Ρ +1 ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Ρ — ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ, Π° Π² ΡΠ°ΡΡΠΈ Ρ +2 — ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ.
ΠΠ°Π΄Π°ΡΠ° 11.2. Π Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ Π² Π·Π°Π΄Π°ΡΠ΅ 11.1, ΠΏΡΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π²ΡΡΠΈΡΠ°Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ. Π£ΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΈΠ΄Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ:
- β’ 0 * Π΅, Π΅ * 0 ^ Π
- β’ 1 * Π΅, Π΅ * 1 —> Π΅
- β’ 0 + Π΅, Π΅ + 0 -> Π΅
- β’ Π΅ — 0 -" Π΅
Π Π΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ°Π΄Π°ΡΠ° Π½Π΅ΡΠ»ΠΎΠΆΠ½Π°Ρ, ΠΎΠ½Π° ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ Π°Π½Π°Π»ΠΈΠ·Ρ ΡΠΎΡΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΡΡΠ΄Π½ΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ· ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ (1 * Π΅) * (Π΅ * 0), Π½ΡΠΆΠ½ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ Π΅ ΠΈ 0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π° ΠΏΠΎΡΠΎΠΌ ΡΠΆΠ΅ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π½ΡΠ»Ρ. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π°Π½Π°Π»ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ.
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠΈΠΏΠ° ΠΡ ΡΠ³:
Application (Application (Function f) el) e2.
Π³Π΄Π΅ f — ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ «+ «, ΠΈΠ»ΠΈ Π€ΡΠ½ΠΊΡΠΈΡ simplify, ΡΠ΅ΡΠ°ΡΡΠ°Ρ Π·Π°Π΄Π°ΡΡ, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
simplify: ΠΡ ΡΠ³ -> ΠΡ ΡΠ³.
simplify (Lambda Ρ body) = Lambda Ρ (simplify body) simplify (Let x el e2) = Let x (simplify el) (simplify e2) simplify (Letrec pairs body) =.
Letrec (map simple pairs) $ simplify body where simple (name, expr) = (name, simplify expr) simplify (Application (Application (Function f) el) e2) = case (f, sel, se2) of
(«*», e, Integral 0) -> Integral 0.
Integral 0, e) -> Integral 0.
- («*», e, Integral 1) -> e
- («*», Integral 1, e) -> e
- («+ «, e, Integral 0) -> e
- («+», Integral 0, e) -> e
- («-», e, Integral 0) -> e
- -> Application (Application (Function f) sel) se2 where sel = simplify el se2 = simplify e2 simplify (Application el e2) =
Application (simplify el) (simplify e2) simplify e = e.
ΠΠ°Π΄Π°ΡΠ° 11.3. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠ½Π° Π΄Π°Π½Π½ΡΡ ΠΡ ΡΠ³:
data ΠΡ ΡΠ³ =.
Integral Integer I — ΡΠ΅Π»ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
Logical Bool I — Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
Function String | — ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Variable String | — ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ.
Lambda String Expr | — Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
Application Expr Expr | — ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
Let String Expr Expr — Π±Π»ΠΎΠΊ Π ΡΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠ°. ΠΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ, Ρ. Π΅. ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅Π»Π΅ Π±Π»ΠΎΠΊΠ°, Π½ΠΎ ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅ΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ. Π‘ΡΠΈΡΠ°Ρ Y-ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ Y, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΈΠ· Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈ, Π·Π°ΠΌΠ΅Π½ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ Π½Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π΅ Y-ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡ, Π° Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ — Π½Π° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊ — ΠΏΡΠΎΡΡΡΠΌ ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ. ΠΠ»ΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°, ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ΅Π΅ ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ let Ρ = el in Π΅2 ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ let Ρ = Y (Π₯Ρ . el) in Π΅2. Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ let Ρ = el in Π΅2 ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (ΠΡ .Π΅2) el. ΠΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π·Π°Π΄Π°ΡΠ°Ρ , Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΈΠ΄ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ°Ρ, Π΅ΡΡΡ Π»ΠΈ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΈΠ΄.
free:: String -> Expr -> Bool free x (Variable Ρ) = x == Ρ.
free x (Lambda Ρ body) = x /= Ρ && free x body free x (Application el e2) = free x el II free x e2 free x (Let Ρ el e2) = x /= Ρ && (free x el II free x e2) free _ e = False.
Π’ΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ°Ρ ΠΈΠ· Π½Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
convert: Expr -> Expr.
convert (Lambda x body) = Lambda x $ convert body.
convert (Application el e2) = Application (convert el) (convert e2).
convert (Let x el e2) | free x el =.
convert (Let x (Application (Function «Y») (Lambda x el)) e2).
I otherwise =.
convert (Application (Lambda x e2) el) convert e = e.
Π ΡΡΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΡΠΎ, ΠΊΠ°ΠΊ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΆΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π±Π»ΠΎΠΊ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΡΠΌΠ±Π΄Π°-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ, Π΅ΡΠ»ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π² Π΄Π²Π° ΡΡΠ°ΠΏΠ°, Π° Π² ΠΎΠ΄ΠΈΠ½. ΠΡΠ°Π²Π΄Π°, ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ: convert (Let Ρ el Π΅2) I free Ρ el =.
Application (Lambda x (convert e2)).
(Application (Function «Y»)(Lambda x (convert el))).
| otherwise =.
Application (Lambda x (convert e2)) (convert el).