TaPL Reading (7th)
Chapter 11 -Simple Extensions-




                          @a_hisame
                         Oct 24, 2012

              1
Outline

11章の復習
   (11.1 BaseTypesから 11.9 Sumsまで)

11.10 Variants
11.11 General Recursion
11.12 Lists




                   2
section 11.1 - 11.2
・11.1 Base Types
  特に構造を持たない型
  Bool, Nat, Floatなど

・11.2 The Unit Type
  値unitを唯一の要素として持つ型
  Base Typeの一種
  意味のある値を受け渡ししない場合に
  利用する(副作用を用いる場合など)

                   3
section 11.3
・11.3 Derived Forms
  一種の省略形。構文糖衣(*)の事。
 Sequence
   t1; t2   (λx: Unit . t2) t1
                     where x     FV(t2)   [def FV on P.69]


 Wildcard
   (λ_: S . t)   (λx: S . t)
                    where x      FV(t)

* 構文糖衣: 読み書きのしやすさの為に導入される、既に定義されている構文の
書き換えとして定義されたもの.

                         4
section 11.4 - 11.5
・11.4 Ascription
  型に関する情報・記法の提供
   ・特定の型の明示(as T)
   ・型の省略記法(UU = Unit -> Unit)

・11.5 Let Binding
   Derived Formの一種
    let x = t1 in t2   (λx: T1 . t2) t1

   Evaluation Ruleから、t2中のxはt1に置き換わる



                           5
section 11.6 - 11.8
・11.6 Pairs
  2つの要素を持つ値
  {v1, v2} : T1 T2 と表現

・11.7 Tuples
  Pairの拡張。n個の要素を持つ値
  {vi i ∈ 1..n} : {Ti i ∈ 1..n} と表現

・11.8 Records
  Tupleの拡張。要素にラベルをつけたもの
  {li = vi i ∈ 1..n} : {li : Ti i ∈ 1..n} と表現
  ここでは、等価性に順序を考慮する
  ({x=5, y=1} {y=1, x=5} )
                           6
section 11.9
・11.9 Sums
 T1とT2という2つの型に対して、どちらかの型の
 値を持つ新たな(T1+T2)型を定義
 ・inl x と inr x で T1,T2のどちらに属するかを判定

 このルールを単純に導入すると、型付けの一意性
 規則(Theorem9.3.3)が崩れる

 Subtyping(継承)に関する話が出てくる

 ※Theorem9.3.3 与えられた型環境Γの下で任意の項tは高々1つの型しか
 持たない
 反例: inl 5 : (Nat + Nat) かつ inl 5 : (Nat + Bool)
 ここでは、解決策に明示的型指定を選択。
 例:inl 5 as Nat + Nat inl 5 as Nat + Bool

                        7
Variants
・11.10 Variants
 Sumsを一般化(*)して、Recordの様にラベルをつ
 けたものをVariantsと定義する
 ・inl t1 as T1+T2 → <l1=t> as <l1:T1, l2:T2>
 ・よく使われる例を3例紹介

 Option
  既存の型に 値を取れない領域 を付加
  nullの利用も、パターンとしてはOptionになる

    OptionalNat = <none: Unit, some: Nat>


※ 定義より、Sums(+)は2項までしか対応しない


                            8
Variants
・11.10 Variants
 Enumerations
  Variantsの型に属する値を作る事ができる
  Weather = <sunny:Unit, cloudy: Unit, rainy: Unit>


 Single-Field Variables
  値を型で包むことで、不用意な計算や変換を行え
  ないようにする
  ・単位系の計算などに有用


                          9
Variants
・11.10 Variants (他の話題)
  VariantsとML系のDatatype定義の違い
  ・記法が異なる
  ・型アノテーション(as T)が不要
  ・Unit型の値ではない
  ・再帰的定義(例: List)が可能


  ここで出てきたSumやVariantは
  Disjoint Union(直和) と呼ばれる事もある




                 10
General Recursion
・11.11 General Recursion
 λ計算ではfix combinatorによって再帰を実現して
 いたが、この言語系ではどのように再帰を行うか?

 この言語系でもfix combinatorを定義したいが、単純型付
 きラムダ計算ではfixが定義できないため、termとして導入
 する(Fig.11-12, P.144)。


  fix (λx: T1 . t2)
                                     [E-FixBeta]
   → [x ⇨ (fix (λx:T1 . t2))] t2



                        11
General Recursion
・11.11 General Recursion
 fix (λx: T1 . t2)
                                       [E-FixBeta]
  → [x ⇨ (fix (λx:T1 . t2))] t2

 fix ff =                       [P.143 評価を進めた]
  λx: Nat .
   if iszero x then true
   else if iszero (pred x) then false
   else fix ff (pred (pred x));


