プログラム理論特論 第7回

26
プププププププププ ププププ [email protected] http://logic.is.tsukuba.ac.jp/~ kam/progtheory

Upload: alka

Post on 22-Jan-2016

55 views

Category:

Documents


0 download

DESCRIPTION

プログラム理論特論 第7回. 亀山幸義 [email protected] http://logic.is.tsukuba.ac.jp/~kam/progtheory. 前回. 前回:型付きラムダ計算の拡張 直積、リスト 多相型(導入のみ) 今回:型付きラムダ計算の拡張 多相型(続き) サブタイピング、レコード型. 型システムの拡張1ーリスト. リストのプログラミング. 基本的な操作関数 nil あるいは [ ] 空リスト cons(M, L) リストLの先頭に要素Mを追加する head(L) リストLの先頭要素 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: プログラム理論特論 第7回

プログラム理論特論第7回

亀山幸義[email protected]

http://logic.is.tsukuba.ac.jp/~kam/progtheory

Page 2: プログラム理論特論 第7回

前回 前回:型付きラムダ計算の拡張

直積、リスト 多相型(導入のみ)

今回:型付きラムダ計算の拡張 多相型(続き) サブタイピング、レコード型

Page 3: プログラム理論特論 第7回

型システムの拡張1ーリスト

Page 4: プログラム理論特論 第7回

リストのプログラミング 基本的な操作関数

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]

Page 5: プログラム理論特論 第7回

リストのプログラミング リスト2つの連結 append  と リストの反転

reverse

Page 6: プログラム理論特論 第7回

リストのプログラミング append と  reverse の計算

Page 7: プログラム理論特論 第7回

リストのプログラミング append を 型付きラムダ計算で記述すると。。。

Page 8: プログラム理論特論 第7回

リストのプログラミング append の型は多相型

Page 9: プログラム理論特論 第7回

リストのプログラミング リストの長さ length, 2つのリストの併合 merge

Page 10: プログラム理論特論 第7回

リストのプログラミング リストを使った Quick Sort

Page 11: プログラム理論特論 第7回

リストのプログラミング リストを使った Quick Sort

Page 12: プログラム理論特論 第7回

リストのプログラミング qsort  を「 less-than をもらって sort を行う関

数」として定式化したら。。。

Page 13: プログラム理論特論 第7回

多相型の効用 一般的な qsort の利用

データを順番に並べて保管したい( e.g.  学生の成績) データは、いくつかの性質の記述からなる。

学籍番号、英語の成績、算数の成績 種々の変更

ある時、データの形式が変わった 100点満点のデータがA,B,C,Dの4段階評価になった TOEICと情報処理技術者試験の点数もいれることにした

比較基準が変わった 80点以上の科目の個数で並べていたが、Aの個数で比較することに

なった それでも、 qsort アルゴリズムには変更がないので、プログラ

ムを書き換えたり、コンパイルしなおさなければいけないのだろうか?

解決策 型のないプログラム言語、いい加減な型システムを持っている

プログラム言語では問題ない(が、プログラムの安全性、保守性が悪くなる。)

型のあるプログラム言語では多相型

Page 14: プログラム理論特論 第7回

ML言語における多相型 MLでは多相型関数は、 let 宣言(あるいは、関

数定義)に伴ったときのみ、定義できる。

Page 15: プログラム理論特論 第7回

ML言語における多相型 MLでは多相型関数は、 let 宣言(あるいは、関

数定義)に伴ったときのみ、定義できる。

Page 16: プログラム理論特論 第7回

(新しい)プログラミング・パラダイム

新しいプログラミング・スタイルの記述 論理型  logic programming

Prolog, GHC, ... (制限された一階)述語論理の定理証明手続きをその

ままプログラムの実行と見なそう、という立場 関数型 functional programming

Lisp/Scheme, ML, ... 「プログラム=関数=ラムダ式」

オブジェクト指向 Object-Oriented Programming SmallTalk, ABCL, ..  (今ではもちろんJava な

ど) オブジェクトを中心にプログラムを組み立てる

1980年代の話です。

Page 17: プログラム理論特論 第7回

論理型プログラム言語のその後 もう終わった(基本的なスタイルは確立された)

e.g. ICOTプロジェクト 広い範囲で使える実用的な言語としての地位は得られ

なかった 特定の分野では使える

基本的なスタイルからの脱却 制約( Constraint) プログラミング

いろいろな問題を制約の集合として記述し、問題解決を制約解消に帰着する

型推論も、 α = β→γ などの制約の集合を解く問題と考えられる

帰納学習との関連: 帰納論理プログラミング f(3)=9, f(5)=25, f(6)=36  から f を求める問題

Page 18: プログラム理論特論 第7回

関数型プログラム言語のその後 まずまずの成功

型システムと結びついて、プログラム言語の基礎的な研究はほとんどすべて関数型プログラムに基づいて行われるようになった

他のパラダイム(オブジェクト指向など)も関数型をベースとして理解する方向

e.g. この授業 実用性は?

今のところ、成功しているとはいいがたい(教育、研究用の言語にとどまる)

日々のプログラムを ML, Lisp で書いている人は研究者ぐらい? 現在のコンピュータのアーキテクチャ上ではC言語などで書いた方が高速に実行される

ヨーロッパでは、高い信頼性を持ったプログラムを欲する Philips などのメーカーが ErLang 言語などを使いはじめている

アプリケーション・プログラムのためのプログラム言語ではなく、システムの背後にひそむプログラム(コンパイラ、プログラムの検証システム etc.)  を書く用途には適している

Page 19: プログラム理論特論 第7回

オブジェクト指向プログラム言語のその後

実用的には大成功 プログラム言語の主流

一方で、、、 プログラムの信頼性の向上のためにはまだまだ考え

なければいけないことが多い 意味論や形式的取り扱いが(関数型や論理型に比べて)不透

明な部分がある

Page 20: プログラム理論特論 第7回

オブジェクト指向言語(OO)における

オブジェクト Object ありふれた例だが。。。

(3,5)

y 2次元平面上の1点をあらわす

x座標、y座標を知りたい

あるベクトルにそって動かしたい

Page 21: プログラム理論特論 第7回

オブジェクト指向言語(OO)における

オブジェクト Object

(3,5)

Page 22: プログラム理論特論 第7回

オブジェクト Object

ところが、色のデータも持たせたくなった

(3,5)

Page 23: プログラム理論特論 第7回

オブジェクト Object

Point  も ColoredPoint  も、 get_x  や move という関数(OO言語ではメソッドと呼ばれる)が使えることにはかわりがない。

この f  をColoredPointに適用するのは、エラーだろうか?

Page 24: プログラム理論特論 第7回

オブジェクト Object

OO言語: オブジェクト

いくつかの(0個以上の)データと、それに対する操作関数(メソッド)から構成される

そこに列挙された操作関数以外で内部データをさわることはできない [ 情報の隠蔽 これが大事 ]

クラス:オブジェクトを生成するための「ひな形」 型理論でOO言語を理解するためには

クラス=型、オブジェクト=プログラム(項) オブジェクトは、いくつかのデータおよび関数(こ

れも λ 計算では単なるデータ)から構成される。ただし、名前がついている。

Page 25: プログラム理論特論 第7回

OO言語の型理論 レコード型

名前つき、順番のない直積

Subtyping

Page 26: プログラム理論特論 第7回

来週

OO言語の型システムの詳細 中間レポートの解説 時間があれば、コントロールオペレータの型理

論 名前つき、順番のない直積