厳密な仕様記述を志すための形式手法入門 · 「6w2h」とは、what...

19
SEC-FM1-A5-1 実務家のための形式手法 厳密な仕様記述を志すための形式手法入門 厳密な仕様記述入門 厳密な記述ガイド 2015 年

Upload: vanliem

Post on 10-Aug-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

SEC-FM1-A5-1

実務家のための形式手法

厳密な仕様記述を志すための形式手法入門

厳密な仕様記述入門

厳密な記述ガイド

2015年

厳密な仕様記述入門 厳密な記述ガイド 2

掲載されている会社名・製品名などは、各社の登録商標または商標です。

Copyright○c Information-technology Promotion Agency,Japan 2015. All Rights Reserved.

厳密な仕様記述入門 厳密な記述ガイド 3

目次

本ガイド利用の手引 .......................................................................................... 4

日本語表現そのものの改善 ............................................................................... 4

1. 仕様書群における文書構成 ............................................................................. 4

2. 仕様書の構成 .................................................................................................. 4

3. 段落や図表の構成 ........................................................................................... 5

4. 段落の書き方 .................................................................................................. 5

5. 図表の書き方 .................................................................................................. 5

6. 文の書き方 ...................................................................................................... 5

7. 単語や用語の使い方 ........................................................................................ 6

厳密な記述のための小道具たち ........................................................................ 8

1. 集合 ................................................................................................................. 8

2. 列 .................................................................................................................... 8

3. 写像 ................................................................................................................. 9

4. 論理式 ........................................................................................................... 10

5. 論理演算の法則 ............................................................................................. 10

6. 条件式 ........................................................................................................... 11

7. 関数と述語 .................................................................................................... 11

8. 述語と論理式を用いた表現 ........................................................................... 12

9. 事前、事後、不変条件の意味 ....................................................................... 12

厳密な記述のための小道具を用いた記述サンプル .......................................... 13

参考:仕様記述言語 VDM++ を用いた記述例 ............................................... 16

厳密な仕様記述入門 厳密な記述ガイド 4

本ガイド利用の手引

別冊の「仕様記述ガイド」では、仕様記述に必要な項目をテンプレートの

形式で示しました。ワークショップではまずそのテンプレートを用いて自

由な記述を行っていただきました。

こうした記述の過程で、より正確な表現や定義の重要性に対しても理解が

深まったのではないでしょうか。

本ガイドは、「仕様記述ガイド」で示された内容を更に厳密に記述するため

のヒントを示します。

日本語表現そのものの改善

仕様書群の記述には、それからそもそもの仕様の検討には、また、そのレビ

ューには、様々な観点があります。まずは、以下の事柄について考えながら、

仕様を具体化し、表していくと良いでしょう。

仕様書群における文書構成

仕様書の構成

段落や図表の構成

段落の書き方

図表の書き方

文の書き方

単語や用語の使い方

1. 仕様書群における文書構成

文書がひとつではない場合は、読者がはじめて読む順番や、参照のしやすさ、

執筆者たちの分担のしやすさを考えて、文書の構成を考える必要があります。

2. 仕様書の構成

上記の事柄に加え、情報のまとまりを考えながら、仕様書の目次の構成を考

える。情報を、仕様記述ガイドにある、構造の仕様、機能の仕様、振舞の仕

様等に分解し、仕様の構造と仕様書の構造を整理していく必要があります。

また、「6W2H」などの観点もあります。「6W2H」とは、What (何を)、Why

厳密な仕様記述入門 厳密な記述ガイド 5

(何故)、Who (誰が)、Whom (誰に)、When (何時)、Where (何処で)、

How (どのように)、How much (どのくらい)のことです。このような様々

な観点において、重複なくもれなく、一貫性を持った仕様書にしていく必要

があります。

さらに、文書のフォーマット、書式にも気を配る必要があります。

3. 段落や図表の構成

章ごとに、仕様としてどのような情報を定め、読者がその章を読むまでにど

のような情報を知っているのかを考えながら、段落や図表の構成を考える必

要があります。このときに、各文書や各章で、くり返し同じ情報を記述しな

いようにすることが重要です。

4. 段落の書き方

必ずこうしなければならないという決まりはありませんが、たとえば、「パラ

グラフライティング」の方法があります。パラグラフの先頭の文、「トピック

センテンス」に、その段落で述べたいことの概要を書き、その後、具体的な

