vdmtools vdm++ - ipa...2014/02/04  · 0. 2 vdm とは? vdm = vienna development method...

55
Information-technology Promotion Agency, Japan Software Reliability Enhancement Center Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center SEC-FM1-B1-01 VDMTools VDM++ 入門

Upload: others

Post on 09-Nov-2020

29 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

Information-technology Promotion Agency, Japan

S o f t w a r e R e l i a b i l i t yEn h an c em en t Cen t er

Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

SEC-FM1-B1-01

VDMTools

VDM++

入門

Page 2: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

2 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

目次

0. はじめに

1. VDM開発環境の構築

2. VDMToolsの起動

3. VDM++インタープリタの起動

3.1 VDMToolsのVDM++インタ

ープリタの起動画面

3.2 VDMToolsの実行ウィンドウ

3.3 VDMToolsの実行例

3.4 VDMToolsの実行結果

4. VDMToolsチュートリアル

SEC-FM1-B1-01

5. VDM++言語入門

5. 1 VDM++言語入門1

5. 2 VDM++言語入門2

数値,集合,レコード

5. 3 VDM++言語入門3

写像

まとめ

Page 3: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

3 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

0. はじめに

0.1 本資料の対象者

0. 2 VDMとは?

0.3 VDM++とは?

SEC-FM1-B1-01

Page 4: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

4 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

0.1 本資料の対象者

対象者

仕様を書くために必要な離散数学の基礎を勉強したい方

集合論、述語論理(命題論理+3つの論理式)の基礎

仕様記述言語VDM++で仕様を書くための初歩を知りたい方

「対象を如何にモデル化するか?」セミナーを受講する方

前提条件

プログラム作成経験があること

SEC-FM1-B1-01

Page 5: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

5 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

0. 2 VDMとは?

VDM = Vienna Development Method

離散数学をベースとした仕様記述と検証のための手法

1960年代から1970年代にIBMウィーン研究所で開発

1996年に、VDMの仕様記述言語VDM-SLが世界初のISO標準(ISO/IEC 13817)

仕様記述言語になった

VDM++は、1993年に欧州連合ESPRIT計画のAFRODITEプロジェクトで、

VDM-SLをオブジェクト指向拡張したもの

特徴

厳密に定義された仕様記述言語(VDM-SL, VDM++)を持つ

制約条件(不変条件、事後条件、事前条件)の記述が可能

仕様の正しさを検証するための証明手法がある(今回は省略)

産業界での実用のためにVDM支援ツールVDMToolsでVDM-SLが拡張された

SEC-FM1-B1-01

Page 6: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

6 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

0.3 VDM++とは?

関数型+オブジェクト指向+手続き型の仕様記述言語

今回は、関数型については説明をほぼ省略

VDMToolsを用いたVDM++仕様の検証が可能

構文チェック、型チェック、仕様実行、回帰テスト

証明課題(証明すべき条件式)とC++とJavaの生成(今回は省略)

SEC-FM1-B1-01

Page 7: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

7 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

0. 3 VDM++とは? 不変条件、事後条件、事前条件

ここでは、VDM++で仕様を記述するために重要な不変条件、事後条件、事前条件の定義の

概要を説明する。(VDM-SLでは、これら条件の記述法が少し異なる点がある)

不変条件(VDM++では、型の不変条件と、インスタンス変数の不変条件を記述できる)

オブジェクトが存在する間、その値が真(true)のまま変化しない述語(条件式)。例え

ば、eが偶数型だとすると、e mod 2 = 0 が偶数型の不変条件で、常に真(true)であ

る。(modは剰余を計算する演算子なので、e mod 2 はeを2で割ったあまり)

事後条件 (VDM++では、関数の事後条件と、操作の事後条件を記述できる)

関数または操作を実行した後に、期待される状態を表す述語(条件式)。例えば、奇数

を求める関数の事後条件は、返り値をRESULTとすると RESULT mod 2 <> 1 である。

事前条件 (VDM++では、関数の事前条件 と、操作の事前条件を記述できる)

関数または操作が実行される前に、期待される状態を表す述語(条件式)。例えば、年

月日の月mを引数とする関数の事前条件は、1 <= m and m <= 12 である。

