Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TaPL9

478 views

Published on

  • Be the first to comment

TaPL9

  1. 1. TaPL読書会 [#4] 2012.09.12
  2. 2. §. 9Simply Typed Lambda-Calculus
  3. 3. 8章でやったこと型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2: Preservation
  4. 4. 型安全性とは(復習)● TaPLにおける型安全性(Safety = Progress + Preservation)とは: 型付けされた項は、途中でstuckになることは なくきちんと評価される ということ。● 型安全性は、後の章で扱うより複雑な型システ ムにおいても成立する。
  5. 5. Lambda abstractionとは● 関数の抽象的表現● 数学的な関数との対応 (1) f = λx.f(x) (2) f(x) = (λx.f(x))(x) (3) f(a) = (λx.f(x))(a)
  6. 6. Lambda abstractionとは 2関数 t(x) 関数 x → x + 2x Mathematicsλx.t λx.x*x + 2*x Programmingfunc(x){t;} func(x){ return x*x + 2*x; }
  7. 7. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  8. 8. おさらい
  9. 9. これまで扱った体系● Untyped booleans (3章)● Untyped arithmetic expressions (3章)● Simply typed booleans (8章)● Simply typed arithmetic expressions (8章)● Untyped lambda-calculus (5章)
  10. 10. ● Untyped booleans B Syntactic forms t ::= v ::= true true false false if t then t else t Evaluation rules  if true then t2 else t3 → t2 (E-IfTrue)  if false then t2 else t3 → t3 (E-IfFalse) t1 → t1 if t1 then t2 else t3 → if t1 then t2 else t3 (E-If)
  11. 11. ● Untyped arithmetic expressions NB (Extends untyped booleans) New Syntactic forms t ::= ... v ::= ... 0 nv succ t pred t nv ::= iszero t 0 succ nv
  12. 12. ● Untyped arithmetic expressions (Extends booleans) NB Evaluation rules t1 → t1 succ t1 → succ t1 (E-Succ) pred 0 → 0 (E-PredZero) pred (succ nv1) → nv1 (E-PredSucc) t1 → t1 pred t1 → pred t1 (E-Pred) iszero 0 → true (E-IszeroZero) iszero (succ nv1) → false (E-IszeroSucc) t1 → t1 iszero t1 → iszero t1 (E-Iszero)
  13. 13. ● Simply typed booleans :B New Syntactic forms T ::= types Bool type of booleans New typing rules  true : Bool (T-True)  false : Bool (T-False) t1 : Bool t2 : T t3 : T if t1 then t2 else t3 : T (T-If)
  14. 14. ● Simply typed arithmetic expressions :NB (Extends A.E. and simply typed Bool.) New Syntactic forms T ::= ... types Nat type of natural numbers New typing rules  0 : Nat (T-True) t1 : Nat succ t1 : Nat (T-Succ) t1 : Nat pred t1 : Nat (T-Pred) t1 : Nat iszero t1 : Bool (T-Iszero)
  15. 15. ● Untyped lambda-calculus → Syntactic forms t ::= ... terms v ::= x variable λx.t abstraction value λx.t abstraction t t application Evaluation rules t1 → t1 t1t2 → t1t2 (E-App1) t2 → t2 v1t2 → v1t2 (E-App2) (λx.t12)v2 → [x → v2]t12 (E-AppAbs)
  16. 16. これまで扱った体系 extend B :Bextend extend extend NB :NB →
  17. 17. これから導入する体系 extend B :Bextend extend 基本型として extend 導入 NB :NB extend → :→
  18. 18. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  19. 19. 「関数型」導入の試み● λ抽象に対して型付けを行いたい。● まずは、全てのλ抽象を同一の型“→”で 型付けしてみる: λx.t : →● 例:λx.not x : →   λx.λy.y : →
  20. 20. 「関数型」導入の試み● この型付けの問題点:  先の2つの関数を true : Bool に適用すると、  (λx.not x) true → not true = false : Bool  (λx.λy.y) true → λy.y : →● 関数であることを表現するだけでは不十分 ⇒引数・返り値の型を関数型の中に含める: <λ抽象> : T1 → T2
  21. 21. 「関数型」導入の試み● 引数の型についての問題:  ある文の中にλ抽象があるとき、  …… λx.t ……  このλ抽象について、期待されている引数の型を  どのように知るか?● 方法1:型推論● 方法2:明示的型付け cf. 8.6節 Curry-style vs.Church-style
  22. 22. 「関数型」導入の試み● 方法1:型推論 式を見て、引数の値がどのように使われている か判断する  λx.not x ⇒ x : Bool のはず● 方法2:明示的型付け λ抽象の表式に、期待される引数の型を付加す る  λx:Bool.not x
  23. 23. 「関数型」導入の試み● 返り値の型についての問題:  λ抽象 λx:T1.t の返り値の型はどのように  決まるか?● 例: id1 = λx:Bool.x id2 = λx:(Bool→Bool).x id1 true = (λx:Bool.x) true = true : Bool id2 id1 = (λx:(Bool→Bool).x)id1 = id1 : Bool→Bool
  24. 24. 「関数型」導入の試み● λ抽象 λx:T1.t の返り値の型は、 引数の型に関する制約条件 x : T1 の下で定まる、 λ抽象の body t の型である。    x : T1 |- t : T2    |- λx:T1.t : T1 → T2
  25. 25. 「関数型」導入の試み● 型環境Γ (typing context) Γ |- t : T と書いたとき、Γは 項 t に含まれる自由変数に関する型制約の なす順序付集合を表す:  Γ={x1:T1, x2:T2,..., xk:Tk}  Γ, s:S := {x1:T1,..., xk:Tk,s:S} (s ∈ dom(Γ)) Φ, s:S =: s:S (={s:S}) 注) Γ, s1:S1, s2:S2 ≠ Γ, s2:S2, s1:S1
  26. 26. ● Simply typed lambda-calculus :→ Syntactic forms t ::= ... terms x variable λx:T.t abstraction t t application v ::= λx:T.t abstraction value T ::= terms T → T type of functions Γ ::= typing contexts Φ empty context Γ, x:T term variable binding
  27. 27. ● Simply typed lambda-calculus :→ Evaluation rules t1 → t1 t1t2 → t1t2 (E-App1) t2 → t2 v1t2 → v1t2 (E-App2) (λx:T11.t12)v2 → [x → v2]t12 (E-AppAbs) Typing rules x:T ∈ Γ Γ |- x:T (T-Var) Γ,x:T1 |- t2:T2 Γ |- λx:T1.t2 :T1→T2 (T-Abs) Γ |- t1:T11→T12 Γ |- t2:T11 Γ |- t1t2:T12 (T-App)
  28. 28. ● Simply typed booleans :B as a family of fundamental types Merged Syntactic forms of types T ::= types Bool type of booleans T → T type of functions Typing rules  as above. Bool, Bool → Bool, Bool → (Bool → Bool),... などが具体的な型として存在
  29. 29. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  30. 30. 型付けの一意性(Simple types)● Simply typed lambda-calculusでは、次の型付 けの一意性定理が成り立つ(Thm 9.3.3): 与えられた型環境Γの下で、 任意の項 t は、高々1つの型しかもたない。 (つまり、t がwell typedならばその型は一意) さらに、t の型付けの導出木も一意に定まる。
  31. 31. 型付けの一意性(具体例)● t = (λx:Bool.x)true の型の導出木 x:Bool ∈ x:Bool     x:Bool |- x:Bool           |- λx:Bool.x : Bool→Bool |- true: Bool                      |- (λx:Bool.x)true : Bool
  32. 32. 型付けの一意性(具体例)● t = (λx:Bool.x)true の型の導出木 x:Bool ∈ x:Bool     T-Var x:Bool |- x:Bool           |- λx:Bool.x : Bool→Bool |- true: Bool                      |- (λx:Bool.x)true : Bool
  33. 33. 型付けの一意性(具体例)● t = (λx:Bool.x)true の型の導出木 x:Bool ∈ x:Bool     T-Var x:Bool |- x:Bool     T-Abs       T-True |- λx:Bool.x : Bool→Bool |- true: Bool                      |- (λx:Bool.x)true : Bool
  34. 34. 型付けの一意性(具体例)● t = (λx:Bool.x)true の型の導出木 x:Bool ∈ x:Bool     T-Var x:Bool |- x:Bool     T-Abs       T-True |- λx:Bool.x : Bool→Bool |- true: Bool                      T-App |- (λx:Bool.x)true : Bool
  35. 35. 型付けの一意性(証明)● 方針: subtermsに関する数学的帰納法で証明する。 つまり、 項 t に対し、すべての直下のsubtermに関して定理の 主張(型付けの一意性)が成り立っていると仮定した とき、 t の型が一意に定まることを示す。
  36. 36. 型付けの一意性(証明)● 方針: t の取りうるsyntax(項の形式)に応じて場合分けす る。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t 1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  37. 37. 型付けの一意性(証明)● t = λx:T1.t2 (Case-Abstraction) 定理の仮定から、ある型 R が存在し Γ |- λx:T1.t2 : R このとき、Lemma 9.3.1 - 2 より ある型 R2 が存在し、 R = T1 → R2, Γ,x:T1 |- t2 : R2 帰納法の仮定より、t の body t2 の型付けは一意。 したがって、型付け規則 (T-Abs) により t はその型として R のみを持つ。
  38. 38. 型付けの一意性(証明) 残りのケース● t = t1 t2 (Case-Application)● t = x (Case-Variable) → 上と同様● t = if t1 then t2 else t3 (Case-If) → 8章と同様● t = true (Case-True)● t = false (Case-False) → Lemma 9.3.1 からダイレクトに従う
  39. 39. 型付けの一意性(証明)● Lemma 9.3.1 の証明 それぞれの項のsyntaxから、適用できる型付け規則が 一意に定まる。 e.g. t = λx:T1.t2に適用できる規則は (T-Abs) のみ これにより、補題の主張が従う。
  40. 40. 型付けの一意性定理 Simply typed lambda-calculusにおいては● 任意のwell-typedな項が唯一つの型を持つ● 任意のwell-typedな項について、型の導出木は 唯一つである ※注意 後の章で扱う、より複雑な型システムにおいて は、一般にこのような定理は成り立たない cf. subtyping
  41. 41. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  42. 42. 型安全性の証明● ここでは、Simply typed lambda-calculusにお いて下記3つの定理が成り立つことを示す: Theorem 9.3.5 (Thm. of Progress) Closed(自由変数なし) & well typedな項は 非stuck Lemma 9.3.8 (Thm. of Preservation) 項への代入は型を変えない。 Theorem 9.3.9 (Thm. of Preservation) 項の評価は型を変えない。
  43. 43. Progress(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 |- t : T に対し、そのすべてのsubtermに関して定理 の主張(それらがvalueである、または前進評価が可 能であること)を仮定したときに、 t 自身も同様にvalueである、または前進評価が可能 であることを示す。
  44. 44. Progress(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  45. 45. Progress(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  46. 46. Progress(証明)● t = t1 t2 (Case-Application) このとき、 |- t1 : T11 → T12, |- t2 : T11 帰納法の仮定より、subterm t1 について (i) ある t1 が存在し、 t1 → t1 (ii) t1 は value
  47. 47. Progress(証明)● t = t1 t2 (Case-Application) (i) ある t1 が存在し、 t1 → t1 このとき、E-App1より t = t1 t2 → t1t2 (ii) t1 は value このとき、帰納法の仮定より、subterm t2 について  (a) ある t2 が存在し、 t2 → t2  (b) t2 は value
  48. 48. Progress(証明)● t = t1 t2 (Case-Application)  (a) ある t2 が存在し、 t2 → t2  いま、t1 はvalueなので、E-App2により  t = t1 t2 → t1 t2  (b) t2 は value  いま、t1 (:T11 → T12)はvalueなので、 Lemma9.3.4より t1 = λx:T11.t12 よって、E-AppAbsにより  t = (λx:T11.t12)t2 → [x → t2]t12  
  49. 49. Progress(証明)● t = t1 t2 (Case-Application)  (a) ある t2 が存在し、 t2 → t2  いま、t1 はvalueなので、E-App2により  t = t1 t2 → t1 t2  (b) t2 は value  いま、t1 (:T11 → T12)はvalueなので、 Lemma9.3.4より t1 = λx:T11.t12 よって、E-AppAbsにより  t = (λx:T11.t12)t2 → [x → t2]t12  
  50. 50. Lemma9.3.4(Canonical Forms)(i) v が Bool型のvalueのとき、v = true or v = false(ii) v が T1 → T2 型のvalueのとき、v = λx:T1.t2証明:Simply typed λ-calculus において、valueの取りうるsyntactic form は true, false, λx:T.t の3種(ii) v = true と仮定する。補題の仮定より、true : T1 → T2⇒ Lemma 9.3.1(inversion lemma)-4 に矛盾
  51. 51. Preservation: 代入(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 t : T に対し、そのすべてのsubtermに関して定理の 主張(代入によって型が不変であること)を仮定した ときに、 t 自身も同様に、代入によって型が不変であることを 示す。
  52. 52. Preservation: 代入(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  53. 53. Preservation: 代入(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  54. 54. Preservation: 代入(証明)● t = λy:T2.t1 (Case-Abstraction) このとき、 T = T2 → T1 Γ,x:S,y:T2 |- t1 : T1 なるT1が存在する。 型環境の定義より、y≠x, y∈FV(s)であるから、 Lemma9.3.6 (Permutation)より、 Γ,y:T2,x:S |- t1 : T1
  55. 55. Preservation: 代入(証明)● t = λy:T2.t1 (Case-Abstraction) Γ |- s:S と Lemma9.3.7 (Weakening)より、 Γ,y:T2, |- s:S 一方、t1に対して、帰納法の仮定から Γ,y:T2 |- [x → s]t1 : T1 よって、T-Absにより Γ |- λy:T2[x → s]t1 : T2 → T1
  56. 56. Preservation: 代入(証明)● t = λy:T2.t1 (Case-Abstraction) Γ |- s:S と Lemma9.3.7 (Weakening)より、 Γ,y:T2, |- s:S 一方、t1に対して、帰納法の仮定から Γ,y:T2 |- [x → s]t1 : T1 よって、T-Absにより Γ |- λy:T2[x → s]t1 : T2 → T1
  57. 57. 置換の補題、弱化の補題● Lemma 9.3.6 (Permutation) 「型環境への置換操作の下で型付けは不変」 Γ |- t:T, Δ=P(Γ) P:Permutation ⇒Δ |- t:T● Lemma 9.3.7 (Weakening) 「型環境の拡大の下で型付けは不変」 Γ |- t:T, x ∈ dom(Γ) ⇒ Γ,x:S |- t:T ともに、型導出に関する数学的帰納法により示される
  58. 58. Preservation: 評価(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 t : T に対し、そのすべてのsubtermに関して定理の 主張(評価によって型が不変であること)を仮定した ときに、 t 自身も同様に、評価によって型が不変であることを 示す。
  59. 59. Preservation: 評価(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False)● t = if t1 then t2 else t3 (Case-If)
  60. 60. Preservation: 評価(証明)● 方針: 直前のtyping rule(導出規則)に応じて場合分け。● t = x (Case-Variable)● t = λx:T1.t2 (Case-Abstraction)● t = t1 t2 (Case-Application)● t = true (Case-True)● t = false (Case-False) 8章● t = if t1 then t2 else t3 (Case-If)
  61. 61. Preservation: 評価(証明)● t = t1 t2 (Case-Application) このとき、 Γ |- t1 : T1 → T Γ |- t2 : T1 t に直前に適用された評価規則として、 E-App1, E-App2, E-AppAbs の3つがありえる。
  62. 62. Preservation: 評価(証明)● Subcase-E-App1 このとき、あるt1が存在し、 t1 → t1 t → t = t1t2 帰納法の仮定により、 Γ |- t1: T1 → T よって、T-Appより Γ |- t1t2 : T● Subcase-E-App2 もほぼ同様。
  63. 63. Preservation: 評価(証明)● Subcase-E-App1 このとき、あるt1が存在し、 t1 → t1 t → t = t1t2 帰納法の仮定により、 Γ |- t1: T1 → T よって、T-Appより Γ |- t1t2 : T● Subcase-E-App2 もほぼ同様。
  64. 64. Preservation: 評価(証明)● Subcase-E-AppAbs このとき、あるt12が存在し、 t1 = λx:T1.t12 t → t = [x → t2]t12 (x ∈ dom(Γ)) t1 : T1 → T であったから、Lemma9.3.1-2 より Γ,x:T1 |- t12 : T これと Γ |- t2 : T1 より、 Lemma9.3.8(型保存の定理:代入)を適用できて Γ |- [x → t2]t12 : T
  65. 65. 型の削除● 項の評価(プログラム実行)時には、型情報を 保持しておく必要はない。 (型安全性は静的に保障されているので)● 型の削除は、評価の任意のタイミングで行うこ とができる (評価してから型を外しても、型を外してから 評価しても、評価結果は変わらない)
  66. 66. 型の削除Simply typed λ-calculus での erasure(型削除子)の定義:変数に対して、erase(x) := xλ抽象に対して、erase(λx:T.t) := λx.erase(t)関数適用に対して、erase(t1 t2) := erase(t1)erase(t2)
  67. 67. 型の削除定理(9.5.2):1. t t erase erase erase(t) erase(t) ヨ2. t t erase erase erase(t) m
  68. 68. 型の削除 evaluation t0 t1 ・・・ ti ・・・ tnerase e(t0) e(t1) ・・・ e(ti) ・・・ e(tn) e(・) := erase(・)
  69. 69. 型づけ可能性(Def 9.5.3) typed λ-calculus t0 t1 ・・・ ti ・・・ tn m0 m1 ・・・ mi ・・・ mn untyped λ-calculusUntyped lambda-calculus の項から見ると、この関係は「型付け可能性」を示している
  70. 70. 9章のまとめ● 5章で扱った lambda-calculus の体系 に、Simply typed booleansを基本型として Simpleな型付け規則を導入しました。● Simply typed lambda-calculus において、 型付けの一意性を証明しました。● Simply typed lambda-calculus において、 型安全性(Progress + Preservation) を証明し ました。
  71. 71. Appendix● Curry-Howard対応 (9.4節) 論理とプログラミング言語の対応関係 ≪命題Pの証明(可能性)≫の問題を ≪型Pの項(の存在)≫に帰着させることがで きる。 λ簡約…証明の単純化に相当● 様々な論理/型システムに適用可能 例:線形論理 → 線形型システム

×