Transcript PowerPoint
情報科学概論
ープログラムと論理ー
亀山 幸義
http://www.is.tsukuba.ac.jp/~kam
2002.09.27
分野の位置付け
大学院システム情報工学研究科
– コンピュータサイエンス専攻
数理情報分野
– 。。。
情報学類
情報科学主専攻
知能ソフトウェア分野
– 記号計算:井田、Middeldorp, 南出
– プログラム論理: 亀山(幸)
– インタラクティブプログラミング: 田中
– 知能ロボット: 大矢
人工知能:
細野、水谷、
山本(順)
。。。
理工学研究科電子情報工学分野も同様
内容
情報科学概論
ソフトウェアの信頼性
論理パズル
形式化
ソフトウェア・システム
の検証
情報科学概論Ⅰ
ソフトウェアの信頼性
ソフトウェアの論理
証明とプログラム
ソフトウェアの合成・検
証
何だ。同じじゃない!
実は内容は異なる: 1学期(2年生)向けの内容は以下の場所から
亀山ホームページー>教育ー>情報科学概論のページ
「ソフトウェアの危機」とは?
少し前まで世の中で盛
んに言われていた
「社会が必要とするソフ
トウェアの量が増大す
るペースに対して、ソフ
トウェア技術者の人数
が増大するペースがは
るかに低い」
「いずれ近いうちにソフ
トウェアの量が不足す
る。これは大問題だ!」
No!
情報学類の目指すものは?
たくさんのプログラムを書ける人
あっという間にプログラムを書ける人
ソフトウェアのバグを次々と見つけて直す人
・・・
No!
情報学類が本当に目指すもの
(4年後の理想)
本当に質の良いプログラムを(時間がかかって
も)書ける人
ソフトウェアの質の良さを確保する方法を考えら
れる人
ソフトウェアの質を向上させるソフトウェアを書け
る人
ソフトウェア
は量より質
当たり前じゃん!
ソフトウェア科学とは
ソフトウェアそのものを対象とする学問;情報科学の
中心的話題
ソフトウェアの目指す方向性
– 高機能、高性能であること
– 使いやすいこと
– 安定していること、高い信頼性をもつこと
現在のソフトウェア・社会システムの弱点:信頼性
– みずほ銀行
– スペースシャトル:打ち上げ直前に延期
– 西暦2000年問題
ソフトウェアと論理に関する
2つのアプローチ
プログラムのための論理
Programs)
(Logic for
– プログラムが満たすべき性質(仕様)を論理式で
記述し、その性質が満たされることを証明する
– cf 水谷先生の授業
(Logic in
Programs, Logic of Programs)
プログラムにおける論理
– プログラムそのものの論理を考える。プログラム
言語=論理、プログラミング=推論
– いったい何がうれしくてそんなことをするのか?
証明はプログラムである
正の整数a、bに対して割り算の結果(商と余
り)が存在することを証明しよう。
(正しいが内容が不足している)定理: a≧0,
b>0 ならば a = bd +r となる整数d とr
が存在する。
正しい定理: a≧0,b>0 ならば a = bd +
r かつ 0≦r<bとなる整数d とrが存在する。
証明はプログラムである
証明: aに関する帰納法を使う
– 証明したいこと: 「すべての整数bに対して、b>0 なら
ば a = bd +r かつ 0≦r<bとなる整数d と r が存在
する。」
– 0≦a<bのとき、d=0,r=aとおけばよい。
– a≧bのとき、
(a-b)に対して帰納法の仮定をつかうと
a-b=be+s かつ
0≦s<b となる整数eとsが存在する。
すなわち、a=b(e+1)+s となる。
d=e+1 かつ r=s とおけば、条件を満たしていることがわか
る。
– 以上より、すべての整数a≧0に対して、「証明したいこと」
は成立する。
– よって定理は成立する。
証明はプログラムである
ー証明はプログラムを含んでいるー
f : 引数a,bをもらって<d, r>と
いう形の答えを返す。
プログラム
– 0≦a<bのとき、f(a,b)=<0, a>とする。
– a≧bのとき、
(a-b)
と b に対して再帰呼び出しをつかって
f(a-b,b)を計算する。その答えを<e, s>とする。
つまり、f(a-b,b)=<e, s> とする。
f(a,b)=<e+1, s>とする。
f
は a÷b の商と余りの対(つい、ペア)を
返す関数である
証明はプログラムである
f (int a,b){
if (0<=a && a<b) {
return <0,a>;
} else {
int e,s;
<e,s> = f(a-b,b);
return <e+1,s>;
}
}
f (int a,b) {
d = 0;
while (a >= b) {
d = d + 1;
a = a – b;
}
return <d,a>;
}
帰納法の証明が、関数の再帰呼び出し、もしくは、ループ
構造(white文など)に対応している。
プログラミングは推論である
プログラミング=プログラムを書くこと
推論=論理における演繹(えんえき)
– 例:「A」と「AならばB」から「B」を導き出す
– 例:「任意のxに対してA(x)」から「A(103)」を導
き出す
プログラミングは推論である
g : 引数a,b(いずれも正の整
数)をもらって整数を返す
プログラム
– a=bのとき、g(a,b)=a
– a<bのとき、g(a,b)=g(a,b-a)
– a>bのとき、g(a,b)=g(a-b,b)
gは何を計算する関数だろうか?
答え:
最大公約数
Euclidの互助法 (世界最古?のアルゴリズム)
プログラミングは推論である
前ページのプログラム g が最大公約数を計算
することの証明
– a に関する帰納法。。。うまくいかない
– b に関する帰納法。。。うまくいかない
- a+b に関する帰納法。。。うまくいく
「最大公約数を計算するプログラムを書け」と
いわれて g を書く人は、実際には上記の推論
と同等のことを頭の中でやっている。
プログラミングは推論である
今年の大学院の試験問題より
f(x)=
x-10 if x>100
f(f(x+11)) if x ≦ 100
プログラム f を書いた人は、f がきちんと動くことに責
任を持たなければいけない。
任意の整数xに対してf(x)の計算が有限時間で停止
することを証明する
f は McCarthy の 91関数
証明=プログラム
証明はプログラム(の原型)を含む
プログラムを書く行為は推論を伴っている
帰納法は、再帰呼び出しに対応する
「「AならばB」の証明」は、「Aを実現する計算があた
えられるとBを実現するプログラム(関数)」に対応
する
「証明=プログラム」の原理
普通の論理とプログラムの論理
「普通の論理」と「プログラムの論理」は一致しない
普通の論理を使った証明
– 定理:無理数 a,b で abが有理数となるものが存在する
– 証明: 場合分けによる
– Case-1:
が有理数のとき
a=
,b=
– Case-2:
a=
とすればよい。
が無理数のとき
,b=
とすればよい。
しかし、この証明からは、具体的にaとb(の小数点以下第n桁)
を求めるプログラムは得られない。
プログラムの論理=構成的論理
「普通の論理」=古典論理(「AまたはAでない」がい
つでも無条件で成立する論理)
「プログラムの論理」=古典論理から「AまたはAで
ない」という原理を取り除いた論理
プログラムの論理のことを「構成的論理」という。
– 「A(x)となるxが存在する」ことの証明から、そのようなx
を具体的に(計算によって)構成することができる
構成的論理では、「AまたはAでない」という原理は
– どんな問題Aをもってきても「Aであるか、Aでないかを有
限時間で判定できるプログラム」をもってこないと正しいこ
とがいえない。もちろんそんなプログラムは存在しない。
「(構成的論理における)証明=
プログラム」原理の応用
プログラムを書いてから、その性質を推論す
るのは割合大変
証明がプログラムを含んでいるなら、最初か
らプログラムを作らず、証明を作ればよい
構成的プログラミング
プログラムの仕様(要求仕様、こう動いてほしいという性質)
を論理式で記述する
A(a,b,d,r) を以下の論理式とする。
「a≧0,b>0 ならば
a = bd +r かつr<b」
プログラムfの正しさ
A(a,b,f1(a,b),f2(a,b))
仕様の妥当性
すべてのa,bに対して A(a,b,d,r)となるd、r が存在
今日の授業の前半でやったように、仕様の妥当性の証明
をすると、その中にプログラム f が含まれていた
ソフトウェアの検証と
構成的プログラミング
仕様(形式仕様)
プログラム
仕様(形式仕様)
証明
検証(証明)
自動的
正しさの保証された
プログラム
OK
「プログラム論理」の研究項目
プログラムのための論理
– 記号論理に基づくソフトウェアの検証
– モデル検査や抽象実行による検証
プログラムの論理
– プログラム言語の理論的基礎
型システム
関数プログラミング以外の計算モデル(並行計算、リアクティヴ計
算、。。。)
– 構成的論理、構成的プログラミング
目標
– 正しいことの保証されたソフトウェアの作成方法の確立
– (100%といわないまでも) ソフトウェアの信頼性を向上
させる技術の確立
関係する授業
情報数学の基礎
– 離散構造(1-3), Math. for CS (2-1)、情報数学(23)、オートマトンと形式言語(3-1)
プログラミング
– データ構造とアルゴリズム(2-1)、ソフトウェア技法(2-2)、
プログラム言語論(3-1)、宣言型プログラム論(3-2)
プログラム言語の理論
– 論理と形式化(2-1)、プログラム理論(3-2)、計算モデル
論(3-2)、計算論理(3-3)、システム検証論(3-3)
少人数コース
– 情報特別演習(2, 3),情報科学実験(3), 卒業研究(4)
大学院
– プログラム理論特論