SEC-FM1-B1-01

Page 8: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

8 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

1. VDM開発環境の構築

下記に従って、VDMToolsを使えるようにする

http://www.vdmtools.jp/doc/vdmtools/environment.html

Subversionについての記述があるが、今回は無視して構わない。

上記説明はWindows7をベースにしているが、Mac OS XやLinuxで

も、 サクラエディタが使えない以外は、ほぼ同様の構築手順であ

る。

Mac OS XやLinuxの場合も、VDMTools以外に、VDM++ソースを編集

するテキストエディターが必要である。

SEC-FM1-B1-01

Page 9: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

9 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

2. VDMToolsの起動

Windows7の場合のスタートメニュー例

SEC-FM1-B1-01

今後の説明は、v9.0.2

で説明していく

Page 10: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

10 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

2.1 VDMTools起動時の画面

SEC-FM1-B1-01

Page 11: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

11 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

3. VDMToolsのVDM++インタープリタの起動

3.1 VDM++インタープリタの起動画面

3.2 実行ウィンドウ

3.3 実行例

3.4 実行結果

SEC-FM1-B1-01

Page 12: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

12 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

3.1 VDMToolsのVDM++インタープリタの起動画面

SEC-FM1-B1-01

初期化を選択すると

次ページの実行ウィ

ンドウが開く

Page 13: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

13 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

3.2 VDMToolsの実行ウィンドウ

SEC-FM1-B1-01

Response画面

Dialog画面

実行結果が表示される

インタプリタコマンド

を入力する

Page 14: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

14 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

3.3 VDMToolsの実行例

SEC-FM1-B1-01

タイプしたが、

まだReturn(Enter)

キーは押していな

いところ

2+3を実行し、結果を表示するためには、

Dialog画面で print 2+3 とタイプする

Page 15: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

15 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

3.4 VDMToolsの実行結果

SEC-FM1-B1-01

計算した結果。

上のWarningは、

今は無視して構わ

ない

Page 16: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

16 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

4. VDMToolsチュートリアル

マニュアルについて

言語マニュアルとユーザーマニュアルは以下からダウンロードし

て参照すること。ただし、随時、マニュアルのPDFファイルを検

索して調べる方が、頭から読むより分かりやすい。

http://www.vdmtools.jp/modules/tinyd2/index.php?id=2

VDMToolsの基本的操作方法は、以下を参照のこと

http://www.vdmtools.jp/doc/vdmtools/useVDMTools.html

SEC-FM1-B1-01

Page 17: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

17 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5. VDM++言語入門

5.0 VDM++仕様

5.0.1 仕様の全体構造

5.0.2 仕様記述の注意点

5.0.3 仕様記述例

5. 1 VDM++言語入門1

列,ブール

5. 2 VDM++言語入門2

数値,集合,レコード

5. 3 VDM++言語入門3

写像

SEC-FM1-B1-01

Page 18: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

18 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.0 VDM++言語入門 VDM++仕様

5.0.1 仕様の全体構造

5.0.2 仕様記述の注意点

5.0.3 仕様記述例

SEC-FM1-B1-01

Page 19: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

19 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.0.1 VDM++言語入門 仕様の全体構造

class クラス名 [is subclass of スーパークラス名[, スーパークラス名, …]]

values -- 定数の定義

types -- このクラスが責任を持つ型の定義

instance variables

-- インスタンス変数 これが属性を表す:状態はこの属性の値で決まる

operations

-- インスタンス変数にアクセスできる

-- すなわちオブジェクトの状態を変える可能性のある操作

functions

-- インスタンス変数にアクセスできない

-- すなわちオブジェクトの状態を変えない操作

end クラス名

SEC-FM1-B1-01

Page 20: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

20 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.0.2 VDM++言語入門 仕様記述の注意点

仕様をクラス単位で記述する

1ファイルに複数クラスを記述できるが、普通は、1ファイル1クラスを推奨

クラス内には、定義ブロック(values、 types、 instance variables、 operations、

functions)を任意の個数、順不同で定義可能

各ブロック内は定義をセミコロン「 ; 」で区切り、複数個を定義可能

予約語を識別子として使うことはできない

識別子は国際語化に対応し、日本語が使える(Javaと同じ)

