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

ラムダ計算に基づいた純粋関数型言語の実装~ラスト~ #TechLunch

ラムダ計算に基づいた純粋関数型言語の実装~ラスト~ #TechLunch

20110713(水) @ Livesense TechLunch
発表者:塩足 拓也

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.
PRO

April 23, 2014
Tweet

Transcript

  1. ラムダ計算に基づいた純粋関数型 言語の実装 2011/07/13 Takuya Shiotari ~ラスト~

  2. Agenda  Review(Digest) • Lambda Calculus • Bound Variable and

    Free Variable • Reduction Rule  Definition • Beta Reduction • Alpha conversion  Implementation
  3. Review(Lambda calculus) 関数の定義と実行を抽象化した計算モデル <expr> ::= <identifier> | (“λ” <identifier> “.”

    <expr>) | (<expr> <expr>) 変数 ラムダ抽象 関数適用
  4. Review(Bound Variable and Free Variable) 束縛変数(Bound Variable) ラムダ抽象によって束縛(bound)された変数 自由変数(Free Variable)

    ラムダ抽象によって束縛(bound)されていない変数 FV(x) = {x}, where x is a variable FV(λx.M) = FV(M) \ {x} FV(M N) = FV(M) ∪ FV(N)
  5. Review(Reduction Rule) α-conversion β-reduction 束縛変数は自由変数やその他の束縛変数と重複しないように名前 を書き換える ラムダ計算の式を実行すること

  6. Definition • 構文だけ定義しても意味が無い • それが何を意味するかを定義する必要がある

  7. Definition(Beta Reduction) 関数λx.M1に引数M2を適用したら、、、 (λx.M1) M2 → [M2/x]M1 まず、xにM2が代入され、、、 それから関数の中身であるM1が実行されるはず Definition

    (R-Beta)
  8. Definition(Beta Reduction) Example 1. (λx.x) y → [y/x] x →

    y 2. (λx.λy.x) z → [z/x] λy.x → λy.z 3. (λx.x)(λy.y) → [λy.y/x] x → λy.y 4. (λa.b)cd → ?
  9. Definition(Beta Reduction) M1 →  M1' M1 M2 → M1' M2 Definition

    (R-App1) R-Betaは適用される関数がλ抽象の形になっているこ とを要求 今回は適用される関数が(λa.b)cという関数適用の形 をしている そこで、また新たな変換規則を導入、、、
  10. Definition(Beta Reduction) (λa.b)cd → (λa.b)c → [c/a] b → b

    R-Beta (λa.b)cd → bd R-App1 bd →
  11. Definition(Beta Reduction) M2 →  M2' M1 M2 → M1 M2' Definition

    (R-App2) 同様の理由で関数適用M1 M2において引数M2 を簡約する規則も必要
  12. Definition(Beta Reduction) Question? λ抽象λx.eにおいてeを簡約する、以下の規 則は必要? M → M' λx.M → λx.M'

    Definition (R-Abs)
  13. Definition(Alpha Conversion) (λx.λy.xy)y → [y/x] λy.xy → λy.y y •

    1番目・2番目のyと3番目のyは別々の変数 • 別々の変数なのに同一視してしまったため、誤った簡約 を行ってしまった • 1番目・2番目のyは仮引数なので、名前は何でも良い (置き換え可能) • 簡約する前に、名前を置き換える (λx.λy.xy)y → (λx.λy'.xy')y → λy'.y y' この名前置き換えのことをα変換という
  14. Definition(Alpha Conversion) [M2/x] y = [M2/x] (λy.M) = λy'.[M2/x]([y'/y] M)

    [M2/x] (M M') = ([M2/x] e) ([M2 / x] M') Definition M2 (x == y)の場合 y (x != y)の場合
  15. Implementation そーす

  16. Next Time...