ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

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

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

Π—Π°Π΄Π°Ρ‡Π° 12.2. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ способ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ слоТной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Select ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΅Π΅ ΠΏΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΠΈΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄. Π—Π°Π΄Π°Ρ‡Π° 12.4. ВнСситС Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€, прСдставлСнный Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 12.1, измСнСния согласно Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ 12.2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ компилятор для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ 12.1 ΠΈ 12.3… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π—Π°Π΄Π°Ρ‡Π° 12.1. Ѐункция соСдинСния списков (++) Π² ΡΠ·Ρ‹ΠΊΠ΅ Haskell ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° уравнСниями [] ++ list = list.

(x:listl) ++ list2 = x: (listl ++ list2).

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΠΎΠ΄Ρ‹ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня.

РСшСниС. Ѐункция соСдинСния списков ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° рСкурсивно, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ лямбда-исчислСнии ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивного Π±Π»ΠΎΠΊΠ° Π»ΠΈΠ±ΠΎ примСнСния Y-ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π°. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивного Π±Π»ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π³Π°ΠΊ: let join = Xsl. Xs2.if null si then s2 else

cons (head si) (join (tail si) s2) in join Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ null, head, tail ΠΈ cons считаСм ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ функциями Π½Π°Π΄ списками.

Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ значСния Ρ‚ΠΈΠΏΠ° Π•Ρ…Ρ€Π³, обозначая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты выраТСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Haskell: thenPart = Variable «s2» .

elsePart = Application (Application (Function «cons»).

  • (Application (Function «head»)(Variable «si»)))
  • (Application (Application (Function «join»)
  • (Application (Function «tail»)(Variable «si»)))(Variable «s2»))

body = If (Application (Function «null»)(Variable «si»)) thenPart elsePart.

letrec = Letrec [(«join», Lambda «si» (Lambda «s2» body))] (Variable «join»).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ компилятор, прСдставлСнный Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 12.1. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compile ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ:

" compile letrec.

[Dummy, LoadConst (List []), LoadFunc [LoadFunc [Load (1,0), LoadSect «null», Apply, Select [Load (0,0)] [Load (0,0), Load (1,0), LoadSect «tail», Apply, LoadSect «join», Apply, Apply, Load (1,0), LoadSect «head», Apply, LoadSect «cons», Apply, Apply], Return],.

Return], LoadSect «cons», Apply, Apply, LoadFunc [Load (0,0), Return], RecApply, Stop].

Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ компиляции.

Π—Π°Π΄Π°Ρ‡Π° 12.2. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ способ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ слоТной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Select ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΅Π΅ ΠΏΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΠΈΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄.

РСшСниС. МоТно ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Skip ΠΏ, смысл ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ исполнСниС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° управлСния. Π Π°Π±ΠΎΡ‚Ρƒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (здСсь функция drop — это стандартная функция языка Haskell, ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов списка):

(s, ctx, Skip n: c, d) —" (s, ctx, drop n c, d).

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ «ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ Π²ΠΏΠ΅Ρ€Π΅Π΄» ΠΏΠΎ ΡΠΏΠΈΡΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄. Π’ΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Select ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ², Π° Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ, хранящСгося Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка, пропускаСт ΠΈΠ»ΠΈ Π½Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

  • ((Boolean True):s, ctx, Select: cl:c, d) —" (s, ctx, c, d)
  • ((Boolean False) :s, ctx, Select: cl:c, d) —> (s, ctx, cl: c, d) Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ процСсс компиляции условного выраТСния. ΠœΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ выраТСния, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‚Π²ΠΈ условного выраТСния, ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ΅ΠΌ число ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ послС компиляции. ПослС этого Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Skip Π² Π½Π°Ρ‡Π°Π»ΠΎ списка ΠΊΠΎΠΌΠ°Π½Π΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚Π²Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚Π²Π΅ΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ:
  • (If cond eThen eElse) ** context =
  • (cond ** context) ++
  • (Select: Skip (n+1): compThen) ++
  • (Skip m: compElse) where compThen = eThen ** context compElse = eElse ** context n = length compThen m = length compElse

Π—Π°Π΄Π°Ρ‡ΠΈ для ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π—Π°Π΄Π°Ρ‡Π° 12.3. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π² ΠΊΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° числа 100.

Π—Π°Π΄Π°Ρ‡Π° 12.4. ВнСситС Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€, прСдставлСнный Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 12.1, измСнСния согласно Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ 12.2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ компилятор для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ 12.1 ΠΈ 12.3.

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