SEC-FM1-B1-01

Page 21: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

21 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.0.3 VDM++言語入門 仕様記述例

class BMI --は、行末まで注釈。Body Mass Index(肥満度を表す指数の一つ)についての機能を持つクラス。

values --定数を定義する。

月当たり減量限界値 = 2; --単位はkg

適正BMI下限 = 25;

適正BMI上限 = 30;

types --型を定義する。

public 体重 = real; -- 単位はkg

public 身長 = real; -- 単位はm

instance variables --状態を持つインスタンス変数を定義する。

前月体重 : 体重 := 0;

operations --インスタンス変数を参照・書き換えできる操作を定義する。

public 健康を損なわない : 体重 * 身長 ==> bool --体重・身長を引数とし、bool型(trueまたはfalseを返す)

健康を損なわない(a現体重, a身長) == -- --健康を損なわない減量かを判定する。仮引数がa現体重とa身長。

--月当たり減量しすぎず、かつ、平均余命が長いBMIであるか判定する。

return (前月体重 - a現体重) <= 月当たり減量限界値 and 平均余命が長いBMIである(a現体重, a身長)

pre 前月体重 >= a現体重 --事前条件(trueでなければならない)

post RESULT = ((前月体重 - a現体重) <= 月当たり減量限界値 and 平均余命が長いBMIである(a現体重, a身長)); --事後条件(trueでなければならない)

--RESULTは返り値を表す予約語。

public 前月体重を設定する : 体重 ==> ()

前月体重を設定する(a体重) == 前月体重 := a体重; --インスタンス変数「前月体重」を設定する。

functions -- 引数だけから結果を得る関数を定義する。

static public 平均余命が長いBMIである : 体重 * 身長 +> bool --平均余命が長いか判定する。

平均余命が長いBMIである(a現体重, a身長) ==

適正BMI上限 >= BMIを得る(a現体重, a身長) and BMIを得る(a現体重, a身長) >= 適正BMI下限;

static public BMIを得る : 体重 * 身長 -> real --BMIを計算する。

BMIを得る(体重, 身長) == 体重 / ((身長 / 100) ** 2)

pre 身長 <> 0;

end BMI

SEC-FM1-B1-01

Page 22: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

22 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5. 1 VDM++言語入門1 列型

5. 1 VDM++言語入門1 列型

5.1.1 列型の主要演算子

5.1.2 ブール型の演算子

5.1.3 実行ウィンドウで実行

5.1.4 準備

5.1.5 仕様ファイル追加

5.1.6 例題の実行0

5.1.7 例題の実行1

5.1.8 例題の実行1の結果

5.1.9 例題の実行2

SEC-FM1-B1-01

Page 23: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

23 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5. 1 VDM++言語入門1 列型,ブール型

何番目という概念があるものの集まりを列型という(他の型は後で説明)

無限の配列のようなもの(実行時にはメモリの制約で実行できない事がある)

構文例(型の定義(types句)で以下のように定義する)

例えば 型Aの要素の列である 型Lを定義する場合以下のように行う

● 空列 [ ] が許される場合

● L = seq of A (例: types 文字列 = seq of char ここで、charは文字型)

● 要素が必ず一つ以上ある場合

● L = seq1 of A

構成子

列挙表現

'['式1',' 式2 ','... ',' 式n ']'

例: 文字列(seq of char) の場合、 ['V ', ' D ' ,'M'] を "VDM" と略記できる

SEC-FM1-B1-01

Page 24: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

24 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5. 1 VDM++言語入門1 列型,ブール型

演算子 名称 型の定義 ( 引 数 の 型 - > 返 り 値 の 型 ) 例(結果の右側は、左辺を実行した結果)

hd s 先頭 seq1 of A -> A 空列ではない型Aの列sから型A

hd "VDM" 結果 'V'

tl s 尾部 seq1 of A -> seq of A 空列ではない型Aの列sから型Aの列

tl "VDM" 結果 "DM"

len s 長さ seq of A -> nat 型Aの列sから自然数型

len "VDM" 結果 3

s(i) 列適用 seq of A * nat1 -> A 型Aの列sと列sの添字から型A

"VDM"(2) 結果 'D'

