Your SlideShare is downloading. ×
0
×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

TaPL9

282

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
282
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. TaPL読書会 [#4] 2012.09.12
  • 2. §. 9Simply Typed Lambda-Calculus
  • 3. 8章でやったこと型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2: Preservation
  • 4. 型安全性とは(復習)● TaPLにおける型安全性(Safety = Progress + Preservation)とは: 型付けされた項は、途中でstuckになることは なくきちんと評価される ということ。● 型安全性は、後の章で扱うより複雑な型システ ムにおいても成立する。
  • 5. Lambda abstractionとは● 関数の抽象的表現● 数学的な関数との対応 (1) f = λx.f(x) (2) f(x) = (λx.f(x))(x) (3) f(a) = (λx.f(x))(a)
  • 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. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  • 8. おさらい
  • 9. これまで扱った体系● Untyped booleans (3章)● Untyped arithmetic expressions (3章)● Simply typed booleans (8章)● Simply typed arithmetic expressions (8章)● Untyped lambda-calculus (5章)
  • 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. ● 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. ● 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. ● 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. ● 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. ● 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. これまで扱った体系 extend B :Bextend extend extend NB :NB →
  • 17. これから導入する体系 extend B :Bextend extend 基本型として extend 導入 NB :NB extend → :→
  • 18. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  • 19. 「関数型」導入の試み● λ抽象に対して型付けを行いたい。● まずは、全てのλ抽象を同一の型“→”で 型付けしてみる: λx.t : →● 例:λx.not x : →   λx.λy.y : →
  • 20. 「関数型」導入の試み● この型付けの問題点:  先の2つの関数を true : Bool に適用すると、  (λx.not x) true → not true = false : Bool  (λx.λy.y) true → λy.y : →● 関数であることを表現するだけでは不十分 ⇒引数・返り値の型を関数型の中に含める: <λ抽象> : T1 → T2
  • 21. 「関数型」導入の試み● 引数の型についての問題:  ある文の中にλ抽象があるとき、  …… λx.t ……  このλ抽象について、期待されている引数の型を  どのように知るか?● 方法1:型推論● 方法2:明示的型付け cf. 8.6節 Curry-style vs.Church-style
  • 22. 「関数型」導入の試み● 方法1:型推論 式を見て、引数の値がどのように使われている か判断する  λx.not x ⇒ x : Bool のはず● 方法2:明示的型付け λ抽象の表式に、期待される引数の型を付加す る  λx:Bool.not x
  • 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. 「関数型」導入の試み● λ抽象 λx:T1.t の返り値の型は、 引数の型に関する制約条件 x : T1 の下で定まる、 λ抽象の body t の型である。    x : T1 |- t : T2    |- λx:T1.t : T1 → T2
  • 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. ● 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. ● 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. ● 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. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  • 30. 型付けの一意性(Simple types)● Simply typed lambda-calculusでは、次の型付 けの一意性定理が成り立つ(Thm 9.3.3): 与えられた型環境Γの下で、 任意の項 t は、高々1つの型しかもたない。 (つまり、t がwell typedならばその型は一意) さらに、t の型付けの導出木も一意に定まる。
  • 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. 型付けの一意性(具体例)● 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. 型付けの一意性(具体例)● 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. 型付けの一意性(具体例)● 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. 型付けの一意性(証明)● 方針: subtermsに関する数学的帰納法で証明する。 つまり、 項 t に対し、すべての直下のsubtermに関して定理の 主張(型付けの一意性)が成り立っていると仮定した とき、 t の型が一意に定まることを示す。
  • 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. 型付けの一意性(証明)● 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. 型付けの一意性(証明) 残りのケース● 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. 型付けの一意性(証明)● Lemma 9.3.1 の証明 それぞれの項のsyntaxから、適用できる型付け規則が 一意に定まる。 e.g. t = λx:T1.t2に適用できる規則は (T-Abs) のみ これにより、補題の主張が従う。
  • 40. 型付けの一意性定理 Simply typed lambda-calculusにおいては● 任意のwell-typedな項が唯一つの型を持つ● 任意のwell-typedな項について、型の導出木は 唯一つである ※注意 後の章で扱う、より複雑な型システムにおいて は、一般にこのような定理は成り立たない cf. subtyping
  • 41. 9章でやることλ計算への型付け規則の導入(Simple types) ↓ 型付けの一意性の証明 ↓ 型安全性の証明1: Progress   ↓ 型安全性の証明2-1: Preservation(代入) 型安全性の証明2-2: Preservation(評価) 型の削除の定義
  • 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. Progress(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 |- t : T に対し、そのすべてのsubtermに関して定理 の主張(それらがvalueである、または前進評価が可 能であること)を仮定したときに、 t 自身も同様にvalueである、または前進評価が可能 であることを示す。
  • 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. 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. Progress(証明)● t = t1 t2 (Case-Application) このとき、 |- t1 : T11 → T12, |- t2 : T11 帰納法の仮定より、subterm t1 について (i) ある t1 が存在し、 t1 → t1 (ii) t1 は value
  • 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. 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. 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. 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. Preservation: 代入(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 t : T に対し、そのすべてのsubtermに関して定理の 主張(代入によって型が不変であること)を仮定した ときに、 t 自身も同様に、代入によって型が不変であることを 示す。
  • 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. 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. 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. 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. 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. 置換の補題、弱化の補題● 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. Preservation: 評価(証明)● 方針: 導出に関する数学的帰納法で証明する。 つまり、 t : T に対し、そのすべてのsubtermに関して定理の 主張(評価によって型が不変であること)を仮定した ときに、 t 自身も同様に、評価によって型が不変であることを 示す。
  • 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. 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. Preservation: 評価(証明)● t = t1 t2 (Case-Application) このとき、 Γ |- t1 : T1 → T Γ |- t2 : T1 t に直前に適用された評価規則として、 E-App1, E-App2, E-AppAbs の3つがありえる。
  • 62. Preservation: 評価(証明)● Subcase-E-App1 このとき、あるt1が存在し、 t1 → t1 t → t = t1t2 帰納法の仮定により、 Γ |- t1: T1 → T よって、T-Appより Γ |- t1t2 : T● Subcase-E-App2 もほぼ同様。
  • 63. Preservation: 評価(証明)● Subcase-E-App1 このとき、あるt1が存在し、 t1 → t1 t → t = t1t2 帰納法の仮定により、 Γ |- t1: T1 → T よって、T-Appより Γ |- t1t2 : T● Subcase-E-App2 もほぼ同様。
  • 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. 型の削除● 項の評価(プログラム実行)時には、型情報を 保持しておく必要はない。 (型安全性は静的に保障されているので)● 型の削除は、評価の任意のタイミングで行うこ とができる (評価してから型を外しても、型を外してから 評価しても、評価結果は変わらない)
  • 66. 型の削除Simply typed λ-calculus での erasure(型削除子)の定義:変数に対して、erase(x) := xλ抽象に対して、erase(λx:T.t) := λx.erase(t)関数適用に対して、erase(t1 t2) := erase(t1)erase(t2)
  • 67. 型の削除定理(9.5.2):1. t t erase erase erase(t) erase(t) ヨ2. t t erase erase erase(t) m
  • 68. 型の削除 evaluation t0 t1 ・・・ ti ・・・ tnerase e(t0) e(t1) ・・・ e(ti) ・・・ e(tn) e(・) := erase(・)
  • 69. 型づけ可能性(Def 9.5.3) typed λ-calculus t0 t1 ・・・ ti ・・・ tn m0 m1 ・・・ mi ・・・ mn untyped λ-calculusUntyped lambda-calculus の項から見ると、この関係は「型付け可能性」を示している
  • 70. 9章のまとめ● 5章で扱った lambda-calculus の体系 に、Simply typed booleansを基本型として Simpleな型付け規則を導入しました。● Simply typed lambda-calculus において、 型付けの一意性を証明しました。● Simply typed lambda-calculus において、 型安全性(Progress + Preservation) を証明し ました。
  • 71. Appendix● Curry-Howard対応 (9.4節) 論理とプログラミング言語の対応関係 ≪命題Pの証明(可能性)≫の問題を ≪型Pの項(の存在)≫に帰着させることがで きる。 λ簡約…証明の単純化に相当● 様々な論理/型システムに適用可能 例:線形論理 → 線形型システム

×