このfixの場合、正格評価戦略を取ると、展開が終わらなくなる。
Wikipedia: 不動点コンビネータ(Fix Combinator)なども参照。

                         12
General Recursion
・Exercise 11.11.1
 equal
  equal : Nat -> Nat -> Bool
  equal = fix ffeq

  ffeq : (Nat -> Nat -> Bool) -> Nat -> Nat -> Bool
  ffeq = λeq: Nat -> Nat -> Bool .
  λx: Nat . λy: Nat .
    if and (iszero x) (iszero y) then true
    else if or (iszero x) (iszero y) then false
    else eq (pred x) (pred x);


                        13
General Recursion
・Exercise 11.11.1
 plus

  plus : Nat -> Nat -> Nat
  plus = fix ffpl

  ffpl : (Nat -> Nat -> Nat) -> Nat -> Nat -> Nat
  ffpl = λpl: Nat -> Nat -> Nat .
  λx: Nat . λy: Nat .
    if iszero y then x
    else pl (succ x) (pred y);


                        14
General Recursion
・Exercise 11.11.1
 times

  times : Nat -> Nat -> Nat
  times = fix fftm

  fftm : (Nat -> Nat -> Nat) -> Nat -> Nat -> Nat
  fftm = λtm: Nat -> Nat -> Nat .
  λx: Nat . λy: Nat .
    if iszero y then 0
    else plus x (tm x (pred y));


                        15
General Recursion
・Exercise 11.11.1
 factorial

  factorial : Nat -> Nat
  factorial = fix fffc

  fffc : (Nat -> Nat) -> Nat -> Nat
  fffc = λfc: Nat -> Nat .
  λn: Nat .
    if iszero n then 1
    else times n (fc (pred n));


                           16
General Recursion
・11.11 General Recursion
 letrec               letrecは以下の定義の構文糖衣

  letrec x: T1 = t1 in t2   let x = fix (λx: T1 . t1) in t2

  letrec iseven : Nat -> Bool =
   λx: Nat .
     if iszero x then true
     else if iszero (pred x) then false
     else iseven (pred (pred x))
  in
     iseven 7;


                              17
Lists
・11.12 Lists
 型Tの要素を持つList型を定義する

 List a ::= nil ¦ Cons a List      [Defenition of List]


 リストの定義からいくつか
   v ::= ...
    nil[T]
    cons[T] v v
     Γ-¦ t1:T1 Γ-¦ t2:List T1
                                        [T-Cons]
    Γ-¦ cons[T1] t1 t2 : List T1

                        18