s1 ^ s2 連結 (seq of A) * (seq of A) -> seq of A 型Aの列s1とs2から、型Aの列

"VDM" ^ "++" 結果 "VDM++"

s1 = s2 相等 (seq of A) * (seq of A) -> bool 型Aの列s1とs2から、ブール型

"VDM" = ['V','D','M'] 結果 true

s1 <> s2 不等 (seq of A) * (seq of A) -> bool 型Aの列s1とs2から、ブール型

"VDM" <> "vdm" 結果 true

SEC-FM1-B1-01

Page 25: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

25 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.1.2 VDM++言語入門1 ブール型の演算子

演算子 名称 型 例

not 否定 bool -> bool (not true) 結果 false

and 連言 bool * bool -> bool true and 3=3 結果 true

or 選言 bool * bool -> bool 2=2 or false 結果 true

=> 含意 bool * bool -> bool 2=3 => 2=11 結果 true

<=> 同等 bool * bool -> bool 2=3 <=> 2=11 結果 true

= 相等 bool * bool -> bool (2=3) = (2=11) 結果 true

<> 不等 bool * bool -> bool true <> (2=3) 結果 true

SEC-FM1-B1-01

Page 26: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

26 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.1.3 VDM++言語入門1 実行ウィンドウで実行

SEC-FM1-B1-01

VDMToolsを起動し、以下を実行する。

前の2ページの例も実行してみる。

printの替りにpの後にVDM++の式

をタイプしても同じ結果が得られ

ることを確認する。

Page 27: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

27 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.1.4 VDM++言語入門1 準備

SEC-FM1-B1-01

以下の説明で使用する例題ファイルで使用されているテキストのコードは

Unicode(UTF-8)なので、ツールオプションメニューから、ツールオプション画面を開き

Unicode(UTF-8)を選択しておく。

1 .ツールオプション画面を開く

2. 文字コードを選択

Page 28: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

28 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.1.5 VDM++言語入門1 仕様ファイル追加

SEC-FM1-B1-01

VDMToolsを起動し、 別途配布されたVDMPPtutorial1

フォルダ内の下記ファイルを追加する

メニューの「プロジェクト>ファイルを追加...」を使って追加する。

[ www.vdmtools.jp—useVDMTools.html を参照 ]

Tutorial1.vdmpp

io.vpp

VDMUtil.vpp

io.vppとVDMUtil.vppは

標準ライブラリ 読み込み後のVDMToolsウィンドウ

Page 29: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

29 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

前の列型の演算子の表の例を以下の方法で実行してみよう。

前ページで、必要なファイルは読み込まれ、構文チェックも終わって

いるので、型チェックを行い、次に初期化を行ってから、

print new 入門1().rs

とタイプしてみよう。

結果は、以下のようになり、すべて意図通りとなる。

[ true, true, true, true, true, true, true ]

詳しい説明は、VDM++のソース・ファイルVDMPPtutorial1フォルダ下の

Tutorial1.vdmppを参照のこと。

5.1.6 VDM++言語入門1 例題の実行0

SEC-FM1-B1-01

Page 30: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

30 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

例題の実行

次に文字列(文字型の列)と真偽値を扱うブール型を練習する。

列型も少し触れる。

前ページで、必要なファイルは読み込まれ、構文チェックも終わ

っているので、型チェックを行い、次に初期化を行ってから、

print new 入門1().こんにちは("佐原伸")

とタイプしてみよう。

結果は、次のページに示す

5.1.7 VDM++言語入門1 例題の実行1

SEC-FM1-B1-01

Page 31: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

31 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.1.8 VDM++言語入門1 例題の実行1の結果

SEC-FM1-B1-01

Page 32: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

32 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

同様にして、以下を実行すると、実行ウィンドウに以下のように表示される

print new 入門1().ブール型の練習()

5.1.9 VDM++言語入門1 例題の実行2

SEC-FM1-B1-01

ここは、print_ブール関数の中から

echo関数を使って表示している。

ここは、 「ブール型の練習」関数

の返り値が表示されている。

例題の詳しい説明は、VDM++の

ソース・ファイルTutorial1.vdmppを

参照のこと。

Page 33: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

33 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2 VDM++言語入門2 数値型,集合型,レコード型

