ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

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).

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