Comments
Description
Transcript
pdfファイル
情報社会の将来 情報科学概論 z ソフトウェアの論理 目に見える変化 z z z 亀山 幸義 http://logic.is.tsukuba.ac.jp/~kam 2003.09.26 z z コンピュータのハードウェアは日進月歩 様々な新しい情報機器の登場 家電の情報化 10年先どころか5年先も予想が難しい 情報社会の鍵は? z ソフトウェア z z z ソフトウェアの高機能化、高性能化、使いやすさの向上 あらゆる機器が情報化(知能化)される 情報社会の弱点は? z ソフトウェア 1 ソフトウェアがひきおこした 社会的問題 z ソフトウェア科学とは 枚挙に暇がない z z z z z z z 2 z Y2K(西暦2000年)問題 スペースシャトルの打上げ延期 銀行ATMのダウン 航空券発券システムのダウン 携帯電話(電話機)の回収 Windowsシステムを狙ったウィルス etc. etc. etc. ソフトウェアに対する2つの立場 z z z ソフトウェアを使って様々な対象領域の問題を解く ソフトウェア自身を研究対象とする ソフトウェア科学の目指すもの z z z 高機能、高性能ソフトウェアの構成方法 使いやすいソフトウェアの構成方法 安定して、高い信頼性をもつソフトウェアの構成方法 3 4 高信頼ソフトウェアへ向けて z 今週:正しいソフトウェアとは何か? z z z ソフトウェアの正しさ 形式化と論理 ソフトウェアの仕様と正当性 来週:ソフトウェアの正しさを保証するにはどうし たらよいか? z 厳密な方法;定理証明、Hoare論理 z 近似による方法;型システム、抽象解釈 有限の場合の方法;モデル検査、時相論理 z 5 6 1 未来社会とソフトウェア科学 z 未来の社会 z z z z int foo (int x, int y) { int w = x; int z = 0; while (w >= y) { z = z + 1; w = w – y; } return z; } 社会の隅々に情報機器、情報システムがゆきわたる 社会の隅々にソフトウェアがゆきわたる 社会の隅々に不安定要因がゆきわたる 従来 (つい最近まで) z z z C言語で書いたプログラム 高信頼化の対象は、人命のかかるシステムなどの safety critical software e.g. 自動車のエンジン制御のソフトウェア 現在、近い将来 z z 問題発生時の社会的、経済的損失の増大 あらかじめソフトウェアを作る段階で、時間とコストをかけて信 頼性を高める方が結局は得策 このプログラムは「正しい」だ ろうか? z C言語のコンパイラを通る(コ ンパイルエラーがない) 実行時にエラーで止まること がない 意図した通りに動く z z 7 C言語で書いたプログラム int foo (int x, int y) { int w = x; int z = 0; while (w >= y) { z = z + 1; w = w – y; } return z; } z 8 C言語で書いたプログラム 何はともあれ、実行してみよう x=5, y=3 w=5, z=0 w >=y … 真 z=1 w=2 w >=y … 偽 foo(5,3)の答えは 1 int foo (int x, int y) { int w = x; int z = 0; while (w >= y) { z = z + 1; w = w – y; } return z; } 「foo (x, y) は x を y で 割った商を返す関数であ る」という仮説を立てられ そうだ 本当にそうだろうか? 9 C言語で書いたプログラム int foo (int x, int y) { int w = x; int z = 0; while (w >= y) { z = z + 1; w = w – y; } return z; } 10 C言語で書いたプログラム 「どんな整数 x と整数 y に対 しても foo(x, y) は x を y で割った商を返す関数で ある」 NO! これは正しくない foo (3, -2) を計算すると 止まらない! 負の数のことを考えていなかっ た! 11 int foo (int x, int y) { int w = x; int z = 0; while (w >= y) { z = z + 1; w = w – y; } return z; } では、このプログラムは「正しく ない」のだろうか? 必ずしもそうではない 「どんな整数 x と y に対しても foo (x, y) は x を y で割った 商を返す関数」は誤りだが 「どんな正の整数 x と y に対し ても foo(x, y) は x を y で 割った商を返す関数」は正し い 12 2 正しいプログラムとは? z z プログラムだけを見て、正しいかどうかを判断するこ とはできない。 「プログラムがどのように動作してほしいか」という性 質(条件)を、プログラムの仕様 (specification)とい う。 z z z 仕様1「すべての整数 x, y に対して。。。」 仕様2「すべての正の整数 x, y に対して。。。」 「正しさ」の定義 z z プログラムが仕様を満たすとき、そのプログラムはその仕 様に関して正しい(その仕様の正しい実現である)という。 関数 foo は、仕様1を満たさないが、仕様2を満たす。 13 仕様2(正の整数に対する割り算)に関して、先 のプログラムfooが正しいことを厳密に保証する ことはできるだろうか? z z z z 割り算をするプログラムの仕様は? z z 「正の整数」とは何か?「商」とは何か?「割る」とは何 か? 仕様を自然言語(日本語や英語)で書いている 限り、「厳密な(確実な)保証」はができない。 z 14 形式仕様 (formal specification) 仕様 z ソフトウェアの仕様 z z 自然言語: 意味があいまいなことがある 形式言語: 意味がきちんと(一意的に)定まっている。 入力(input) は、正の整数 x と y 出力(output)は、0以上の整数 z と w x, y, z, w の関係(入出力関係)を論理式で書く x = y * z + w ...これでは条件が不足している (x = y * z + w) かつ (0 ≦ w < y) ...これが正解 形式仕様: 形式言語(通常は論理式)を使って記述した 仕様 15 ソフトウェアの開発過程 論理による形式化 (頭の体操) (x=y*z+w)かつ... Validation 形式仕様 16 Verification 要求 『割り算のプログ ラムが欲しい』 プログラム p int foo (int x, …) { … } 本講義では、これ以降、Verification(検証)のみを扱う。 17 18 3 定義可能数 z z 定義可能数 日本語の文により、一意的に値が定まる自然数 を、「定義可能数」あるいは「D数」と呼ぼう。 (D...definable) z z z D数の例 z z z z 最大のD数はあるか? N文字以下の日本語で定義可能な最大のD数はある か? z 100+300*2 9999999999 富士山の高さをメートル単位で表したもの(小数点以 下は切り捨て) 2003年1月1日午前0時に宇宙にある分子数 NO. いくらでも大きなD数が定義できる z z z z YES 日本語で使う文字の種類は有限個(高々、数千、数万) 有限個の文字をN文字以下並べてできる文字列は有限個 そのうち自然数を一意的に定義しているものは有限個 有限個の自然数の集合は最大値を持つ 19 20 逆理(paradox) 最大の定義可能数 「27文字以下で定義可能な最大の 自然数」をXとする このようなXは一意的に存在する z 正しい(正しそうな)推論を積み重ねることによっ ていつの間にか矛盾(contradiction)が生じる z 有名な例 z 「27文字以下で定義可能な最大の 自然数に1を足した自然数」をYとする 素朴な集合論におけるRussellの逆理「x ∈xでないx をすべて集めた集合」を考えると矛盾する z z このようなYも一意的に存在する ⇒ Y=X+1 かつ X≧Y 現代集合論が発生する契機となった 正しそうに見える推論過程(あるいは正しいと 思っていた仮定)のどこかに誤りがある z 「大体正しい」という議論に対する戒めでもある 21 最大のD数の逆理 z z z z z まともな定義 推論過程をふりかえろう z z z z このような定義は「まとも」である z z どんな日本語の文を与えられても、それが自然数を一意的に 定義しているかどうかを判定することは(おそらく)できない z z 0 と 1 はD式である x と y がD式であるとき、(x+y) と (x*y) はD式である x がD式であるとき、(x!) はD式である z 1.D数の定義:日本語の文により、一意的に値が定まる自然 数 2.27文字以下で定義できるD数のうち最大のものが存在 3.この数に1を足した数が27文字以下で一意的に定義できて しまう 実は、2,3でなく、1が問題 「日本語の文により、一意的に定まる」とは? z 22 z 「奇数の完全数のうち最小のもの」 「四色で塗りわけられない最小の地図のサイズ」etc. 定義になっていないものから出発したのがいけなかった。 z 23 どんな文字列を与えられても、それがD式であるかどうかは機 械的に判定できる。 基本的な場合から始め、次のものを作り出す場合を有限回適 用して構成されるもの全体がきちんと定まる。 このような定義を帰納的定義(inductive definition)という。 24 4 天国へ行く道、地獄へ行く道 z 2つの扉 z z z z z z z z z 天国へ行く道への扉か、 地獄へ行く道につながる扉 見た目では区別できない z 「左の扉が天国行きですか?」 正しいとき z z 1人の人に質問できる z z 天国へ行く道、地獄へ行く道 z 何でも知っている 天使か悪魔 天使はいつでも真実を言う 悪魔はいつでも嘘をつく 正しくないとき z z z z z 天使なら「NO」 悪魔なら「YES」 回答がYESであったとしよう z 質問は YES / NO で回答で きるもの1つだけ どのような質問をすれば、左右 のどちらの扉が天国への扉か を知ることができるか? 天使なら「YES」 悪魔なら「NO」 「この人が天使で、かつ、左が 天国」か「この人が悪魔で、右 が天国」のどちらかである どちらであるかはわからない 失敗 25 天国へ行く道、地獄へ行く道 z z z z z 26 条件を整理して記述してみよう 「あなたは天使ですか?」 天使なら「YES」 悪魔なら「YES」 回答は常にYES 失敗 z 扉についての条件 z z z 天使・悪魔についての条件 z z z z z LEFT...「左の扉が天国への扉である」ことを意味 「LEFT」か「LEFTでない」かいずれかが成立する 〇A...「質問Aにその人が YES と答える」 天使なら「どんなAに対しても (A ⇔ 〇A)」 悪魔なら「どんなAに対しても (A ⇔ (〇Aでない))」 天使か悪魔のいずれか一方のみ成立 問題: LEFT ⇔ 〇B となる質問Bは何か? 27 z z 天国と地獄の解答 記号論理による形式化 条件 z 形式化は問題を解くのに不可欠か? z LEFT または LEFTでない z z 「任意のAに対して(A⇔〇A)」 または 「任意のAに対して(A⇔(〇Aでない))」 z 問題 z z 28 LEFT⇔〇B となるBはなにか? Bとして○LEFTをとればよい z z z 天使なら LEFT⇔○LEFT かつ ○LEFT⇔○○LEFT 悪魔なら LEFT⇔(○LEFTでない) かつ ○LEFT⇔(○○LEFTでない) 「あなたは、左の扉は天国への道ですか、と聞かれたらYESと答え 29 ますか?」 z NO 同じことを頭の中で(非形式的に)考えることもできる 形式化は問題を解くのに役に立ったか? z z z YES 問題の条件を整理することができた 解ける問題かどうかが客観的に判定できるようになっ た z z 解の候補を系統的に調べることができる 解のない問題である場合には、そのことが示せる 30 5 形式化ということ z z z 記号列に対する機械的な操作で定義にあてはまるか どうかのチェックができる。 z まとめ z 形式的体系の必要性 z z 今週はここまで 形式的定義 z 誰が見ても正しいかどうかが判定できなければ厳密 な推論はできない z 形式的体系を使うメリット z z 推論自体が正しいかどうかコンピュータでチェックでき る 場合によってはコンピュータにより自動的に推論がで きる 31 ソフトウェアの信頼性向上は、社会的に重大な関心 事となりつつある ソフトウェアの正しさを保証するためには、仕様を形 式的に記述することが必要である 形式仕様の記述とソフトウェアの正しさの保証には、 形式的体系(形式論理)を使う。 32 6