ことや、例示をします。また、理由を述べます。そして、最後にまとめの文

を書いて、段落を完結させます。この方法を用いなければならないことはあ

りませんが、何かしらの一貫した考えに基づいて文を構成させ、段落、文脈

を作る必要があります。

5. 図表の書き方

それぞれの図表には、固有の書き方、読み方があり、その方法が読者にあら

かじめ伝わるのかどうか、あるいは、読者があらかじめ知っているのかどう

か、を考えておく必要があります。独自の記法を用いる場合、本文や凡例等

で説明する必要があります。とくに図の文法は複雑になりがちですから、UML

等、標準化された記法と、専用のエディタを用いて記述するのが良いかもし

れません。

6. 文の書き方

文を書くときには、「てにをは」の使い方等、文法・語法を正しく用いる必要

があることはもちろんですが、それだけではなく、あらゆる視点において、

厳密な仕様記述入門 厳密な記述ガイド 6

ある文に対して複数の解釈をする、複数の意味を読み取ることができないよ

うに、書く必要があります。また、その仕様を記述するのに、適切な抽象度

を保つ必要があります。曖昧さをなくすための厳密化と、具体化を混同して

はなりません。

7. 単語や用語の使い方

単語や用語は、厳密に読み書きできるように、すべての著者と読者で認識を

合わせる必要があります。また、検索等のことも考えて、表記揺れをしない

ことが重要です。「組み込み ID」、「組込み ID」が表記揺れの例です。

記述においては、想定読者と前提知識を合わせる必要があり、単語、用語、

記述言語、一般常識、開発関連知識、ドメイン知識を考えていく必要があり

ます。

その上で、構造が分かりやすいを文書群構造、文書構造、段落構成、段落構

造、図表の構造を作った上で、みだりに具体的という意味ではなく厳密に、

誰でもいつでも一意に解釈できるような文を書く必要があります。

たとえば、言葉をやりとりする双方が語彙や文法に対する同じ認識を持って

いないと、それぞれの解釈が異なってしまい、全く同じ文でも読み手によっ

て解釈が異なる可能性があります。表現したいことと、表現の方法、表現、

双方の関係性が連動していないと、完全なコミュニケーション、情報の伝達、

理解は成立しません。

とくに、システム開発文書においては、論理の表現に注意しましょう。もと

もと必ずしも論理的ではない課題を、論理や情報を厳密に書き表すプログラ

ムに変換する必要があるからです。次節で述べる、厳密な思考や記述のため

に必要な概念や論理を用いて、システムの仕様として表すべき論理を記述す

る際に、論理と自然言語の文を、1 対 1 に対応させるために、どのような表

現にすべきなのかについて考える必要があります。たとえば、a or (b and c) や、

or と xor の違いを、日本語としてどのように表すべきなのか、について考

えてみてください。表現したい論理や情報を、日本語として表すだけでは不

足で、表した日本語の文から、間違いなくただひとつの論理式が思い浮かぶ

必要があるのです。

厳密な仕様記述入門 厳密な記述ガイド 7

また、誰でも間違いなく読むことができるということ以外に、素早く読むこ

とができる、概要を知ることができる、意図を知ることができる、どこから

読んだら良いのか分かる、納得できる (背景・理由)、などの観点について

も考えていく必要があります。

厳密な仕様記述入門 厳密な記述ガイド 8

厳密な記述のための小道具たち

単に日本語の文章を改善するだけでは厳密で正確な記述を行えないときがあ

ります。このようなとき、利用できる様々な記述手段をご紹介します。

1. 集合

ものの集まりを表すためには、集合を使うと便利。集合に含まれる要素間に

は順番はなく、重複した要素は含まれません。

(1)自然言語使用

対象 ∈ 集合 C のうち条件 A を満たす要素 ∩ 集合 D のうち条件 B を満たす要素

(2)数学記号使用

対象 ∈ { c | c ∈ C and A を満たす(c) } ∩ { d | d ∈ D and B を満たす(d) }

(3)VDM 使用

対象 in set ({ c | c in set C & A である(c) } inter { d | d in set D & B である(d) })

2. 列

順序のある要素の集まりを表すためには、列を使うと便利です。集合と違っ

て要素が重複していても構いません。

(1)自然言語使用

計測値列の3番目の値

(2)列参照記号使用

計測値列(3)

(3)自然言語使用

計測値列には過去 10 回分の計測値が順番に格納されている