5.2.1 数値型

5.2.1.1 数値型の演算子

5.2.2 集合型

5.2.2.1集合型の主要演算子

5.2.3 レコード型

5.2.3.1 レコード型の主要演算子

5.2.4 仕様ファイル追加

5.2.4.1 演算子の実行例

SEC-FM1-B1-01

5.2.5 実行ウィンドウで実行

5.2.5.1 ブレイクポイントの設定

5.2.5.2 ブレイクポイント設定後

5.2.5.3 デバッグ実行

5.2.5.4 値を表示

5.2.5.5 値の表示結果

Page 34: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

34 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

実数 real

...、-3.14、 0、3、3.0、3.12e10、...

有理数 rat)

インタープリタ上は実数と同じ

整数 int

...、-2、-1、0、1、2...

自然数 nat

0、1、2、...

1以上の自然数 nat1

1、2、3、...

5.2.1 VDM++言語入門2 数値型

SEC-FM1-B1-01

Page 35: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

35 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.1.1 VDM++言語入門2 数値型の演算子

演算子 名称 型 例

-x 負符号 real -> real -11 結果 -11

abs x 絶対値 real -> real abs -3 結果 3

floor x 底値 xを越えない最大の整数 real -> int floor 3.1 結果 3 floor -3.1 結果 -4

x + y 加算 real * real -> real 1+2 結果 3

x - y 減算 real * real -> real 1-2 結果 -1

x * y 乗算 real * real -> real 2.3*2 結果 4.6

x / y 除算 real * real -> real 2.3/2 結果 1.15

x div y 整数除算 int * int -> int 11 div 3 結果 3

x rem y 剰余算 (負になり得る) int * int -> int 3 rem 2 結果 1 -3 rem 2 結果 -1

x mod y 法算 数学の定義による剰余 int * int -> int 3 mod 2 結果 1 -3 mod 2 結果 1

SEC-FM1-B1-01

x rem y = x - y * (x div y)

x mod y = x - y * floor(x/y)

Page 36: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

36 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.2 VDM++言語入門2 集合型

SEC-FM1-B1-01

役割

重複と順序のない物の集まりを表す

構文例

S = set of A

構成子

列挙表現 '{' 式1',' 式2 ','... ',' 式n '}'

{1,2,3,1+3} = {1,2,3,4} -- 数値型の集合

{'a','b','c'} -- 文字型の集合

{"VDM", "IPA"} -- 文字列型の集合

{true, false} -- ブール型の集合

Page 37: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

37 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.2.1VDM++言語入門2 集合型の主要演算子

演算子 名称 型 例

e in set s1 帰属 A* set of A → bool (1 in set {1,2}) 結果 true

e not in set s1 非帰属 A* set of A → bool (3 not in set {1,2}) 結果 true

s1 union s2 合併 set of A * set of A -> set of A {1,2} union {1,3,4} 結果 {1,2,3,4}

s1 inter s2 共通部分 set of A * set of A -> set of A {1,2} inter {1,3,4} 結果 {1}

s1 s2 差 set of A * set of A -> set of A {1,2,3,4} {2,4} 結果 {1, 3}

s1 subset s2 包含 set of A * set of A -> bool {1,2} subset {4,1,3,2} 結果 true

card s1 濃度 set of A -> nat card {1,2,3} 結果 3

s1 = s2 相等 set of A * set of A -> bool {1,2,3} = {3,2,1} 結果 true

s1 <> s2 不等 set of A * set of A -> bool {1,2} <> {1,3,4} 結果 true

power s1 有限冪集合 set of A -> set of set of A power {1,2} 結果 { { }, { 1 }, { 2 }, { 1, 2 } }

SEC-FM1-B1-01

Page 38: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

38 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.3 VDM++言語入門2 レコード型

SEC-FM1-B1-01

複数の型から合成される型

プログラミング言語における構造体に相当する

構文例

A :: 識別子1 : A1

識別子2 : A2

識別子3 : A3;

構成子

mk_A(a, b, c) -- aはA1型、bはA2型、cはA3型

上記例の社員型の場合、以下で社員型のインスタンスを定義

できる。

mk_社員(3, 96.8, 176.8)

