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