(4)自然言語使用

計測値列の平均値が 100 以下、85 以上の場合正常とする。連続する計測値間の

差異に 4 以上のものがあるときには異常とする。

(5)(4)と同じ表現の VDM 使用

(let 平均値 = 平均計算(計算値列) in 平均値 >= 85 and 平均値 <= 100) and

(forall i in set inds 計算値列 & i < len 計算値列 => 絶対値(計算値列(i+1) - 計

算値列(i)) < 4)

厳密な仕様記述入門 厳密な記述ガイド 9

3. 写像

二つの写像の要素間に対応関係を導入したものが写像です。対応元の集合を

定義域(domain)といい、対応先の集合を値域(range)といいます。

定義域の特定の要素を選ぶと、値域の特定の要素が唯一つ対応します。反対

に、同じ値域の要素に対応付けられている定義域の要素は複数あっても構い

ません。また定義域の要素はもれなく対応先の値域の要素が決まっています。

最も簡単な写像の例として、名前と年齢の表を示します。

名前(定義域) 年齢(値域)

佐藤 35

木村 20

杉本 35

鎌田 30

この表の内容に対応する写像の名前として

名前年齢写像

というものを考えた場合

名前年齢写像(佐藤)

という指定は 35 という値域の要素を参照することになります。

なお、この表には 35 という値が 2 箇所出てきますが、複数の定義域の要素

が同じ値域の値に対応しても構わないので、この表現は正当なものです。名

前のカラムの部分に同じ値が 2 つ現れてかつ年齢のカラムの対応する値が異

なる場合には、一つの定義域の要素に複数の値域の値が対応することになる

ので許されません。

厳密な仕様記述入門 厳密な記述ガイド 10

4. 論理式

項を論理演算子で組合せて作られる式。用いられる論理記号は以下のもので

す。

論理記号 日本語 英語 VDM

¬ でない/以外 not not

∧ かつ/及び/さらに/と/、 and and

∨ または/あるいは/や/か/、 or or

⇒ ならば/のとき/とすると implies

then

=>

⇔ ならば/同値/つまり/言い換えると if and only if

equivalent

<=>

∃ x ある/存在する there exists x

such that

exists x

∀ x すべての/必ず/任意の for all x 。。。 forall x

5. 論理演算の法則

論理演算子に関連した各種法則

法則名

結合法則 a∨(b∨c) = (a∨b)∨c、 a∧(b∧c)=(a∧b)∧c

交換法則 a∨b=b∨a、 a∧b = b∧a

吸収法則 a∨(a∧b)=a、 a∧(a∨b) = a

分配法則 a∨(b∧c)=(a∨b)∧(a∨c)、 a∧(b∨c)=(a∧b)∨(a∧c)

可補束 a∨¬a=T、 a∧¬a=F

等冪性 a∨a=a、 a∧a=a

有界性 a∨F=a、 a∧T=a、 a∨T=T、 a∧F=F

T と F の相補性 ¬F=T、 ¬T=F

ド・モルガンの法則 ¬(a∨b)=¬a∧¬b、 ¬(a∧b)=¬a∨¬b

対合 ¬¬a=a

厳密な仕様記述入門 厳密な記述ガイド 11

6. 条件式

評価の結果が真 (true) もしくは偽(false) になる式。論理式や項を算術演算

子(>、 >=、 <、 <=)、等しい(=)、等しくない(≠)といった記号を用い

て組合せて表現します。

7. 関数と述語

関数とは引数を与えると、対応する値を計算する規則を定めたものです。数

学的には同じ引数に対しては常に同じ値が得られます。これに対して「副作

用」があり同じ引数に対して異なる値を返し得る手続きを考える場合には、

(可能ならば)全体の状態も入力引数として考えれば、副作用のない関数と

して記述することができます。

入力に対して出力を対応付けるという観点からは、見かけは、写像の仲間と

考えることもできます。

関数の中で戻り値が論理型(真偽値)になるものは、論理式の中に埋め込む

述語として用いることができます。

述語をうまく定義することによって、曖昧さがなく保守しやすい用語の体系

をつくることもできます。

例えば

兄弟(x、 y)

という述語を考えた場合(x、 y は人だとします)

例えばその定義を

兄弟(x、 y) ≡ ∃ p ∈ 人・親子(p、 x) ∧ 親子(p、 y)