例:

社員 ::

fID : 社員ID

f体重 : 体重

f身長 : 身長;

Page 39: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

39 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.3.1 VDM++言語入門2 レコード型の主要演算子

演算子 名称 型

例 この例は識別子のスコープの関係でそのままでは

動かないので、VDMPPturorial2フォルダ下の入門2

のソースTutorial2.vdmppを使って動かす。

r.i 欄選択 A * Id -> Ai w社員 = mk_ 社員(3, 96.8, 176.8)とすると w社員.fID = 3, w社員.f体重=96.8, w社員.f身長=176.8

r1 = r2 相等関係 A * A -> bool mk_社員(3,96,177) = mk_社員(3,96,177) 結果 true

r1 <> r2 不等関係 A * A -> bool mk_社員(1,96,178) <> mk_社員(3,96,177) 結果 true

SEC-FM1-B1-01

Page 40: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

40 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.4 VDM++言語入門2 仕様ファイル追加

SEC-FM1-B1-01

VDMToolsを起動し、 VDMPPtutorial2 フォルダ内の下記

ファイルを追加する

Tutorial2.vdmpp

VDMPPtutorial1 フォルダ内の下記ファイルを追加する

io.vpp

VDMUtil.vpp

Page 41: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

41 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.4.1 VDM++言語入門2 演算子の実行例

SEC-FM1-B1-01

実行ウィンドウのDialog画面で下記のようにタイプする

p new 入門2().ns

p new 入門2().ss

p new 入門2().rs

上記は、いずれも計算結果を設定した定数を表示するので、計

算結果の数だけtrueを持った列[true, true,..., true]を返す。

例: p new 入門2().rs の結果は [ true, true, true, true, true ]

詳細は、Tutorial2.vdmppソースを参照のこと。

Page 42: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

42 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5 VDM++言語入門2 実行ウィンドウで実行

SEC-FM1-B1-01

実行ウィンドウのDialog画面で下記のようにタイプする

p new 入門2().集合演算の練習()

Page 43: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

43 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5.1 VDM++言語入門2 ブレイクポイントの設定

SEC-FM1-B1-01

VDM++ソースの任意の場所にブレイクポイントを設定し、

識別子の値を表示してみよう。

マネージャーウィンドウでクラ

スタグを選択し、入門2をダブル

クリックするとソース

Tutorial2.vdmppのソースが表示さ

れる。

ここで、121行を表す部分をダブ

ルクリックし、マウスの右ボタ

ンをクリックすると、ブレイクポ

イント設定を行うことができる

ユーザーマニュアル3.8.2ブレイク

ポイントの設定を参照のこと。

Page 44: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

44 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5.2 VDM++言語入門2 ブレイクポイント設定後

SEC-FM1-B1-01

実行ウィンドウ右下にブレイクポイントが表示される。

Page 45: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

45 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5.3 VDM++言語入門2 デバッグ実行

SEC-FM1-B1-01

ここで、

d new 入門2() .集合演算の練習( )

とタイプすると、下記のようになり、ソースの121行目で停止する。 dはdebugの略である。

Page 46: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

46 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5.4 VDM++言語入門2 値を表示

SEC-FM1-B1-01

r2を選択し、マウスの右クリックで値を表示してみよう。

Page 47: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

47 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.2.5.5 VDM++言語入門2 値の表示結果

SEC-FM1-B1-01

r2の値の表示結果は、以下のようにtrueとなる

Page 48: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

48 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5. 3 VDM++言語入門3 写像型

SEC-FM1-B1-01

5.3.1 写像型

5.3.1.1写像型構成子

5.3.1.2 写像型演算子

5.3.1.3 写像型演算子

5.3.1.4 仕様ファイル追加

5.3.1.5 実行ウィンドウで実行

Page 49: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

49 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1 VDM++言語入門3 写像型

SEC-FM1-B1-01

順序のない値の組(キー,値)を表す

写像型に用意されている演算子が豊富なため、写像型をうまく使えばモデルが単

純化できる。

キーとデータを持つ表のモデル化によく使われる。

定義域から値域への多対1の関係は許されるが、1対多の関係は許されない。

types

public 社員 = map 社員ID to 人; 写像型定義例

dom

