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

型システム入門 第1-4章 / TaPL ch.01-04

E09657ebf3fe2de5698d5797266a05c4?s=47 iTakeshi
June 16, 2019
88

型システム入門 第1-4章 / TaPL ch.01-04

E09657ebf3fe2de5698d5797266a05c4?s=128

iTakeshi

June 16, 2019
Tweet

Transcript

  1. 型システム入門〜プログラミング言語と型の理論 第 1 ~ 4 章 @iTakeshi June 16, 2019

  2. Table of contents 1. 第 1 章: はじめに 2. 第

    2 章: 数学的準備 3. 第 3 章: 型無し算術式 4. 第 4 章: 算術式の ML 実装 1
  3. 第 1 章: はじめに

  4. 型システム 型システムとは、 • プログラムの各部分を、 • それが計算する値の種類に沿って分類することにより、 • プログラムがある種の振る舞いを起こさないことを保証する、 • 計算量的に扱いやすい

    • 構文的手法 である。 2
  5. 型システムで何ができるか • エラーの検出 • 抽象化 • ドキュメント化 • 言語の安全性(≡ 抽象の保護)

    • 効率性(最適化の支援) 3
  6. 第 2 章: 数学的準備

  7. 集合、関係 • n 項関係 R とは、集合 S1, S2, . .

    . , §n の要素から成る n 項組 (s1, s2, . . . , sn) を要素とす る集合 • 述語とは、集合 S 上の単項関係であり、特に P(s) と表記する • 集合 S, T 上の二項関係 R については sRt と表記する 4
  8. 関数 • 部分関数(または写像)とは、S, T 上の関係 R で、(s, t1) ∈ R

    ∧ (s, t2) ∈ R ⇒ t1 = t2 であるもの • dom(R) = S のとき、全域関数 • range(R) = T のとき、全射 • (s1, t1) ∈ R ∧ (s2, t2) ∈ R ∧ s1 ̸= s2 ⇒ t1 ̸= t2 のとき、単射 • 特定の入力に対して正しい値を返さない関数として、 • 部分関数(未定義の入力に対して発散する) • 失敗を返す全域関数 の両方がありえることに注意 5
  9. 順序集合 集合 S 上の二項関係 R について、 反射 ∀s ∈ S

    (s, s) ∈ R 対称 ∀s, t ∈ S (s, t) ∈ R ⇒ (t, s) ∈ R 反対称 ∀s, t ∈ S (s, t) ∈ R ∧ (t, s) ∈ R ⇒ s = t 推移 ∀s, t, u ∈ S (s, t) ∈ R ∧ (t, u) ∈ R ⇒ (s, u) ∈ R これらの組み合わせとして、 前順序 反射的・推移的 • 巡回のある有向グラフ 半順序 反射的・推移的・反対称的(全てのペアに順序が定まらなくても良い) • 有向非巡回グラフ • NaN のある浮動小数点数 全順序 半順序が ∀s, t ∈ S (s, t) ∈ R ∨ (t, s) ∈ R を満たすとき 同値関係 反射的・推移的・対称的 6
  10. 反射的閉包 Definition (反射的閉包) 二項関係 R の反射的閉包とは、R を含む最小の反射的関係 R′ のことである。 Example

    (演習 2.2.6) R′ ≡ R ∪ {(s, s)|s ∈ S} が反射的閉包であることを述べる。1 1. R ⊆ R′: R′ の定義から自明 2. ∀s ∈ S (s, s) ∈ R′: R′ の定義から自明 3. ∀R′′ (R ⊆ R′′ ∧ ∀s ∈ S (s, s) ∈ R′′) ⇒ R′ ⊆ R′′ (最小性): 背理法。R ⊆ R′′ ∧ ∀s (s, s) ∈ R′′ ∧ R′ ̸⊆ R′′ なる R′′ が存在すると仮定する。 R′ ̸⊆ R′′ より、(a, b) ∈ R′ ∧ (a, b) / ∈ R′′ を満たす組 (a, b) が少なくとも 1 つ存在する。 ここで R′ の定義から (a, b) ∈ R ∨ (a, b) ∈ {(s, s)} であるが、これは R ⊆ R′′ ∧ {(s, s)} ⊆ R′′ に矛盾。 よってこのような R′′ は存在しない。 1https://blog.kokuyouwind.com/archives/321/ 7
  11. 推移的閉包 Definition (推移的閉包) 二項関係 R の推移的閉包とは、R を含む最小の推移的関係 R+ のことである。 Example

    (演習 2.2.7) R0 ≡ R, Ri+1 ≡ Ri ∪ {(s, u)|∃t (s, t) ∈ Ri ∧ (t, u) ∈ Ri} と定めると、 R+ ≡ ∪ i Ri は推移的閉包になることを述べる。2 1. R ⊆ R+: R = R0 ⊆ ∩ i Ri = R+ 2. ∀s, t, u ∈ S (s, t) ∈ R+ ∧ (t, u) ∈ R+ ⇒ (s, u) ∈ R+: ∃n (s, t) ∈ Rn かつ ∃m (t, u) ∈ Rm は真。 n ≥ m のとき、Rn ⊇ Rm により (t, u) ∈ Rn だから (s, t) ∈ Rn ∧ (t, u) ∈ Rn は真。 したがって (s, u)inRn+1 。m ≤ n の場合も同様。 2https://blog.kokuyouwind.com/archives/321/ 8
  12. 推移的閉包 Example (演習 2.2.7 cont.) 3. ∀R′ (R ⊆ R′

    ∧ ((s, t) ∈ R′ ∧ (t, u) ∈ R′ ⇒ (s, u)inR′)) ⇒ R+ ∈ R′ (最小性): R ⊆ R′ ∧ ((s, t) ∈ R′ ∧ (t, u) ∈ R′ ⇒ (s, u)inR′) ∧ R+ ̸⊆ R′ なる R′ を仮定する。 ∃n, a, b (a, b) ∈ Rn ∧ (a, b) / ∈ R′ は真。 n = 0 のとき、(a, b) ∈ R0 ≡ R が R′ に含まれないのは矛盾。 n > 0 のとき、(a, b) ∈ Rn−1 または ∃c (a, c) ∈ Rn−1 ∧ (c, b) ∈ Rn−1 。 いずれの場合でも、同様の議論を n = 0 に到達するまで繰り返すことにより R の構成 要素に分解できる。 このとき、R′ は R の推移的関係であるという仮定から、(a, b) ∈ R′ となるが、これは (a, b) / ∈ R′ と矛盾する。 したがって、このような R′ は存在しない。 9
  13. 反射的推移的閉包 Definition (反射的推移的閉包) 二項関係 R の反射的推移的閉包とは、R 含む最小の反射的推移的関係 R∗ のことである。 Example

    (演習 2.2.8) R によって保存される S 上の述語 P が R∗ によっても保存されること ∀s, t P(s) ∧ (s, t) ∈ R∗ ⇒ P(t) を述べる。 1. (s, t) ∈ R のとき:自明 2. s = t のとき(反射) :自明 3. それ以外のとき(推移) : (s, t) ∈ R∗ ⇔ ∃s′ 1 , s′ 2 , . . . , s′ n (s, s′ 1 ) ∈ R ∧ (s′ 1 , s′ 2 ) ∈ R ∧ · · · ∧ (s′ n , t) ∈ R と分解できる。 P は R によって保存されるため、以上のように分解された列に対しても保存される。 したがって P(t)。 10
  14. 降下列 • 降下列とは、集合 S 上の前順序 R について、S の要素から成る列 s1, s2,

    . . . で ∀i si > si+1 を満たすもの • 無限降下列が存在しない前順序 R を整礎であると言い、 清楚な前順序 R の台となる集合 S を整礎集合と呼ぶ。 11
  15. 帰納法 1. ( P(0) ∧ (P(i) ⇒ P(i + 1))

    ) ⇒ ∀n P(n) 2. ( ∀j, j < i P(j) ⇒ P(i + 1) ) ⇒ ∀n P(n) 3. ( ∀(a′, b′), (a′, b′) < (a, b) P(a′, b′) ⇒ P(a, b) ) ⇒ ∀(n, m) P(n, m) 12
  16. 第 3 章: 型無し算術式

  17. 導入 第 3 章では、今後の議論の土台として • 抽象構文 • 帰納的定義と証明 • 評価

    • 実行時エラーのモデル化 などの道具立てを整えるため、まずは型無しの計算体系について述べる。 13
  18. 対象とする言語 この章で対象とする言語(項の集合)を以下のバッカス = ナウア記法で定義する。 t ::= true false if t

    then t else t 0 succ t pred t iszero t • この章においては、 「項」は「式」と同義 • いかなる項も最終的には値—true、false、または数(succ∗0)—に評価される • 型がないので、if 0 then 0 else 0 のような(本来)正しくない項が許される 14
  19. 構文の定義 項の集合 T を 1. 以下の条件を満たす最小の集合として定める。 1.1 {true, false, 0}

    ⊆ T 1.2 t1 ∈ T ⇒ {succ t1, pred t1, iszero t1} ⊆ T 1.3 t1, t2, t3 ∈ T ⇒ if t1 then t2 else t3 ∈ T 2. 以下の推論規則によって定義する。 true ∈ T false ∈ T 0 ∈ T t1 ∈ T succ t1 ∈ T t1 ∈ T pred t1 ∈ T t1 ∈ T iszero t1 ∈ T t1 ∈ T t2 ∈ T t3 ∈ T if t1 then t2 else t3 ∈ T 明らかに、この 2 つの定義は等価。 15
  20. 手続き的な定義 S0 ≡ ∅ Si+1 ≡ {true, false, 0} ∪

    {succ t1, pred t1, iszero t1|t1 ∈ Si} ∪ {if t1 then t2 else t3|t1, t2, t3 ∈ Si} S ≡ ∪ i Si このように定義された S について、S = T であることが示せる。 16
  21. 項に関する帰納法 直観的には ある項 t に対して、 それよりも小さな全ての項 t′ について述語 P(t′) が示せるなら、

    P(t) は真 「それよりも小さい」を定義する方法によって、 • 定数の集合 Consts(t) • サイズ size(t) (= AST のノード数) • 深さ depth(t)(= AST の深さ) • 部分項 に対する帰納法が挙げられる 17
  22. 意味論 意味論は項の評価方法を決定する 操作的意味論 抽象機械の遷移関数として評価方法を定める。停止状態の値が結果となる 表示的意味論(関数型言語っぽい…? ) 公理的意味論(論理プログラミングっぽい…? ) 18

  23. 評価 ブール式の操作的意味論から始める。 if true then t2 else t3 → t2

    if false then t2 else t3 → t3 t1 → t′ 1 if t1 then t2 else t3 → if t′ 1 then t2 else t3 この 3 つの評価戦略を満たす最小の二項関係 → を 1 ステップ評価関係と呼び、 この関係の元である項は導出可能であるという。 1 ステップ評価戦略では、任意の項は必ず一通りの方法で値に評価される。 19
  24. 導出可能性と導出木 ある評価関係が所与の評価規則から導出できるかどうかは導出木を書くことで判定で きる。 s → false E − IFTRUE t

    → u E − IF if t then false else false → if u then false else false E − IF 導出木の根となる評価関係は導出可能である。 20
  25. 導出に関する帰納法 Example (演習 3.5.5) 各導出 D に対して、 すべての直接の部分導出 C について

    P(C) が示せるなら P(D) が示せる なら、すべての D に対して P(D) は真。 21
  26. 正規形 「これ以上評価できない項」を正規形という。 • 値 ⇒ 正規形:自明 • 正規形 ⇒ 値:ある正規形の項

    t が値でないと仮定すると、それは if である。これは 評価できるので、矛盾。 よって正規形 ⇔ 値 22
  27. 多ステップ評価関係 多ステップ評価関係 →∗ を 1 ステップ評価関係 → の反射的推移的閉包として定める。 t →

    t′ t →∗ t′ t →∗ t t →∗ t′′ t′′ →∗ t′ t →∗ t′ 多ステップ評価関係を用いて、任意の項が値に評価されること(停止性)を表現できる。 ∀t ∃t′ ∈ V t →∗ t′ 23
  28. 演習 3.5.13 (1) • 3.5.4: 元の規則は t2 を返し、新しい規則は t3 を返すので成り立たない

    • 3.5.11: 同じ理由により成り立たない • 他は成り立つ (2) • 1 ステップ評価の順序だけが変更され、正規形には影響しない。したがって 3.5.4 だ けが成り立たない。 24
  29. 算術式への拡張 単なる拡張なので省略 25

  30. 行き詰まり状態 数を扱うことで「実行時エラー」の可能性が生じる。 if 0 then 0 else 0 iszero true

    これはもはや評価できないので正規形だが、値でもない。 これを行き詰まり状態 wrong で表す。 26
  31. 大ステップ意味論 これまでの 1 ステップ・多ステップ評価はいずれも個々のステップの繰り返しとして定 義された。これに対し、任意の項を一気に値に評価してしまう関係を「大ステップ意味 論」として定義し、⇓ で表す。 27

  32. 第 4 章: 算術式の ML 実装

  33. DEMO 27