という形で与えることができます(これはいま扱おうとしている世界での解

釈だとします)。ここで大切なことは、兄弟という述語が親子という述語で定

義されているということです。こうした定儀を更に使えば

従兄弟(x、 y) ≡ ∃ p1、 p2 ∈ 人間・p1≠p2∧兄弟(p1、p2)∧親子(p1、

x)∧親子(p2、y)

という新たな定儀を作り上げて行くことが可能です。この世界では「親子」

の真偽さえきちんと判定できれば、兄弟も従兄弟もその真偽値を定めること

ができます。

厳密な仕様記述入門 厳密な記述ガイド 12

つまり現実世界を指示する用語として親子を使い、他の用語は論理記号を用

いて構成します。現実世界と接している指示は、ときにその判別が難しいこ

とがあります。しかし、難しさや曖昧さをそうした特定の場所に閉じ込める

ことによって、他の定儀の真偽判定を容易にすることが可能になります。

8. 述語と論理式を用いた表現

述語と論理式をうまく組み合わせると、通常の表現では正確に表現しきれな

い意味を記述できる場合があります

例えば

誰でも休日が好きだ

という記述を考えてみましょう。これは一見内容が明らかなように見えます

が、その解釈には様々なものがあり得ます。ここで

好き(x、 y)

が「x が y を好きなら真」という述語だとしましょう。そうすると上記の誰

でも休日が好きだという記述の解釈には以下のようなものが考えられます。

① ∀ p ∈全員・(∀d ∈ 全休日・好き(p、 d) )

② ∃ d ∈ 全休日・(∀p ∈ 全員・好き(p、 d) )

③ ∃! d ∈全休日・ (∀p ∈ 全員・好き(p、 d) )

④ ∀p ∈ 全員・ (∃ d ∈ 全休日・好き(p、 d) )

⑤ ∀p ∈ 全員・(∃! d ∈ 全休日・好き(p、 d) )

9. 事前、事後、不変条件の意味

機能仕様の構造を以下に再掲します。

厳密な仕様記述入門 厳密な記述ガイド 13

厳密な記述のための小道具を用いた記述サンプル

「使用記述ガイド」の記述サンプルを用いて記述してみましょう

(1)構造の仕様記述

型名 利用者情報型

型構造 アカウント名:文字列型

パスワード:文字列型(暗号化済)

旧パスワード:文字列型(暗号化済)

不変条件 有効なアカウント名 =

4 <= アカウント名の長さ <= 20

アカウント名のパターン:[a-zA-Z][a-zA-Z0-9_]+

アカウント名に少なくとも1文字の英大文字、1文字の

数字が含まれる

有効なパスワード =

6 <= 現パスワードの長さ <= 20

現パスワードのパターン:[a-zA-Z0-9_]+

型名 利用者情報集合型

型構造 利用者情報型の要素の集合

不変条件 なし

(2)機能の仕様記述

記述例のひとつを示します。

なおここでの事後条件は

場合分け条件1

その場合の結果条件

場合分け条件2

その場合の結果条件

という形式で記述されています(場合分け条件が入れ子になっている

厳密な仕様記述入門 厳密な記述ガイド 14

ところもあります)全体として成り立つべき条件式を表しています。

仕様名 ログイン認証機能

目的 ログイン要求を認証し、認証トークンを発行する

対応要求 ログイン認証

適用事象 ログイン UI、ログインエージェントから呼び出される

入力 アカウント名:文字列型

パスワード:文字列型

出力 ステータス:ステータス型

認証トークン:認証トークン型

補足情報:補足情報型

例外 システム停止中、タイムアウト

事前条件 有効なアカウント(アカウント名)∧

有効なパスワード(パスワード)

事後条件 ∀ 利用者∈利用者情報集合:利用者情報集合型・¬ 利用者。

アカウント名 = アカウント名

ステータス=認証失敗

認証トークン=nil

補足情報=無効なアカウント名

∃ 利用者∈利用者情報集合:利用者情報集合型・利用者。

アカウント名 = アカウント名

暗号化(パスワード)= 利用者。パスワード

ステータス=認証成功

認証トークン=nil

補足情報=有効なアカウント名

暗号化(パスワード)= 利用者。旧パスワード

ステータス=認証失敗

認証トークン=nil

補足情報=ひとつ前のパスワード

その他

ステータス=認証失敗

厳密な仕様記述入門 厳密な記述ガイド 15

認証トークン=nil