TaPL_chap11

  • 1.
    TaPL Reading (7th) Chapter11 -Simple Extensions- @a_hisame Oct 24, 2012 1
  • 2.
    Outline 11章の復習 (11.1 BaseTypesから 11.9 Sumsまで) 11.10 Variants 11.11 General Recursion 11.12 Lists 2
  • 3.
    section 11.1 -11.2 ・11.1 Base Types 特に構造を持たない型 Bool, Nat, Floatなど ・11.2 The Unit Type 値unitを唯一の要素として持つ型 Base Typeの一種 意味のある値を受け渡ししない場合に 利用する(副作用を用いる場合など) 3
  • 4.
    section 11.3 ・11.3 DerivedForms 一種の省略形。構文糖衣(*)の事。 Sequence t1; t2 (λx: Unit . t2) t1 where x FV(t2) [def FV on P.69] Wildcard (λ_: S . t) (λx: S . t) where x FV(t) * 構文糖衣: 読み書きのしやすさの為に導入される、既に定義されている構文の 書き換えとして定義されたもの. 4
  • 5.
    section 11.4 -11.5 ・11.4 Ascription 型に関する情報・記法の提供  ・特定の型の明示(as T)  ・型の省略記法(UU = Unit -> Unit) ・11.5 Let Binding Derived Formの一種 let x = t1 in t2 (λx: T1 . t2) t1 Evaluation Ruleから、t2中のxはt1に置き換わる 5
  • 6.
    section 11.6 -11.8 ・11.6 Pairs 2つの要素を持つ値 {v1, v2} : T1 T2 と表現 ・11.7 Tuples Pairの拡張。n個の要素を持つ値 {vi i ∈ 1..n} : {Ti i ∈ 1..n} と表現 ・11.8 Records Tupleの拡張。要素にラベルをつけたもの {li = vi i ∈ 1..n} : {li : Ti i ∈ 1..n} と表現 ここでは、等価性に順序を考慮する ({x=5, y=1} {y=1, x=5} ) 6
  • 7.
    section 11.9 ・11.9 Sums T1とT2という2つの型に対して、どちらかの型の 値を持つ新たな(T1+T2)型を定義 ・inl x と inr x で T1,T2のどちらに属するかを判定 このルールを単純に導入すると、型付けの一意性 規則(Theorem9.3.3)が崩れる Subtyping(継承)に関する話が出てくる ※Theorem9.3.3 与えられた型環境Γの下で任意の項tは高々1つの型しか 持たない 反例: inl 5 : (Nat + Nat) かつ inl 5 : (Nat + Bool) ここでは、解決策に明示的型指定を選択。 例:inl 5 as Nat + Nat inl 5 as Nat + Bool 7
  • 8.
    Variants ・11.10 Variants Sumsを一般化(*)して、Recordの様にラベルをつ けたものをVariantsと定義する ・inl t1 as T1+T2 → <l1=t> as <l1:T1, l2:T2> ・よく使われる例を3例紹介 Option 既存の型に 値を取れない領域 を付加 nullの利用も、パターンとしてはOptionになる OptionalNat = <none: Unit, some: Nat> ※ 定義より、Sums(+)は2項までしか対応しない 8
  • 9.
    Variants ・11.10 Variants Enumerations Variantsの型に属する値を作る事ができる Weather = <sunny:Unit, cloudy: Unit, rainy: Unit> Single-Field Variables 値を型で包むことで、不用意な計算や変換を行え ないようにする ・単位系の計算などに有用 9
  • 10.
    Variants ・11.10 Variants (他の話題) VariantsとML系のDatatype定義の違い ・記法が異なる ・型アノテーション(as T)が不要 ・Unit型の値ではない ・再帰的定義(例: List)が可能 ここで出てきたSumやVariantは Disjoint Union(直和) と呼ばれる事もある 10
  • 11.
    General Recursion ・11.11 GeneralRecursion λ計算ではfix combinatorによって再帰を実現して いたが、この言語系ではどのように再帰を行うか? この言語系でもfix combinatorを定義したいが、単純型付 きラムダ計算ではfixが定義できないため、termとして導入 する(Fig.11-12, P.144)。 fix (λx: T1 . t2) [E-FixBeta] → [x ⇨ (fix (λx:T1 . t2))] t2 11
  • 12.
    General Recursion ・11.11 GeneralRecursion fix (λx: T1 . t2) [E-FixBeta] → [x ⇨ (fix (λx:T1 . t2))] t2 fix ff = [P.143 評価を進めた] λx: Nat . if iszero x then true else if iszero (pred x) then false else fix ff (pred (pred x)); このfixの場合、正格評価戦略を取ると、展開が終わらなくなる。 Wikipedia: 不動点コンビネータ(Fix Combinator)なども参照。 12
  • 13.
    General Recursion ・Exercise 11.11.1 equal equal : Nat -> Nat -> Bool equal = fix ffeq ffeq : (Nat -> Nat -> Bool) -> Nat -> Nat -> Bool ffeq = λeq: Nat -> Nat -> Bool . λx: Nat . λy: Nat . if and (iszero x) (iszero y) then true else if or (iszero x) (iszero y) then false else eq (pred x) (pred x); 13
  • 14.
    General Recursion ・Exercise 11.11.1 plus plus : Nat -> Nat -> Nat plus = fix ffpl ffpl : (Nat -> Nat -> Nat) -> Nat -> Nat -> Nat ffpl = λpl: Nat -> Nat -> Nat . λx: Nat . λy: Nat . if iszero y then x else pl (succ x) (pred y); 14
  • 15.
    General Recursion ・Exercise 11.11.1 times times : Nat -> Nat -> Nat times = fix fftm fftm : (Nat -> Nat -> Nat) -> Nat -> Nat -> Nat fftm = λtm: Nat -> Nat -> Nat . λx: Nat . λy: Nat . if iszero y then 0 else plus x (tm x (pred y)); 15
  • 16.
    General Recursion ・Exercise 11.11.1 factorial factorial : Nat -> Nat factorial = fix fffc fffc : (Nat -> Nat) -> Nat -> Nat fffc = λfc: Nat -> Nat . λn: Nat . if iszero n then 1 else times n (fc (pred n)); 16
  • 17.
    General Recursion ・11.11 GeneralRecursion letrec letrecは以下の定義の構文糖衣 letrec x: T1 = t1 in t2 let x = fix (λx: T1 . t1) in t2 letrec iseven : Nat -> Bool = λx: Nat . if iszero x then true else if iszero (pred x) then false else iseven (pred (pred x)) in iseven 7; 17
  • 18.
    Lists ・11.12 Lists 型Tの要素を持つList型を定義する List a ::= nil ¦ Cons a List [Defenition of List] リストの定義からいくつか v ::= ... nil[T] cons[T] v v Γ-¦ t1:T1 Γ-¦ t2:List T1 [T-Cons] Γ-¦ cons[T1] t1 t2 : List T1 18