自己紹介 情報科学の研究をしています 専門はプログラミング言語とか型理論とか 研究のひとつは Java の改良ですが Java でプログラムは書きません ( けません ) ML 歴 16 年 OCaml 歴は 11 年くらい の著者です

Similar documents
snkp-14-2/ky347084220200019175

Microsoft Word - 漸化式の解法NEW.DOCX

Microsoft PowerPoint - mp11-02.pptx

Parametric Polymorphism

# let rec sigma (f, n) = # if n = 0 then 0 else f n + sigma (f, n-1);; val sigma : (int -> int) * int -> int = <fun> sigma f n ( : * -> * ) sqsum cbsu

Microsoft PowerPoint - mp11-06.pptx

数学2 第3回 3次方程式:16世紀イタリア 2005/10/19

tnbp59-21_Web:P2/ky132379509610002944

【FdData中間期末過去問題】中学数学2年(連立方程式計算/加減法/代入法/係数決定)

微分方程式による現象記述と解きかた

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

ML 演習 第 4 回

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

Microsoft PowerPoint - 10.pptx

メソッドのまとめ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

学習指導要領

Java知識テスト問題

PowerPoint Presentation

オートマトンと言語

コンパイラ演習 第 7 回

プログラミング実習I

様々なミクロ計量モデル†

情報実習Ⅱ

微分方程式 モデリングとシミュレーション

デバッグの工夫

PowerPoint プレゼンテーション

モデリングとは

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

< F2D A793F18CB388EA8E9F95FB92F68EAE2E6A7464>

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

プログラミング実習I