補足情報=無効なパスワード

備考 6 <= 長さ(パスワード)<= 20

厳密な仕様記述入門 厳密な記述ガイド 16

参考:仕様記述言語 VDM++ を用いた記述例

class Login 認証

values

英小文字集合 = elems "abcdefghijklmnopqrstuvwxyz";

英大文字集合 = elems "ABCCDEFGHIJKLMNOPQRSTUVWXYZ";

英文字集合 = 英小文字集合 union 英大文字集合;

数字集合 = elems "0123456789";

有効文字集合 = dunion {英文字集合, 数字集合, {'_'}};

types

public 文字列型 = seq of char;

public 暗号化文字列型 = seq of char;

public ステータス型 = <認証失敗>|<認証成功>;

public 認証トークン型 = token;

public 補助情報型 = <パスワードが短すぎる>|<パスワードが長すぎる>|

<不正なアカウント文字列>|

<無効なアカウント名>|<認証成功>|

<ひとつ前のパスワード>|<無効なパスワード>;

public 利用者情報型 :: アカウント名 : 文字列型

パスワード : 暗号化文字列型

旧パスワード : 暗号化文字列型

inv ui == 有効アカウント名(ui.アカウント名) and

有効パスワード(非暗号化(ui.パスワード)) and

有効パスワード(非暗号化(ui.旧パスワード));

instance variables

利用者集合 : set of 利用者情報型 := {

mk_利用者情報型("User1", "password1p", "password1op"),

mk_利用者情報型("User2", "password2p", "password2op"),

mk_利用者情報型("User3", "password3p", "password3op")

厳密な仕様記述入門 厳密な記述ガイド 17

};

operations

public ログイン認証 : 文字列型 * 文字列型 ==>

ステータス型 * [認証トークン型] * 補助情報型

ログイン認証(name, pass) ==

return

if forall user in set 利用者集合 & user.アカウント名 <> name then

mk_(<認証失敗>, nil, <無効なアカウント名>)

else

let user in set 利用者集合 be st user.アカウント名 = name in

cases true :

(user.旧パスワード = 暗号化(pass))

-> mk_(<認証失敗>, nil, <ひとつ前のパスワード>),

(user.パスワード <> 暗号化(pass))

-> mk_(<認証失敗>, nil, <無効なパスワード>),

others ->

mk_(<認証成功>, mk_token(mk_(name, pass, "有効期限")) , <認証成功>)

end

pre

有効アカウント名(name) and

有効パスワード(pass)

post

RESULT =

if forall user in set 利用者集合 & user.アカウント名 <> name then

mk_(<認証失敗>, nil, <無効なアカウント名>)

else

let user in set 利用者集合 be st user.アカウント名 = name in

cases true :

(user.旧パスワード = 暗号化(pass))

-> mk_(<認証失敗>, nil, <ひとつ前のパスワード>),

(user.パスワード <> 暗号化(pass))

-> mk_(<認証失敗>, nil, <無効なパスワード>),

厳密な仕様記述入門 厳密な記述ガイド 18

others ->

mk_(<認証成功>, mk_token(mk_(name, pass, "有効期限")) , <認証成功>)

end;

functions

public 有効アカウント名 : 文字列型 -> bool

有効アカウント名(s) == let [先頭] ^ 残り = s in

len s >= 4 and len s <= 20 and

先頭 in set 英文字集合 and

exists 文字 in set elems s & 文字 in set 英大文字集合 and

exists 文字 in set elems s & 文字 in set 数字集合 and

forall 文字 in set elems 残り & 文字 in set 有効文字集合;

public 有効パスワード : 文字列型 -> bool

有効パスワード(p) == len p >= 6 and len p <= 20 and

forall 文字 in set elems 残り & 文字 in set 有効文字集合;

public 暗号化 : 文字列型 -> 暗号化文字列型

暗号化(s) == s ^ "p";

public 非暗号化 : 暗号化文字列型 -> 文字列型

非暗号化(s) == let plain ^ "p" = s in plain;

pre len s > 0 and s(len s) = p;

end Login 認証

厳密な仕様記述入門 厳密な記述ガイド 19

実務家のための形式手法

厳密な仕様記述を志すための形式手法入門

厳密な仕様記述入門 厳密な記述ガイド

2015 年 10 月 初版発行

独立行政法人情報処理推進機構

技術本部 ソフトウェア高信頼化センター

SEC-FM1-A5-1