Upgrade to Pro — share decks privately, control downloads, hide ads and more …

つくってあそぼ ラムダ計算インタプリタ / Implement an Interpreter of Lambda Calculus

C117ccce57a70b57c4f391e87a227ef2?s=47 KMC_JP
October 18, 2018

つくってあそぼ ラムダ計算インタプリタ / Implement an Interpreter of Lambda Calculus

KMC例会講座 / 型無しラムダ計算のインタプリタを実装してみよう

C117ccce57a70b57c4f391e87a227ef2?s=128

KMC_JP

October 18, 2018
Tweet

Transcript

  1. ͭͬͯ͋ͦ͘΅ ϥϜμܭࢉΠϯλϓϦλ ,.$ྫձߨ࠲!VUHXLL

  2. ࣗݾ঺հ w !VUHXLL ͏͕ͨΘ͖͖  w ޻ֶ෦৘ใֶՊճੜ w ϓϩάϥϛϯάݴޠʹؔ͢Δݚڀ w

    &VSP5SVDL4JNVMBUPS
  3. ࢀߟ <>6S[ZD[ZOFUBM-FDUVSFTPOUIF$VSSZ)PXBSE *TPNPSQIJTN 4UVEJFTJO-PHJDBOEUIF'PVOEBUJPOTPG .BUIFNBUJDT  &MTFWJFS4DJFODF <>IUUQXXXLCFDFJUPIPLVBDKQdTVNJJDMBTT LFJTBOLJTPGUXBSFLPVHBLVMBNCEBQEG <>IUUQUUJDVDIJDBHPFEVdQMDMBTTFT$.4$

    8JOUFSMFDUVSFTMFDQEG
  4. ͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯ஌Ζ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮૷͠Α͏

  5. ಈػ w Еܭࢉͷݟͨ໨͸ίϯύΫτͰ͔ͭදݱྗ͕ڧ͍ w ͔࣮͠͠૷Λͨ͜͠ͱ͕ͳ͍ w ΠϯλϓϦλΛ࣮૷ͯ͠ΈΑ͏ w ࿦จಡΉͷ͕ͩΔ͍ͱ͖ʹखΛಈ͔ͯͨ͠

  6. ͜ͷߨ࠲ͷ໨త w ʮΈͳ͞Μ͕ීஈ࢖͍ͬͯΔϓϩάϥϛϯάݴޠ ͷΠϯ λϓϦλ ΋͜ͷΑ͏ʹ࣮૷͞Ε͍ͯΔʯͱ͍͏࣮ײΛ࣋ͬ ͯ΋Β͏ w ЕܭࢉΛ࣮૷ͨ͠ͱ͖ͷͭ·͖ͣϙΠϯτΛڞ༗͢Δ

  7. ͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯ஌Ζ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮૷͠Α͏

  8. ܕແ͠ Еܭࢉ w ܭࢉͷϞσϧԽͷͻͱͭ w ؔ਺Λͭ͘Δ ந৅  w ؔ਺Λద༻͢Δ

    w ͜Ε͚ͩͰͳΜͱνϡʔϦϯά׬શ
  9. Е߲ w .YcЕY.c.. w Y͸ม਺ w ؔ਺ந৅͸ӈ݁߹ЕYЕZ.ЕY ЕZ.  w

    ؔ਺ద༻͸ࠨ݁߹123 12 3 w ద౰ʹׅހΛՃ͑ͯΑ͍
  10. ͞·͟·ͳЕ߲ w ЕYY Z w ЕYЕZY w ЕYЕZЕ[Y[ Z[

  11. ଋറม਺ͱࣗ༝ม਺ w ଋറม਺ w ؔ਺ந৅ʹΑͬͯଋറ͞Ε͍ͯΔม਺ w ЕYЕZYZ[ͷଋറม਺͸Y Z w ࣗ༝ม਺

    w ଋറม਺Ͱ͸ͳ͍΋ͷ w ЕYЕZYZ[ͷࣗ༝ม਺͸[
  12. ม਺ͷஔ׵ w .<Y/> w ߲.ʹొ৔͢Δࣗ༝ม਺YΛ w ࠩ͠ࢧ͑ͳ͍ൣғͰ ߲/ʹஔ׵͢Δ w ࠩ͠ࢧ͑ͳ͍ൣғͬͯͳʹʁ

  13. ม਺ͷஔ׵ͷྫ w Y<YЕZZ>ЕZZ w Z<YЕ[[>Z Y㱠Z  w Y[ ZY

    <YЕXX> ЕXX [ Z ЕXX  w ЕYY<YЕZZ>ЕYY w ЕZY<YЕ[[>ЕZЕ[[ Y㱠Z
  14. Ћม׵ w ЕY.ЋЕZ.<YZ> w ࠩ͠ࢧ͑ͳ͍ൣғͰҾ਺ͷม਺໊͸ຊ࣭Ͱ͸ͳ͍ w ЕYYͱЕZZΛ۠ผ͢Δඞཁ͸ͳ͍Ͱ͢ΑͶʁ

  15. Ќ؆໿ w ͬ͘͟Γݴ͑͹ؔ਺ద༻ w ЕY. /.<Y/>

  16. Ќ؆໿Λମײ͢Δ w EFGG Y SFUVSOY Y w G  

       w ͜Ε͸͋͘·ͰମײͰ͢
  17. Ќ؆໿ ЕYЕZЕ[Y[ Z[  ЕYЕZY  ЕYЕZY   ЕZЕ[

    ЕYЕZY [ Z[  ЕYЕZY  Е[ ЕYЕZY [ ЕYЕZY [  Е[ ЕZ[ ЕYЕZY [  Е[ ЕZ[ ЕZ[  Е[[
  18. ਖ਼نܗ w ͜ΕҎ্Ќ؆໿Ͱ͖ͳ͍߲ w ྫ w Y w ЕYY w

    ЕYЕZY
  19. ͓͠ͳ͕͖ w ಈػ w Еܭࢉʹ͍ͭͯ஌Ζ͏ w ЕܭࢉͷΠϯλϓϦλΛ࣮૷͠Α͏

  20. ࢓༷ w ೖྗЕ߲ͷจࣈྻදݱ w ग़ྗЌ؆໿ͷεςοϓͱਖ਼نܗ ͷΑ͏ͳ΋ͷ  w ͭ͡͸ඞͣ͠΋ਖ਼نܗʹ؆໿͞ΕΔΘ͚Ͱ͸ͳ͍ 

    w Ќ؆໿ͯ͠Έͯɼ߲͕มԽ͠ͳ͔ͬͨΒఀࢭ͢Δ
  21. ࣮૷ݴޠ w ݴޠ͸0$BNMΛ࢖͏ w ͦͦ͜͜πʔϧνΣʔϯ͕͋Δ w Θ͕ͨ͠Α͘৮͍ͬͯΔ w ࢖͍͜ͳͤͯ͸͍ͳ͍ͱࢥ͏ʜʜ

  22. ؆໿·ͰͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿
  23. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  24. DGΠϯλϓϦλ τʔΫϯྻ *% Y &2/6.   ߏจ໦ 45.5 <"44*(/

    Y  > Ծ૝ػցίʔυ -0"% 4503&  YY   ࣈ۟ղੳ ߏจղੳ Ծ૝ػցίʔυ΁ͷม׵ ධՁ ˞ͲΕ͘Β͍σʔλߏ଄Λม׵͢Δ͔͸ઃܭʹΑΔ
  25. Е߲ͷσʔλܕΛఆٛ͠Α͏ w .YcЕY.c.. w ஧࣮ʹམͱ͜͠Ή

  26. Е߲ͷσʔλܕΛఆٛ͠Α͏ type id = string
 
 type term =
 |

    Var of id
 | Fun of id * term
 | App of term * term
  27. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  28. ߏจղੳ w ЕYYͷΑ͏ͳه߸ྻʹҙຯΛ࣋ͨͤΔ࡞ۀ w ЕYY'VO Y 7BSY  w ݫີʹ͸͜ͷه߸ྻΛͦͷ··ѻ͏Θ͚Ͱ͸ͳ͍

  29. ߏจղੳثΛ࣮૷͠Α͏ w NFOIJSΛ࢖͏Α w ZBDDͷ0$BNM൛ͷ͍͢͝΍ͭ w PDBNMZBDDͱ͍͏ͷ΋͋Δ w จ๏Λ#/'෩ͷ΋ͷͰهड़

  30. τʔΫϯΛఆٛ͢Δ w .YcЕY.c.. w άοͱᛀΜͰඞཁͦ͏ͳτʔΫϯΛఆٛ͠Α͏ w *% ม਺  w

    -".#%" %05 Е   w -1"3&/ 31"3&/ ׅހ  w &0- Е߲ͷऴ୺
  31. τʔΫϯΛఆٛ͢Δ %{
 open Syntax
 %}
 
 %token <Syntax.id> ID
 %token

    LAMBDA DOT
 %token LPAREN RPAREN
 %token EOL
  32. จ๏Λఆٛ͢Δ w .YcЕY.c.. w άοͱᛀΜͰจ๏Λॻ͘ w NBJO&YQS&0- w &YQS-".#%"*%%05&YQSc"QQ&YQS w

    "QQ&YQS"QQ&YQS"&YQSc"&YQS w "&YQS*%c-1"3&/&YQS31"3&/
  33. จ๏Λఆٛ͢Δ %start main
 %type <Syntax.term> main
 %% main:
 Expr EOL

    { $1 }
 
 Expr:
 | LAMBDA i=ID DOT e=Expr { Fun (i, e) }
 | AppExpr { $1 }
 
 AppExpr:
 | e1=AppExpr e2=AExpr { App (e1, e2) }
 | AExpr { $1 }
 
 AExpr:
 | i=ID { Var i }
 | LPAREN e=Expr RPAREN { e }
  34. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  35. ࣈ۟ղੳ w ͦ΋ͦ΋ЕYYͷΑ͏ͳจࣈྻͷ··ͩͱѻ͍ͮΒ͍ w ۭനจࣈΛແࢹ͢Δͱ͔ w ίϝϯτ΋͜͜ͰऔΓআ͔ΕΔ w -".#%"*% Y

    %05*% Y ͙Β͍ʹ໌֬ͳྻͩͱΑ͍
  36. ࣈ۟ղੳثΛ࣮૷͠Α͏ w PDBNMMFYΛ࢖͏Α w MFYͷ0$BNM൛ w ϧʔϧΛਖ਼نදݱͰهड़

  37. ࣈ۟ղੳϧʔϧΛఆٛ͢Δ {
 open Parser
 }
 
 rule main = parse


    [' ' '\t']+ { main lexbuf }
 | ['\n'] { EOL }
 | ['a'-'z'] { ID (Lexing.lexeme lexbuf) }
 | '\\' { LAMBDA }
 | '.' { DOT }
 | '(' { LPAREN }
 | ')' { RPAREN }
 | eof { exit 0 }
  38. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  39. %F#SVJKOJOEFYʹม׵͠Α͏ w ʜʜͬͯͳʹʁ

  40. Ћม׵ ࢥ͍ग़͢ w ʮଋറม਺ͷ໊લ͸ຊ࣭Ͱ͸ͳ͍ʯ w ͍ͬΆ͏ߏจ໦ʹ͸ଋറม਺ͷ໊લ͕͋Δ w ద੾ʹม਺ͷ໊લͷ͜ͱΛߟ͑ͳ͍ͱ
 ؆໿݁Ռ͕ΊͪΌͪ͘ΌʹͳΔ w

    ଋറม਺ͷ໊લʹଋറ͞Εͨ͘ͳ͍ʂʂʂʂ
  41. Ќ؆໿ ·͕͍ͪ ЕYЕZЕ[Y[ Z[  ЕYЕ[Y  ЕYЕZY  

    ЕZЕ[ ЕYЕ[Y [ Z[  ЕYЕZY  Е[ ЕYЕ[Y [ ЕYЕZY [  Е[ Е[[ ЕYЕZY [  Е[ Е[[ ЕZ[  Е[ЕZ[
  42. %F#SVJKOJOEFYʹม׵͠Α͏ w ؔ਺ந৅ʹΑΔଋറ͔Βͷωετͷਂ͞Ͱม਺͕Ұҙʹ ఆ·Δ w ͜͜Ͱ͸JOEFYͱ͢Δ w ЕYЕZYЕЕ w ЕYЕZЕ[Y[

    Z[ ЕЕЕ   w ͨͩࣗ͠༝ม਺͸์͓ͬͯ͘
  43. %F#SVJKOJOEFYͷڧΈ w ม਺ͷ໊લΛߏจ໦͔ΒऔΓআ͘͜ͱ͕Ͱ͖Δ w ؆໿ͷաఔͰͷЋม׵Λߟ͑ͳͯ͘Α͍

  44. %F#SVJKOJOEFY΁ͷม׵ w % ϵ / Y /ϵ Y  ϵ

    Y ͕ఆٛ͞Ε͍ͯΔ  w % ϵ / Y Y ϵ Y ͕ఆٛ͞Εͳ͍ɼࣗ༝ม਺Ͱ͋Δ  w % ϵ / ЕY. Е % ϵ\Y/ ^ /  .  w % ϵ / 12  % ϵ / 1 % ϵ / 2  w %NBJO . % \^  .
  45. %F#SVJKOJOEFY΁ͷม׵ w ྫ w %NBJO ЕYЕZY  w % \^

     ЕYЕZY  w Е % \Y^  ЕZY  w ЕЕ % \Y Z^  Y  w ЕЕ  ЕЕ
  46. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  47. %F#SVJKOJOEFYͷЌ؆໿ w ػցతͳJOEFYͷૢ࡞ͱஔ׵͚ͩͰЌ؆໿͕࣮ߦ͞ΕΔ w ͳΜ͔͍ࣜ͢͝  w ࢿྉ<>Λࢀর

  48. ࣮૷ͷྲྀΕ τʔΫϯྻ -".#%"*%%05 ߏจ໦ 'VO Y  %F#SVJKOJOEFY 'VO ЕYЕZЕ[Y[

    Z[ ЕYЕZY ЕYЕZY ЕYY ࣈ۟ղੳ ߏจղੳ %F#SVJKOJOEFY΁ม׵ Ќ؆໿    
  49. ࣮૷ͨ͠΋ͷ w IUUQTHJUIVCDPNVUHXLLMBNCEBDIBNB

  50. σϞ w aYaZa[Y[ Z[ aYaZY aYaZY  w aYaZa[Y[ Z[

    aYa[Y aYaZY  ม਺໊Λม͚͑ͨͩ  w aG aYG YY aYG YY  ఀࢭ͠ͳ͍
  51. ࠓޙͷ՝୊ w ܕΛ෇͚Δ w ࣮૷͸͕ͨ͠ߨ࠲Ͱ͸লུ w ࣗ༝ม਺ͷѻ͍Λ͏·͘΍Γ͍ͨ

  52. ·ͱΊ w Еܭࢉʹ͍ͭͯͳΜͱͳ͘෼͔͖ͬͯͨ w ЕܭࢉͷΠϯλϓϦλΛ࣮૷ͨ͠