定義域(domain)

社員ID

rng

値域(range) 人

1

2

3

4

"sahara"

"sakoh"

"araki"

Page 50: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

50 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1.1 VDM++言語入門3 写像型構成子

SEC-FM1-B1-01

構成子

● 列挙表現

'{' a1' |->' b1 ',' a2 '|->' b2 ',' ... ',' an '|->' bn '}'

例: {1 |-> mk_社員(50, 150), 2 |-> mk_社員(180, 190.9)}

社員の型定義が下記の場合

public 社員 ::

f体重 : 体重

f身長 : 身長;

Page 51: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

51 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1.2 VDM++言語入門3 写像型演算子

演算子 名称 型 例

dom m 定義域 (map A to B) -> set of A dom m 結果 {1,3,4}

rng m 値域 (map A to B) -> set of B rng m 結果 { 'a', 'c', 'd' }

m1 munion m2 併合 (map A to B) * (map A to B) -> map A to B m1 munion m2 結果 { 1 |-> 'a', 2 |-> 'b', 3 |-> 'c', 4 |-> 'd' }

m1 ++ m3 上書 (map A to B) * (map A to B) -> map A to B m1 ++ m3 結果 { 1 |-> 'a', 3 |-> 'b', 4 |-> 'd' }

s <: m 定義域限定 (set of A) * (map A to B) -> map A to B s <: m 結果 { 1 |-> 'a', 3 |-> 'c' }

s <-: m 定義域削減 (set of A) * (map A to B) -> map A to B s <-: m 結果 { 4 |-> 'd' }

SEC-FM1-B1-01

m={4 |-> 'd', 1 |-> 'a', 3 |-> 'c'}

m1 = m, m2 = {2 |-> 'b'}, m3 = {3 |-> 'b'}

s={1,3}

とする

Page 52: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

52 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1.3 VDM++言語入門3 写像型演算子

演算子 名称 型 例

m :> s2 値域限定 (map A to B) * (set of B) -> map A to B m :> s2 結果 { 1 |-> 'a', 4 |-> 'd' }

m :-> s2 値域削減 (map A to B) * (set of B) -> map A to B m :-> s2 結果 { 3 |-> 'c'}

m(d) 写像適用 (map A to B) * A -> B m(d) 結果 'c' d=3なのでm(3)と同じ

m1 = m2 相等 (map A to B) * (map A to B) -> bool m = m1 結果 true

m1 <> m2 不等 (map A to B) * (map A to B) -> bool m1 <> m2 結果 true

SEC-FM1-B1-01

m={4 |-> 'd', 1 |-> 'a', 3 |-> 'c'}

m1 = m, m2 = {2 |-> 'b'}, m3 = {3 |-> 'b'}

s2={'a','d'}, d = 3

とする

Page 53: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

53 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1.4 VDM++言語入門3 仕様ファイル追加

SEC-FM1-B1-01

VDMToolsを起動し、 VDMPPtutorial3 フォルダ内の

下記ファイルを追加する

Tutorial3.vdmpp

Page 54: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

54 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

5.3.1.5 VDM++言語入門3 実行ウィンドウで実行

SEC-FM1-B1-01

以下を実行し、ソースと比べて、結果を検証せよ。

d new 入門3().rs

d new 入門3().resultOfAll

d new 入門3().社員情報を得る(1)

d new 入門3().個人情報を得る(1)

d new 入門3().メタボ社員リストを得る()

Page 55: VDMTools VDM++ - IPA...2014/02/04  · 0. 2 VDM とは? VDM = Vienna Development Method 離散数学をベースとした仕様記述と検証のための手法 1960年代から1970年代にIBMウィーン研究所で開発

55 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center

6. まとめ

SEC-FM1-B1-01

1. VDM開発環境構築

2. VDMToolsの起動

3. インタープリタの起動

4. VDMToolsチュートリアル

5. VDM言語入門

5.1. VDM言語入門1- 列、文字、文字列、ブール、関数

5.2. VDM言語入門2 - 数値、集合、レコード、全称限量式、集合内包式、操作

5.3. VDM言語入門3 - 写像、不変条件、事前条件、事後条件

6. 説明していないこと - 条件式、条件文、ループ文