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.

PPL2016-9-3

403 views

Published on

Agda による定式化された型推論器の拡張と改良

Published in: Science
  • Be the first to comment

  • Be the first to like this

PPL2016-9-3

  1. 1. Agda による定式化された型推論 器の拡張と改良 お茶の水女子大学 門脇香子 浅井健一 2016. 3. 8
  2. 2. 1はじめに •研究概要 •研究背景 •本研究の貢献 •発表の流れ
  3. 3. 研究概要 •Agda を用いて、定式化された型推論器に generic programming や不等式制約などのテクニックを用 いて、実装を簡明にし、構文の拡張を簡単にした •generic programming •不等式制約
  4. 4. Agda について •依存型を用いることのできる、定理証明支援システ ムおよびプログラミング言語 •Haskell などに文法が似ている
  5. 5. 依存型(Dependent Types) •値に依存する型をつくることができる型 •例: Vec n 型 (n は int 型の値)
 長さが n のベクトルを(型のレベルで)表現している •例えば、OCamlのリストでは長さが型レベルでは指 定できない(length関数などで取り出すことが必要)
  6. 6. 定式化 入力(型無し言語) 出力(型付き言語) 型推論 n = 1 let f x = match x with 0 -> “zero” | _ -> “not zero” n : int n = 1 f : int -> string f x = match x with …
  7. 7. 型 定式化 入力(型無し言語) 出力(型付き言語) 型推論 n : int f : int -> string
  8. 8. 型 定式化 入力(型無し言語) 出力(型付き言語) 型推論 n : int f : int -> string 検証機構 チェック①
  9. 9. 定式化 入力(型無し言語) 出力(型付き言語) 型推論 型を消去 型無し言語 同じであることを保証する❷
  10. 10. 研究背景 •型推論をするには unification の機構が必要だが、 普通に実装すると変数の書き換えなどが必要で、 Agdaではできない •そこで McBride は型変数の数を巧妙に管理する形 でunificationの機構を pure functional に実現した •これにより、Agdaで型推論器をつくる土台が出来 た
  11. 11. 本研究の貢献 •McBride が示した unification の機構 [McBride, 2003] を拡張し、単 一化できている証明も返す形で定式化した(PPL2015) •この unification の機構をもとにして、 Agda で定式化された型推論器 を実装した(PPL2015) •この型推論器に不等式制約を導入することで型変数を指定するの みの実装より簡単に実装する方法を示し、それを型規則の形で定 式化した •unification の機構をgeneric programmingにより任意の型に 拡張し、 型の拡張を簡単にした •型推論の結果、得られた型付き項から型を取り除くと元の項が得 られることも証明した •型推論の拡張の例として、組を導入した 

  12. 12. 今日のコンテンツ 1.はじめに 2.unification 3.型定義 4.generic programming と不等式制約 5.型推論 6.まとめ
  13. 13. 2unification •McBrideによる手法 •unificationの定式化
  14. 14. McBride による unification の機構 McBrideは、型変数を有限集合で表現する手法で停止性が明 らかな unificationを実現した 型 τ a0 a1 .. .. a(m - 1) 型変数の集合(最大で m 個) 有限集合 (finite set) (m)
  15. 15. McBride による unification の機構 型 τ a0 int .. .. a(m - 1) (m) 型変数は代入により具体化(具体的な型になる)可能性がある
  16. 16. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2
  17. 17. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2 unification a1 = int a0 int a2
  18. 18. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2 unification a1 = int a0 int a2 ❌ 具体化された型を集合から削除
  19. 19. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2 unification a1 = int a0 a1 a0 → (a1 → int) 型変数の数が確かに減っている
  20. 20. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2 unification a1 = int a0 a1 a0 → (a1 → int) 型変数の数が確かに減っている 型変数が具体化されるたびに、具体化されていない型変数の数 がひとつ減る
  21. 21. 型 t1 : a0 → (a2 → a1) a0 a1 a2 型 t2 : a0 → (a2 → int) a0 int a2 unification a1 = int a0 a1 a0 → (a1 → int) 型変数の数が確かに減っている 型変数が具体化されるたびに、具体化されていない型変数の数 がひとつ減る 停止性が明らか
  22. 22. unificationの定式化 •先ほど示した手法で、unificationをAgda上で実装できた •型推論器を定式化するには 確かにunifyされている 証明 を返すことも必要
  式にすると subst σ t1 == subst σ t2
 「代入した後の型が確かに同一」 •unification の関数を拡張して、この証明を返すようにし た(PPL2015)

  23. 23. 3型定義 •型、型判断、項 •本研究における特殊な表現

  24. 24. 型定義 項
  25. 25. 型定義 項 m 番目の型変数 関数型
  26. 26. 型定義 項 変数 ラムダ抽象 関数適用
  27. 27. 型判断 推論規則
  28. 28. 型判断 推論規則 「型環境 Γ のもとで、項 M の型は τ になる」
  29. 29. 型判断 推論規則
  30. 30. 型推論の特殊な表現 型を計算して出力するための規則
  31. 31. 型推論の特殊な表現 入力 出力
  32. 32. 型推論の特殊な表現 ① 項 M と 型変数を最大で m 個もつ型環境 Γが入力される
  33. 33. 型推論の特殊な表現 ②新しい型変数が型推論中に m - m 個割り当てられる
  34. 34. 型推論の特殊な表現 ③型変数の数をm 個まで減らす代入が得られる
  35. 35. 型推論の特殊な表現 ⑤型変数の数が m まで減った型 τ が返ってくる
  36. 36. unification の特殊な表現 型 τ1 と τ2 を同じにする(unifyする)代入σを得る
  37. 37. unification の特殊な表現 入力 出力
  38. 38. unification の特殊な表現 型変数を最大で m 個持つ型 τ1 と τ2 は
 型変数を m 個から m 個まで減らす代入 σによって unification (単一化)される
  39. 39. 4generic programmingと
 不等式制約 •generic programming •不等式制約
  40. 40. generic programming •普通は型をコンストラクタで定義する •この場合、型を操作する関数において、型を再実装するた びにパターンマッチを再実装する必要がある •型を generic に生成することで、パターンマッチの再実装 を避け、ユーザが指定した任意の型を再実装なく推論でき るようになる •本研究では、 Regular[Noortら, 2008]を元にgenericな 型を実装した
  41. 41. generic programming 組の構文(Cons, Fst, Snd)を増やしたいとき、
 直積型を追加する必要が有る
  42. 42. generic programming このように型を増やしても、
 unification や型に関する補題の実装を変更する必要がない
  43. 43. generic programming 構文を増やすとき、
 構文そのものの型推論に集中できる
  44. 44. generic programming 型をBNFのような形で表現する
  45. 45. generic programming 型をBNFのような形で表現する
  46. 46. generic programming 型をBNFのような形で表現する
  47. 47. generic programming 型をBNFのような形で表現する
  48. 48. generic programming 型をBNFのような形で表現する
  49. 49. generic programming 型をBNFのような形で表現する これで、型の表現ができた
  50. 50. generic programming 具体的な型の表現
  51. 51. generic programming 表現の意味を与えている
  52. 52. generic programming 自分自身を与えることで再帰する
  53. 53. generic programming 再帰を閉じるための型
  54. 54. generic programming 再帰を閉じるための型
  55. 55. generic programming 再帰を閉じるための型
  56. 56. generic programming 任意に大きい型を表現できる
  57. 57. 不等式制約 型推論を実装する際、以前は m を厳密に型に組み 込んでいた
  58. 58. 不等式制約 たとえば Lam s を型推論するとき m : Nat m = count s + 1 Γ : Cxt m Γ = …
  59. 59. 不等式制約 たとえば Lam s を型推論するとき m : int m = count s + 1 Γ : Cxt m Γ = … 型の値レベルで型を合わせて証明しないといけなくなる
  60. 60. 不等式制約 m は m ≤ m ' を満たしていればよく、具体的な数 は以後持ち歩く必要がない 代わりに m ≤ m という証明を持ち歩く
  61. 61. 5型推論 •関数定義 •型推論の例 - 関数適用 -
  62. 62. 関数定義 入力
 s : m 個の型変数をもつ well-scoped term 
 Γ : 型環境 出力 m , m : 自然数 m≤m :m≤m であることの証明 σ : m 個の型変数を持つ型を m 個の型変数を持つ型にする 代入 τ : 推論結果の型 w : 推論された well-typed term。型変数をm 個もつ erase w s : 返された well-typed term s から型情報を削除したものが、
 もとの well-scoped term と等しいという証明 infer
  63. 63. 関数定義 入力
 s: m 個の型変数をもつ well-scoped term 
 Γ : 型環境 (Maybe)出力 m , m : 自然数 m≤m :m≤m であることの証明 σ : m 個の型変数を持つ型を m 個の型変数を持つ型にする 代入 τ : 推論結果の型 w : 推論された well-typed term。型変数をm 個もつ erase w s : 返された well-typed term s から型情報を削除したものが、
 もとの well-scoped term と等しいという証明 infer
  64. 64. 関数定義 入力
 s: m 個の型変数をもつ well-scoped term 
 Γ : 型環境 (Maybe)出力 m , m : 自然数 m≤m :m≤m であることの証明 σ : m 個の型変数を持つ型を m 個の型変数を持つ型にする 代入 τ : 推論結果の型 w : 推論された well-typed term。型変数をm 個もつ erase w s : 返された well-typed term s から型情報を削除したものが、
 もとの well-scoped term と等しいという証明 infer nothingが返る= 型エラーである
  65. 65. 関数定義 コードではこのようになる(参考)
  66. 66. 型推論の例 (App) App s1 s2 の型推論は 1. s1 を型推論し、σ1 と τ1を得る 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る 3. τ1 == τ2 → β (βは新しい型変数)となるよう unifyし, 成功したら σ3を得る 4. 返される型はβとなる
  67. 67. 型推論の例 (App) App s1 s2 の型推論は 1. s1 を型推論し、σ1 と τ1を得る 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る 3. τ1 == τ2 → β (βは新しい型変数)となるよう unifyし, 成功したら σ3を得る 4. 返される型はβとなる
  68. 68. 型推論の例 (App) App s1 s2 の型推論は 1. s1 を型推論し、σ1 と τ1を得る 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る 3. τ1 == τ2 → β (βは新しい型変数)となるよう unifyし, 成功したら σ3を得る 4. 返される型はβとなる
  69. 69. 型推論の例 (App) App s1 s2 の型推論は 1. s1 を型推論し、σ1 と τ1を得る 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る 3. τ1 == τ2 → β (βは新しい型変数)となるよう unifyし, 成功したら σ3を得る 4. 返される型はβとなる
  70. 70. 型推論の例 (App) 1. s1 を型推論し、σ1 と τ1を得る。 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る。
  71. 71. 型推論の例 (App) 1. s1 を型推論し、σ1 と τ1を得る。 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る。
  72. 72. 型推論の例 (App) 1. s1 を型推論し、σ1 と τ1を得る。 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る。
  73. 73. 型推論の例 (App) 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る。 3. τ1 == τ2 → β (βは新しい型変数)となるよう unifyし,
  74. 74. 型推論の例 (App) 2. Γにσ1 を施した上でs2を型推論し、σ2とτ2を得る。 3. τ1 == τ2 → β    となるよう unifyし, m2 番目の型変数を新しく取り出す
  75. 75. 型推論の例 (App) 3. τ1 == τ2 → β    となるよう unifyし, 成功したら σ3を得る
  76. 76. 型推論の例 (App) 3. τ1 == τ2 → β    となるよう unifyし, 成功したら σ3を得る
  77. 77. 型推論の例 (App) 4.Appの型規則を適用する。
  78. 78. 4.Appの型規則を適用する。
  79. 79. 型推論の例 (App) 4.Appの型規則を適用する。 必要な代入
  80. 80. 型推論の例 (App) 4.Appの型規則を適用する。 なる代入σを返したい
  81. 81. 型推論の例 (App) 4.Appの型規則を適用する。 なる代入σを返したい
  82. 82. 型推論の例 (App)
  83. 83. 型推論の例 (App) 他の構文(Fst, Sndなど)に関しても同様に証明できる
  84. 84. まとめ •型変数を数ではなく不等式を用いて表現する方式に 改良し、また型定義を generic programming の考 え方を取り入れてより一般的に改良することで、型 推論器における syntax の拡張と証明の簡略化を実 現した •ソースコード : github.com/kdxu/inferagda 
 (Agda 合計1913行)
  85. 85. 今後の課題 •構文の拡張(多相のLet文など)
 PolyP [Janssonら, 1997] や Indexed Functors [Löhら, 2011] など型パラメタを扱えるものを使う必要がある •完全性の証明 型がつかない場合 :

×