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)

大学院
– プログラム理論特論