Transcript (A`+x`) On
Disciplined Software Engineering Lecture #9 Watts S. Humphrey Software Engineering Institute Carnegie Mellon University Pittsburgh, PA 15213 Sponsored by the U.S. Department of Defense Copyright © 1994 Carnegie Mellon University1 設計記法ー概観 記法の重要性 ブール代数 •カルノー図 •有用な記号 •ブール関数の利用 簡単化 形式的手法 Copyright © 1994 Carnegie Mellon University2 記法の重要性 ソフトウエア開発における多くの欠陥は誤解と混乱 から生じている。 プログラムの要求と設計を表現するために使用さ れる記法は、 •精密かつ簡潔、 •使い易い •共通に理解される •広範囲のソフトウエア機能の表現に適切 であるべきである。 形式的記法はこれらの判断基準を満たしてい る。 Copyright © 1994 Carnegie Mellon University3 集合の性質ー数学的記法 英語 記号 例 Union, sum A or B, A+B Intersection, product A and B, A*B, AB Complement, not ' All, universal 1 None, empty set 0 A', not A Copyright © 1994 Carnegie Mellon University4 この記法の利用 長所 •重要な一つの記法に精通する •プログラムの正当性証明ための形式的手法で 使用される記法と無矛盾である。 •論理を他の表現から区別する。 短所 •一般に入力に時間がかかる •精通に練習を要する •同僚が理解できないかもしれない Copyright © 1994 Carnegie Mellon University5 ブール代数 集合の代数 •集合の関係を定義し取り扱う。 •首尾一貫性=文が自己無矛盾か •妥当性(validity)=文が現実を表現している か 集合の表現 •ベン図 •基本的関係 •全集合と空集合 Copyright © 1994 Carnegie Mellon University6 ベン図 人間 人間 非成人女性 女性 男性 成人 女性 非成人 男性 成人 男性 全集合 A’B’C’ AB’C’ ABC’ A’BC’ ABC AB’C A’BC A’B’C Copyright © 1994 Carnegie Mellon University7 集合の性質 - 1 反射律: べき(等)律: 反対称律: 推移律: 可換律: 結合律: 分配律: for every x, x<=x xx=x, x+x=x if x<=y and y<=x then x=y if x<=y and y<=z then x<=z xy=yx, x+y=y+x x(yz)=(xy)z, x+(y+z)=(x+y)+z x(y+z)=xy+xz, x+yz=(x+y)(x+z) Copyright © 1994 Carnegie Mellon University8 集合の性質 - 2 空集合と全集合: xx’=0, x+x’=1, 0<=x<=1 x0=0, x+1=1, x+0=x, x1=x 一貫性: x<=y, xy=x, x+y=y は同値である 吸収律: x(x+y)=x+xy=x ドモルガンの定理: (x’)’=x, (xy)’=x’+y’, (x+y)’=x’y’ Copyright © 1994 Carnegie Mellon University9 例 次のような条件の下でONにしたいスイッチをもってい るとする。 ●A または B または C がON ●A かつ B が ONでないとき ●A かつ C が ONでないとき このスイッチを次のように表現する、 ON=(A+B+C)*[(A*B)+(A*C)]’ Copyright © 1994 Carnegie Mellon University10 ブール式の簡単化 ブール式を簡単化するとき次のようなガ イドラインを考えること。 •もしプライム’のついた括弧つきの任意の式 があるならば、それらを取り除くためドモルガ ンの定理を使いなさい。 •分配法則で因数分解される共通項を探せ。 •複雑さを減少させるため代入をする。 •積の和の形の式へもっていくよう試みる。 Copyright © 1994 Carnegie Mellon University11 簡単化の例 - 1 電球の例をつかう On = (A+B+C)*[(A*B)+(A*C)]’ ドモルガンの定理を適用する On = (A+B+C)*[(A’+B’)*(A’+C’)] A’ が最後の2項で共通である。よって On = (A+B+C)*[A’+(B’*C’)] B+Cを x で, B’*C’を x’ でそれぞれ置き換える On = (A+x)*(A’+x’) Copyright © 1994 Carnegie Mellon University12 簡単化の例 - 2 式は完全に簡単化された。しかし集合の積の和の形に 変換した方がいい。 •On = (A+x)*(A’+x’) •On = [(A+x)*A’]+[(A+x)*x’] •On = [(A*A’)+(x*A’)]+[(A*x’)+(x*x’)] •On = (x*A’)+(A*x’) ここで x を B+C で置き換える •On = [(B+C)*A’]+[A*(B’*C’)] •On = (A*B’*C’)+[A’*(B+C)] Copyright © 1994 Carnegie Mellon University13 簡単化の練習問題 つぎの式を簡単化せよ 1. F = X+(X’*Y) 2. F = (X+Y)+[(X*Z)+Y] 3. F = (X’*Y’*Z’)+(X*Y*Z’)+(X*Y’*Z’) 4. F = [X’*(Y+Z’)]’*(X+Y’+Z)*(X’*Y’*Z’)’ Copyright © 1994 Carnegie Mellon University14 問題 1 の答え この式から始める F = X+(X’*Y) 分配律を使うと F = (X+X’)*(X+Y) ここで、全集合の性質によって X+X’ = 1 および 1*(X+Y) = X+Y ゆえに、答えは F = X+Y Copyright © 1994 Carnegie Mellon University15 問題 2 の答え F = (X+Y)+[(X*Z)+Y] この式から始める。 分配律を適用すると F = (X+Y)+(X+Y)*(Z+Y) 今、共通項 X+Y を 因数として括り出すと、 F = (X+Y)*[1+(Z+Y)] 全集合の性質によって, 1+Z+Y=1 ゆえに、答えは F = X+Y Copyright © 1994 Carnegie Mellon University16 問題 3 の答え F = (X’*Y’*Z’)+(X*Y*Z’)+(X*Y’*Z’) から始める。 共通の Z’ 項を因数としてくくり出すと次式になる。 F = Z’*(X’Y’+XY+XY’) 共通のX 項を因数としてくくり出すと次式になる。 F = Z’*[X’Y’+X(Y+Y’)] = Z’*(X’Y’+X) さて, 分配律によって F = Z’*(X’+X)*(Y’+X) = Z’*(Y’+X) Copyright © 1994 Carnegie Mellon University17 問題 4 の答え F = [X’*(Y+Z’)]’*(X+Y’+Z)*(X’*Y’*Z’)’ から始める。 先ず ドモルガンの定理を適用すると, 次式になる。 F = (X+Y’Z)*(X+Y’+Z)*(X+Y+Z) 共通の X 項を因数としてくくり出すと次式になる。 F = X+Y’Z*(Y’+Z)*(Y+Z) 共通の Z 項をくくり出すと F = X+Y’Z*(Z+Y’Y) = X+Y’Z Copyright © 1994 Carnegie Mellon University18 カルノー図 - 1 6 変数以下の式はカルノー図が簡単化プロセスに 役立つ。 カルノー図は、一つの式に変数の全ての可能な 組み合わせを表現するための構造的な方法であ る。 そこでの括り出しは、関係のある項を結びつけ、 それにより簡単化する方法をとる。 Copyright © 1994 Carnegie Mellon University19 カルノー図 - 2 ブール式は最小項の形式で表現できる。 最小項は変数のすべて可能な組み合わせの 積である。 X と Y の最小項はつぎである: X’*Y’, X*Y’, X’*Y, XY n 個の変数の最小項は 2**n 個ある。 Copyright © 1994 Carnegie Mellon University20 カルノー図 - 3 XY’ X X’Z YZ 00 01 11 X 10 00 0 0 1 YZ X 01 11 X X 10 1 X XY’+X’Z YZ X 00 0 1 X 01 11 X X 10 X Copyright © 1994 Carnegie Mellon University21 4 変数カルノー図 YZ WX 00 01 00 01 11 11 10 X X X X X X 10 Copyright © 1994 Carnegie Mellon University22 5 変数カルノー図 XYZ VW 000 001 011 010 110 111 101 100 00 01 11 10 Copyright © 1994 Carnegie Mellon University23 図の上の括り出し - 1 2つの隣り合ったセルが共に1をもつとき、それ らのセルは括り出すことができ、そのとき2つの セルに対して異なる値をとる変数は消去する。 例えば、 0100 と 0101 のセルは括り出すこと ができ、変数 Z は消去する。 このことは次のような図の上で見ることが出来 る。 Copyright © 1994 Carnegie Mellon University24 図の上の括り出し - 2 YZ WX 00 01 00 01 11 11 10 X X X X X X 10 Copyright © 1994 Carnegie Mellon University25 図の上の括り出し - 3 同様に, 4つの隣り合ったセルが1をもつとき, その時これらのセルは括り出すことができ、そ の4つのセルに対して異なる値をとる2つの変 数は消去できる。 例えば, 0101, 0111, 1101, および 1111 のセ ルは括り出せて、 変数 w と y は消去される。 このことは次の図の上で示される。 Copyright © 1994 Carnegie Mellon University26 図の上の括り出し - 4 YZ WX 00 01 00 01 11 11 10 X X X X X X 10 Copyright © 1994 Carnegie Mellon University27 図の上の括り出し - 5 以上可能な括り出し3つをすべて行わうと、結 果の式は次のようになる。 F = w’yz + wxy’ + xz こことは次の図の上で見ることが出来る。 Copyright © 1994 Carnegie Mellon University28 図の上の括り出し - 6 YZ WX 00 01 00 01 11 11 10 X X X X X X 10 W’YZ+W’XY’+XZ Copyright © 1994 Carnegie Mellon University29 簡単化の練習問題 カルノー図を使用して、次の4つの式を簡単にせよ。 1. F = X+(X’*Y) 2. F = (X+Y)+[(X*Z)+Y] 3. F = (X’*Y’*Z’)+(X*Y*Z’)+(X*Y’*Z’) 4. F = [X’*(Y+Z’)]’*(X+Y’+Z)*(X’*Y’*Z’)’ Copyright © 1994 Carnegie Mellon University30 問題 1 の答え 関数は YZ X F = X+(X’*Y)である。 括り出しを行うと結果は F = X+Y 00 01 11 10 0 0 0 1 1 1 1 1 1 1 YZ X 00 01 11 10 0 0 0 1 1 1 1 1 1 1 Copyright © 1994 Carnegie Mellon University31 問題 2 の答え 関数は YZ X F = (X+Y)+[(X*Z)+Y] = X+Y+XZ+Y = X+Y+XZ 括り出しを行うと結果は F = X+Y 00 01 11 10 0 0 0 1 1 1 1 1 1 1 YZ X 00 01 11 10 0 0 0 1 1 1 1 1 1 1 Copyright © 1994 Carnegie Mellon University32 問題 3 の答え YZ 関数は X F = (X’*Y’*Z’)+(X*Y*Z’)+(X*Y’*Z’) = X’Y’Z’+XYZ’+XY’Z’ 括り出しを行うと結果は F = Y’Z’+XZ’ = Z’(Y’+X) 00 01 11 10 0 1 0 0 0 1 1 0 0 1 YZ X 00 01 11 10 0 1 0 0 0 1 1 0 0 1 Copyright © 1994 Carnegie Mellon University33 問題 4 の答え - 1 X+Y’Z 関数は次式である: YZ F = [X’*(Y+Z’)]’*(X+Y’+Z)*(X’*Y’*Z’)’ = (X+Y’Z)*(X+Y’+Z)*(X+Y+Z) X この式は3つの図でカバーされる。 X+Y’+Z 00 01 11 10 0 0 1 0 0 1 1 1 1 1 X+Y+Z YZ YZ X 00 01 11 10 X 00 01 11 10 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Copyright © 1994 Carnegie Mellon University34 問題 4 の答え - 2 全体の関数はこれらの3つの図 の積である。つまり 3つの図の すべてが1をもつところは 1 で, 他の所は0の図である。図は右 のようになる。 YZ X 00 11 10 0 0 1 0 0 1 1 1 1 1 01 11 10 この図で括り出しを行って答えは F = X+Y’Z 01 YZ X 00 0 0 1 0 0 1 1 1 1 1 Copyright © 1994 Carnegie Mellon University35 ゼロの括り出し 1を括り出すときには、カルノー図上の1を全部塗りつぶ す。このことにより、式の最小項形式をえる。 同じカルノー図の0を全部塗りつぶすことにより括り出し を行うことも可能である。このときには、それに続いてド モルガンの定理を適用する。 このときには、その式の最大項形式、つまり集合和の積 の形式が得られる。 Copyright © 1994 Carnegie Mellon University36 ゼロの括り出しの例 右の図の1を全部塗りつぶすことで、 括り出しを行うと次式が得られる。 F = X+Y+Z YZ X 00 10 0 1 1 1 1 1 1 1 1 01 11 10 YZ X これにドモルガンの定理を適用すると 最大項形式の答えが選られる。 11 0 一方、 0を全部塗りつぶすことにすると 次式が得られる。 F’ = X’Y’Z’ 01 00 0 0 1 1 1 1 1 1 1 1 F = X+Y+Z Copyright © 1994 Carnegie Mellon University37 もう一つの括り出しの例 右の図の1を全部塗りつぶすして括り出しを すると、最小項形式の結果が得られる。 F = XY’+X’Y+Z しかし、 0を全部塗りつぶすことにすると、 次が得られる YZ X 00 01 11 10 0 0 1 1 1 1 1 1 1 0 01 11 10 F’ = X’Y’Z’+XYZ’ YZ ドモルガンの定理を適用すると最大項 形式の答えが得られる。 F = (X+Y+Z)*(X’+Y’+Z) = (X+Y)*(X’+Y’)+Z X 00 0 0 1 1 1 1 1 1 1 0 Copyright © 1994 Carnegie Mellon University38 ゼロの括り出し 1 の括り出しがときどき、1つか2つまずい位置におか れた0によって複雑になることがある。これは次のよう に処理することが出来る。 あたかも都合の悪い0が1であるとみてその図の括り 出しを行う。 そののち括り出した因子をそれぞれ小さな図とみて0を 括りだす。 Copyright © 1994 Carnegie Mellon University39 ゼロの括り出しの例 - 1 2つの都合の悪い0を別にすれば この図の括り出しは非常に単純で ある。 F = Y’+W’Y = Y’+W’ しかし、W’X’Y’Z’ と W’XYZに0が ある から,これを括り出さねばなら ない。 YZ WX 00 01 11 10 00 0 1 1 1 01 1 1 0 1 11 1 1 0 0 10 1 1 0 0 Copyright © 1994 Carnegie Mellon University40 ゼロの括り出しの例 - 2 第1の因子、 Y’は変数W,X,と Zからなる小さな図゚を創る。 この図上で、W’X’Z’ が括り 出される: YZ WX F1 = Y’*(W’X’Z’)’ = Y’*(W+X+Z) ここの本質は Y’ not W’X’Z’ の括り出しである。. 第2の因子の括り出しは F2 = W’Y*(XZ)’ = W’Y*(X’+Z’) 00 01 11 10 00 0 1 1 1 01 1 1 0 1 11 1 1 0 0 10 1 1 0 0 よってこの関数は次になる。 F = Y’*(W+X+Z)+W’Y*(X‘+Z’) Copyright © 1994 Carnegie Mellon University41 多変数の括り出し カルノー図は6変数まで可能である。 それを超えると、 特別なコツが必要になる。 もし式のほとんどの項が6以下の変数からなり、その他 の変数が2,3個の場合に限り、 0の括り出しに近い方 法が使える。 この方法は例外括り出しと呼ばれ、変数の数がいくら あっても使える。 Copyright © 1994 Carnegie Mellon University42 例外括り出し - 1 次の関数の括り出しを4変数のカルノー図の上で行う。 F = AX’Y’+WXY’+W’Y’Z+XY’Z+W’XY’Z’+WX’Y’ 1. 変数 W, X, Y, および Z を使って関数を構成する. 2. A をもつ項については、 1の代わりに、その桝目に A を入れる。 3. ゼロを括り出す際、 A を A+0 として扱う。 Copyright © 1994 Carnegie Mellon University43 例外括り出し - 2 初めに、 W, X, Y, と Z を含む項のみを 使って図をつくる。 次は, Aを含む項である。 0がある ところに Aを入れる。1があるところ には0を入れる。 F1 = WXY’+W’Y’Z+XY’Z+W’XY’Z’+WX’Y’ F2 = AX’Y’ YZ YZ WX 00 01 11 10 00 0 1 0 0 01 1 1 0 11 1 1 10 1 1 WX 00 01 11 10 00 A A 0 0 0 01 0 0 0 0 0 0 11 0 0 0 0 0 0 10 A A 0 0 Copyright © 1994 Carnegie Mellon University44 例外括り出し - 3 初めに、A が1であると仮定して 1を括り出す。 F1 = Y’ YZ WX 00 01 11 10 次に、Aの項を括り出す。そのとき A をA+0として取り扱う。 00 A 1 0 0 F = Y’*[A+(W’X’Z’)’] = Y’*(A+W+X+Z) 01 1 1 0 0 11 1 1 0 0 10 1 1 0 0 Copyright © 1994 Carnegie Mellon University45 他の有用な記号 次のような基本的な数学記号もまたプログラム機能を 定義する際に有用である。 - “集合の1つの要素である”ことを意味する - “その集合の要素ではない”ことを意味する - “その集合の全要素に対して”を意味する - “その集合の要素が存在する”を意味する Copyright © 1994 Carnegie Mellon University46 記法の例 データセット D がファイルに含まれるならファイルを更 新する (D File) :: Update 全ての数 i が偶数であるとき、数x(i)を加える i when (i even) :: add x(i) 任意の数 i が負であるときレジスターをクリアーする i when (i < 0) :: Clear Copyright © 1994 Carnegie Mellon University47 関数の完全性 もし関数の集合が全ての可能な条件をカバーしている ときその集合は完全であると言う。 完全な関数集合に対しては、関数の和に対応するカル ノー図が図上の位置すべてをカバーする。 図上の位置が多重にカバーされることはありうる。 Copyright © 1994 Carnegie Mellon University48 関数の直交性 関数集合に属するどの二つの関数も同じ条件をカバ ーすることがなければ、その集合は直交していると言 う。 これは任意の関数と任意の他の関数の積が0である ことを意味する。 i, j where (i j) => F(i)*F(j) = 0 図は完全にはカバーされていないかもしれない。 Copyright © 1994 Carnegie Mellon University49 完全かつ直交 1つの関数集合はつぎの条件を満たすとき,完全であ り、かつ直交している。 •関数全体ですべての要素をカバーする。 •どの2つの関数も同じ要素をカバーしない。 Copyright © 1994 Carnegie Mellon University50 完全かつ直交している関数 f, g, h は完全である 11 f, g, h は直交している 00 01 10 0 f g gh fh 0 1 g f fh fg 1 00 h 01 11 f g g 10 f f, g, h は完全かつ直交である。 0 1 00 01 11 10 f f g h h g h f Copyright © 1994 Carnegie Mellon University51 形式的方法 - 1 ソフトウェア設計の形式的方法は数学の概念をベース に開発されてきた。 形式的方法の前提は次である。 •コンピュータプログラムは数学の文として扱うことが できる。 •したがって、数学の原理が適用できる。 •正しいプログラムの設計は、したがって、定理の導出 として取り扱うことが出来る。 •数学的に厳密な方法はかくして正しいプログラムを つくりだすはずである。 Copyright © 1994 Carnegie Mellon University52 形式的方法 - 2 形式的方法は典型的には,プログラムの前置条件、後 置条件、およびプログラム不変条件を使う。 そこでのプログラムは、不変条件を保存しながら、前置 条件を後置条件に変換する。 プログラムの正しさは、次のように証明する。 •プログラムは、前置条件を後置条件に変換する。 •プログラムは、不変条件を保存する。 Copyright © 1994 Carnegie Mellon University53 形式的方法 - 3 新しいプログラムを形式的方法で開発するとしたら、 •後置条件から出発する 。 •前置条件を導出する。 •不変条件を決定する。 前置条件を後置条件に変換しその不変条件を保存す るプログラムを定義する。 もしそのプログラムが繰り返しを含むならば、各サイク ルはループ終了に向かって進行すべきである。 Copyright © 1994 Carnegie Mellon University54 形式記法への賛成論 形式記法は精密である。 形式記法は複雑な機能を簡潔に表現できる。 形式記法は形式的方法を学習するときの基礎をなす。 Copyright © 1994 Carnegie Mellon University55 形式記法への反論 形式記法は学習に時間がかかる。 形式記法について、それを設計に使用するのに必要な レベルで精通するには、さらに多くの時間がかかる。 あなたの仲間たちは形式記法を理解できないかもしれ ない。 Copyright © 1994 Carnegie Mellon University56 このコースの形式的記法 支持者達は形式的方法は品質のよいソフトウエアを開発 するための厳密な方法を与えると主張する。懐疑派は 費用効果的でないと反論する。 形式的方法は、設計の正当性を示しているが、それが 一般にされるにはつぎが要求される。 •ユーザ゙の訓練 •形式的に証明する方が、ソフトウェアの設計の中で 行うよりもエラーが少ないユーザ 形式的手法はこのコースではこれ以上は扱わない。 Copyright © 1994 Carnegie Mellon University57 形式的方法関連の示唆 - 1 もしあなたが形式的方法に精通している、あるいは訓 練を受けていれば、 •形式的方法をPSPで使いなさい。 •あなたのあなたの品質と生産性を測定しなさい。 •あなたの結果を同様の方法を使用する他の人の結 果と比較しなさい。 •あなたの結果をあなたが形式的方法によらない場合 の結果と比較しなさい。 •この方法があなたにとって効果があるかどうかを判 断しなさい。 あなたが何か発見したら、それを他の人に話しなさい。 Copyright © 1994 Carnegie Mellon University58 形式的方法関連の示唆 - 2 もしあなたが形式的方法に精通してなければ、以下を 検討しなさい。 •ユーザに彼らのデータを見せてもらう。 •コースをとるか、参考書で勉強する。 •自分自身で試してみる。 あなたの品質と生産性を前後で計測し、形式的方法が あなたにとって効果があるかどうか判断する。 あなたが何か発見したら、それを他の人に話しなさい。 Copyright © 1994 Carnegie Mellon University59 演習課題 #9 テキストの付録B (p.353-373)を読んで、例題を実施し なさい。 PSP2.1を使用して、N個の実数のリンクリスト(linked list)を昇順にソートするプログラム8Aを書きなさい。 PSP2.1の説明は付録C(p.394-397)を、プログラム8A の仕様は付録D(p.492-493)を参考にしなさい。 Copyright © 1994 Carnegie Mellon University60 講義9のまとめ - 1 1. 貧弱な設計記法はエラーの原因である。 2. 定義された厳密な記法を使用することによって、 あなたはあなたの設計の品質を改善できるし、欠 陥をなくすことができる。 Copyright © 1994 Carnegie Mellon University61 講義9のまとめ - 2 3. 利用可能なものの中から適切な記法を選択し、 使用しなさい。 4. あなたのソフトウェア開発に形式的方法を試みなさ い。そしてそれがあなたの役に立つか調べなさい。 Copyright © 1994 Carnegie Mellon University62