PowerPoint - Programming Logic Group

プログラム理論特論
第7回
亀山幸義
[email protected]
http://logic.is.tsukuba.ac.jp/~kam/progtheory
前回

前回:型付きラムダ計算の拡張
直積、リスト
 多相型(導入のみ)


今回:型付きラムダ計算の拡張
多相型(続き)
 サブタイピング、レコード型

型システムの拡張1ーリスト
リストのプログラミング

基本的な操作関数
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



(制限された一階)述語論理の定理証明手続きをそのまま
プログラムの実行と見なそう、という立場
関数型 functional programming



Prolog, GHC, ...
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点をあらわす
(3,5)
x座標、y座標を知りたい
あるベクトルにそって動かしたい
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言語の型システムの詳細
中間レポートの解説
時間があれば、コントロールオペレータの型理論

名前つき、順番のない直積