数学 Ⅲ 微分法の応用 大学入試問題 ( 教科書程度 ) 1 問 1 (1) 次の各問に答えよ (ⅰ) 極限 を求めよ 年会津大学 ( 前期 ) (ⅱ) 極限値 を求めよ 年愛媛大学 ( 前期 ) (ⅲ) 無限等比級数 が収束するような実数 の範囲と そのときの和を求めよ 年広島市立大学 ( 前期

スライド 1

Microsoft PowerPoint - 13.ppt [互換モード]

memo

kiso2-03.key

数学○ 学習指導案

EBNと疫学

Microsoft PowerPoint - mp13-07.pptx

学習指導要領

頻出問題の解法 4. 絶対値を含む関数 4.1 絶対値を含む関数 絶対値を含む関数の扱い方関数 X = { X ( X 0 のとき ) X ( X <0 のとき ) であるから, 絶対値の 中身 の符号の変わり目で変数の範囲を場合分けし, 絶対値記号をはずす 例 y= x 2 2 x = x ( x

5 1F2F 21 1F2F

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

切片 ( 定数項 ) ダミー 以下の単回帰モデルを考えよう これは賃金と就業年数の関係を分析している : ( 賃金関数 ) ここで Y i = α + β X i + u i, i =1,, n, u i ~ i.i.d. N(0, σ 2 ) Y i : 賃金の対数値, X i : 就業年数. (

アルゴリズムとデータ構造

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - ad11-09.pptx

Microsoft Word - 201hyouka-tangen-1.doc

Transcription:

ML 型推論の光と影 @ 平成廿一年東都大駱駝会 京都大学五十嵐淳

自己紹介 情報科学の研究をしています 専門はプログラミング言語とか型理論とか 研究のひとつは Java の改良ですが Java でプログラムは書きません ( けません ) ML 歴 16 年 OCaml 歴は 11 年くらい の著者です

いきなり鶴亀算 OCaml プログラマとラクダが合わせて 7 匹いる 足の数が合わせて 20 本である時 OCaml プログラマとラクダはそれぞれ何匹いるか 小学生の解法全員ラクダだとすると足の数は 4 x 7 = 28 本実際には 20 本あるから 8 本分ラクダが多いラクダ一匹を OCaml プログラマに置き換えると足は 2 本減るから 4 人置き換えれば丁度よい OCaml プログラマ 4 匹 ラクダ 3 匹

いきなり鶴亀算 OCaml プログラマとラクダが合わせて 7 匹いる 足の数が合わせて 20 本である時 OCaml プログラマとラクダはそれぞれ何匹いるか 中学生の解法 OCaml プログラマの数を x ラクダの数を y とすると x + y = 7 2x + 4y = 20 これを解いて x = 4, y = 3

中学生の解法のエラいところ 未知数の導入 未知数を使った式で状況をとにかく表現 簡単に解ける問題 ( 連立一次方程式 ) に帰着

今日のおはなし ML 型推論の仕組み 長所 短所を知る MLの型検査と型推論 ML 型推論の仕組み 多相型などにはほとんど踏みこみません ML 型推論礼賛 ML 型推論に毒づく解毒剤まとめ

ML の型検査 型推論

ML の型検査 プログラムの つじつまが合っているか の検査 if の条件部には真偽値がくるか 関数の引数は適当か プログラム実行前に行われる ( 静的検査 ) 型検査を通過 データの 種類 にまつわるエラーが実行時に発生しないことが保証される 0 での除算などのエラーはその限りではない 型安全性

型 プログラム ( 断片 ) の分類のためのラベル int 型 実行結果が整数である ( あろう ) ような式 bool 型 実行結果が真偽値であるような式 int bool 型 実行結果が 整数を引数として真偽値を返すような 関数値であるような式 分類にあてはまる式が つじつまの合った式 1+1 は int 型の式 fun x x > 3 は int bool 型の式 if 3 then 4 else 5 は型が与えられない式

型付け規則 何がつじつまの合った式なのかを型を使って規定 整数定数式には int 型を与える 式 e1 と e2 ともに int 型が与えられるなら 式 e1+e2 には int 型を与える 式 e1 と e2 に それぞれ S T 型 S 型が与えられるなら 適用式 e1 e2 には T 型を与える x は S 型であるという仮定の下で式 e に T 型が与えられるなら fun x e には S T 型を与える

型推論 変数に対する型宣言のないプログラムから を知る 変数の型プログラムの型 fun x x > 1 の型は? x は int 型で 全体は int bool 型です!

ML 型推論の仕組み Hindley の写真 Milner の写真 J. Roger Hindley (b. 1938) Robin Milner (b. 1934) Luís Damas (b. 19??) John Alan Robinson (b. 1930)

問題設定の確認 入力 : 式 ( と これまでに定義された関数などの型 ) 出力 : 各変数の型と式の型 または エラー

基本的なアイデア : 中学生の鶴亀算 わからないことは変数で表す 型変数 (α, β,...) の導入 状況をとにかく式で表す 状況 : 部分式の型同士の関係 型付け規則の役割 各部分式の型の間に成立すべき関係の規定 具体的な問題全てに共通する背景知識簡単な問題に帰着 ML の場合 : 一階の単一化 (unification) 問題

例題 (1): fun f f(3) + 2 f の型は α, 各部分式 3, f(3), 2, f(3)+2, fun f f(3)+2 の型を β1,...,β5 とおく 型付け規則から方程式を立てる 整数定数式の型付け規則 β1 = int 関数呼び出し式の型付け規則 α = β1 β2 整数定数式の型付け規則 β3 = int 足し算式の型付け規則 β2 = int, β3 = int, β4 = int funの型付け規則 β5 = α β4 解く! α = int int, β1 =... = β4 = int β5 = (int int) int

例題 (2): fun f f(3) + f f の型は α, 各部分式 3, f(3), f(3)+f, fun f f(3)+f の型を β1,...,β4 とおく 型付け規則から方程式を立てる 整数定数式の型付け規則 β1 = int 関数呼び出し式の型付け規則 α = β1 β2 整数定数式の型付け規則 α = int 足し算式の型付け規則 β2 = int, α = int, β3 = int funの型付け規則 β4 = α β3 解く! 解けない!

鶴亀算でいうと Ocaml プログラマとラクダが合わせて 7 匹いる 足の数が合計で 20 本であった レントゲン写真を撮ってみると胃が 14 個見える Ocaml プログラマとラクダはそれぞれ何匹いるか ちなみにラクダには胃が 3 つある ( 生物学的には 4 つでひとつは退化しているらしい ) OCaml プログラマの数を x ラクダの数を y とすると x + y = 7 2x + 4y = 20 x + 3y = 14 この方程式には解がない

例題 (2): fun f f(3) + f... 整数定数式の型付け規則 β1 = int 関数呼び出し式の型付け規則 α = β1 β2 整数定数式の型付け規則 α = int 足し算式の型付け規則 β2 = int, α = int, β3 = int funの型付け規則 β4 = α β3 解く! 解けない! って よく見たら f を関数として使ったり 整数として使ったりしてるじゃん 型検査を通してはいけないプログラム

例題 (3): fun f f(3) f の型は α, 各部分式 3, f(3), fun f f(3) の型を β1,...,β3 とおく 型付け規則から方程式を立てる 整数定数式の型付け規則 β1 = int 関数呼び出し式の型付け規則 α = β1 β2 funの型付け規則 β3 = α β2 解く! 別解が無数にある! 解 1: α = int int, β3=(int int) int 解 2: α = int string, β3=(int string) string 解 3: α = int int list, β3=(int int list) int list...

ふたたび鶴亀算でいうと Ocaml プログラマとラクダが合わせて 7 匹いる 目の数は合計で 14 個であった OCaml プログラマとラクダはそれぞれ何匹いるか OCaml プログラマの数を x ラクダの数を y とすると x + y = 7 2x + 2y = 14 これを解いて x = 7 y ( 解のパラメータ表示 ) この関係を満たす自然数 x, y ならなんでもよい

例題 (3): fun f f(3)... 整数定数式の型付け規則 β1 = int 関数呼び出し式の型付け規則 α = β1 β2 funの型付け規則 β3 = α β2 解く! fun 式の型 β3 = (int β2) β2 上の式を満たす β3 β2 ならなんでもよい 多相性!

方程式の一般形と解法 型に関する等式の集合 等式の例 : β int = (bool * α) δ 両辺 : int, bool などの基本型と型変数を や * で繋いでいった型 一般的には 一階 (first-order) の単一化問題 と呼ばれる ( 解ける場合には ) 解が必ず求まる方法 ( 詳細は省略 ) がある![Robinson65] しかも 最も一般的 な解が求まる! 全ての解のパラメータ表示

ここまでのまとめ ML の型推論は単一化問題に帰着できる 式が型付けできるかどうか = 式から導かれる単一化問題の解の有無 解が複数ある場合 : 多相的なプログラム

ML 型推論礼賛

プログラムにいちいち型書かなくてもよくて しかも安全なんてちょー便利じゃん だよね

ML 型推論の性質 型推論の完全性 ( 主要型の推論 ) うまく変数の型を与えれば型検査に通るようなプログラムは必ず型推論に成功する 型宣言はいつでも省略可 最も一般的な型 ( 主要型 ) を推論 型推論の健全性 型推論に成功したプログラムは必ず型エラーなく実行できる

主要型 式に与えうる型のバリエーション全てを網羅するような ( 多相 ) 型 fun x (x, x) に与えうる型 int int*int string string*string int list int list * int list 主要型は : α α * α 主要型の推論 は単一化を解くアルゴリズムの性質の系

ML 型推論に毒づく ここにはイギリスのロックバンド Black Sabbath のアルバム Heaven and Hell のジャケットがあると思ってください

つーか ML ってプログラム見ても型書いてなくて 何すんだかわかんねーんだけど だよね ここにはイギリスのロックバンド Black Sabbath のアルバム Heaven and Hell のジャケットがあると思ってください

つーか ML ってプログラム見ても型書いてなくて 何すんだかわかんねーんだけど だよね トップレベルの関数くらいは型が宣言されていた方が親切かもしれません ( 特に一週間後のあなたに ) ここにはイギリスのロックバンド Black Sabbath のアルバム Heaven and Hell のジャケットがあると思ってください

つーか ML ってさあ エラーメッセージが腐ってない? こないだもさぁ ここにはイギリスのロックバンド Black Sabbath のアルバム Heaven and Hell のジャケットがあると思ってください

let f x ls = (List.fold_left x (+) ls, x + 1);; Characters xx-yy:... x + 1);; ^ This expression has type (int -> int -> int) -> 'a -> int -> int -> int but is here used with type int こ この巨大な型はいったい!? (20 分後 デバグを終えて ) 間違えてんのここじゃねーし!( 怒 )

解毒剤

親切なエラーメッセージを出す研究 方程式を解く順序を工夫する エラーは ( 型 ) 変数消去ができなくなった時に発生する 型推論が いかに失敗したか をうまく説明 適当な経験則でエラー箇所を推測 (& 修正の提案 ) 経験則の例 : 場合分けの各枝で型が合わない場合は多数決で (!) どの枝が悪いか決める エラーに関連するプログラムを抽出して見せる ( プログラムスライシング )

方程式を解く順序を工夫する fold_left : (α β α) α β list α x : α1, (+) : int int int fold_left x (+) ls, x + 1 fold_left x fold_left x (+) x +... α1 = α β α α = int int int α1 = int α を消去 α1 を消去即エラー α1 = (int int int) β (int int int) α1 = int

万能な順序付けは難しい 多くの ML 処理系では式の位置で解く順番が決まる 例えばペアの要素順を変えるだけで ぐっとわかりやすくなる let f x ls = (x + 1, List.fold_left x (+) ls);; Characters xx-yy:... List.fold_left x (+) ls);; ^ This expression has type int but is here used with type 'a -> 'b -> 'a 本当は いつでも 正しいあたり から解き始めたい

難しい というか 根本的な解決は無理な話では? 問題設定のどこ ( 個体数 足の数 胃の数 ) が間違っていたのか答える方法がないのと同じ? Ocaml プログラマとラクダが合わせて 7 匹いる 足の数が合計で 20 本であった レントゲン写真を撮ってみると胃が 14 個見える Ocaml プログラマとラクダはそれぞれ何匹いるか 結局 大体うまくいく経験則に頼るしかない

まとめ 方程式はエラい ML 型推論もかなりエラい 実行時の安全性保証主要な型の推論 何が間違いなのかを知るのは難しい経験則に基いた対策はいろいろ考えられている 実用上充分な決定版はまだない ラクダの胃の数は 3 つ 第三 第四の胃がくっついている

おまけ : 型推論実装演習のはなし 学生に ML 型推論を OCaml で実装させてます 対象 : 学部 3 回生 (Scheme の経験はあり ) 期間 : 週 6 コマの演習 x 6 週間のうち最後の 2 週間 多相性はオプション 正しく実装するのは難しいです 方程式の構成と単一化の解消を交互にやるのがミスりやすい 結果 : はじくべきプログラムをはじけない 対策 : テスト用の正例 反例両方を提供

学生の実装の傑作 No.1 # let s x y z = x z (y z);; (* 正しい結果 *) val s : ('a 'b 'c) ('a 'b) 'a 'c = <fun> (* 学生 X の提出したプログラムの出力 *) val s : 'a 'b 'c 'd = <fun> Obj.magic か!?