260 likes | 432 Views
プログラム理論特論 第7回. 亀山幸義 kam@is.tsukuba.ac.jp http://logic.is.tsukuba.ac.jp/~kam/progtheory. 前回. 前回:型付きラムダ計算の拡張 直積、リスト 多相型(導入のみ) 今回:型付きラムダ計算の拡張 多相型(続き) サブタイピング、レコード型. 型システムの拡張1ーリスト. リストのプログラミング. 基本的な操作関数 nil あるいは [ ] 空リスト cons(M, L) リストLの先頭に要素Mを追加する head(L) リストLの先頭要素
E N D
プログラム理論特論第7回 亀山幸義 kam@is.tsukuba.ac.jp http://logic.is.tsukuba.ac.jp/~kam/progtheory
前回 • 前回:型付きラムダ計算の拡張 • 直積、リスト • 多相型(導入のみ) • 今回:型付きラムダ計算の拡張 • 多相型(続き) • サブタイピング、レコード型
リストのプログラミング • 基本的な操作関数 • nil あるいは [ ] 空リスト • cons(M, L) リストLの先頭に要素Mを追加する • head(L) リストLの先頭要素 • tail(L) リストLの先頭要素を取り除いたリスト • empty?(L) リストLが空リストであるかどうか? head(nil)やtail(nil)の値がどうなるかはここでは気にしないことにする(本来ならば、エラーにすべき) • 省略形 • cons(a, cons(b, cons(c, nil))) を [a, b, c] と書く。 • head([a,b,c]) = a, tail([a,b,c]) = [b, c]
リストのプログラミング • リスト2つの連結 append と リストの反転reverse
リストのプログラミング • appendと reverseの計算
リストのプログラミング • appendを 型付きラムダ計算で記述すると。。。
リストのプログラミング • appendの型は多相型
リストのプログラミング • リストの長さlength, 2つのリストの併合merge
リストのプログラミング • リストを使ったQuick Sort
リストのプログラミング • リストを使ったQuick Sort
リストのプログラミング • qsort を「less-thanをもらって sortを行う関数」として定式化したら。。。
多相型の効用 • 一般的なqsortの利用 • データを順番に並べて保管したい(e.g. 学生の成績) • データは、いくつかの性質の記述からなる。 • 学籍番号、英語の成績、算数の成績 • 種々の変更 • ある時、データの形式が変わった • 100点満点のデータがA,B,C,Dの4段階評価になった • TOEICと情報処理技術者試験の点数もいれることにした • 比較基準が変わった • 80点以上の科目の個数で並べていたが、Aの個数で比較することになった • それでも、qsortアルゴリズムには変更がないので、プログラムを書き換えたり、コンパイルしなおさなければいけないのだろうか? • 解決策 • 型のないプログラム言語、いい加減な型システムを持っているプログラム言語では問題ない(が、プログラムの安全性、保守性が悪くなる。) • 型のあるプログラム言語では多相型
ML言語における多相型 • MLでは多相型関数は、let宣言(あるいは、関数定義)に伴ったときのみ、定義できる。
ML言語における多相型 • MLでは多相型関数は、let宣言(あるいは、関数定義)に伴ったときのみ、定義できる。
1980年代の話です。 (新しい)プログラミング・パラダイム • 新しいプログラミング・スタイルの記述 • 論理型 logic programming • Prolog, GHC, ... • (制限された一階)述語論理の定理証明手続きをそのままプログラムの実行と見なそう、という立場 • 関数型 functional programming • Lisp/Scheme, ML, ... • 「プログラム=関数=ラムダ式」 • オブジェクト指向 Object-Oriented Programming • SmallTalk, ABCL, .. (今ではもちろんJava など) • オブジェクトを中心にプログラムを組み立てる
論理型プログラム言語のその後 • もう終わった(基本的なスタイルは確立された) • e.g. ICOTプロジェクト • 広い範囲で使える実用的な言語としての地位は得られなかった • 特定の分野では使える • 基本的なスタイルからの脱却 • 制約(Constraint)プログラミング • いろいろな問題を制約の集合として記述し、問題解決を制約解消に帰着する • 型推論も、α=β→γなどの制約の集合を解く問題と考えられる • 帰納学習との関連: 帰納論理プログラミング • f(3)=9, f(5)=25, f(6)=36 から f を求める問題
関数型プログラム言語のその後 • まずまずの成功 • 型システムと結びついて、プログラム言語の基礎的な研究はほとんどすべて関数型プログラムに基づいて行われるようになった • 他のパラダイム(オブジェクト指向など)も関数型をベースとして理解する方向 • e.g. この授業 • 実用性は? • 今のところ、成功しているとはいいがたい(教育、研究用の言語にとどまる) • 日々のプログラムをML, Lispで書いている人は研究者ぐらい? • 現在のコンピュータのアーキテクチャ上ではC言語などで書いた方が高速に実行される • ヨーロッパでは、高い信頼性を持ったプログラムを欲するPhilipsなどのメーカーがErLang言語などを使いはじめている • アプリケーション・プログラムのためのプログラム言語ではなく、システムの背後にひそむプログラム(コンパイラ、プログラムの検証システムetc.) を書く用途には適している
オブジェクト指向プログラム言語のその後 • 実用的には大成功 • プログラム言語の主流 • 一方で、、、 • プログラムの信頼性の向上のためにはまだまだ考えなければいけないことが多い • 意味論や形式的取り扱いが(関数型や論理型に比べて)不透明な部分がある
オブジェクト指向言語(OO)におけるオブジェクト Object • ありふれた例だが。。。 y 2次元平面上の1点をあらわす x座標、y座標を知りたい あるベクトルにそって動かしたい (3,5) x
オブジェクト指向言語(OO)におけるオブジェクト Object y (3,5) x
オブジェクト Object • ところが、色のデータも持たせたくなった y (3,5) x
オブジェクト Object • Point も ColoredPoint も、get_x や move という関数(OO言語ではメソッドと呼ばれる)が使えることにはかわりがない。 • このf をColoredPointに適用するのは、エラーだろうか?
オブジェクト Object • OO言語: • オブジェクト • いくつかの(0個以上の)データと、それに対する操作関数(メソッド)から構成される • そこに列挙された操作関数以外で内部データをさわることはできない[情報の隠蔽 これが大事] • クラス:オブジェクトを生成するための「ひな形」 • 型理論でOO言語を理解するためには • クラス=型、オブジェクト=プログラム(項) • オブジェクトは、いくつかのデータおよび関数(これもλ計算では単なるデータ)から構成される。ただし、名前がついている。
OO言語の型理論 • レコード型 • 名前つき、順番のない直積 • Subtyping
来週 • OO言語の型システムの詳細 • 中間レポートの解説 • 時間があれば、コントロールオペレータの型理論 • 名前つき、順番のない直積