View
32
Download
0
Category
Preview:
Citation preview
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++
入門
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
写像
まとめ
3 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
0. はじめに
0.1 本資料の対象者
0. 2 VDMとは?
0.3 VDM++とは?
SEC-FM1-B1-01
4 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
0.1 本資料の対象者
対象者
仕様を書くために必要な離散数学の基礎を勉強したい方
集合論、述語論理(命題論理+3つの論理式)の基礎
仕様記述言語VDM++で仕様を書くための初歩を知りたい方
「対象を如何にモデル化するか?」セミナーを受講する方
前提条件
プログラム作成経験があること
SEC-FM1-B1-01
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
6 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
0.3 VDM++とは?
関数型+オブジェクト指向+手続き型の仕様記述言語
今回は、関数型については説明をほぼ省略
VDMToolsを用いたVDM++仕様の検証が可能
構文チェック、型チェック、仕様実行、回帰テスト
証明課題(証明すべき条件式)とC++とJavaの生成(今回は省略)
SEC-FM1-B1-01
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
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
9 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
2. VDMToolsの起動
Windows7の場合のスタートメニュー例
SEC-FM1-B1-01
今後の説明は、v9.0.2
で説明していく
10 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
2.1 VDMTools起動時の画面
SEC-FM1-B1-01
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
12 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
3.1 VDMToolsのVDM++インタープリタの起動画面
SEC-FM1-B1-01
初期化を選択すると
次ページの実行ウィ
ンドウが開く
13 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
3.2 VDMToolsの実行ウィンドウ
SEC-FM1-B1-01
Response画面
Dialog画面
実行結果が表示される
インタプリタコマンド
を入力する
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 とタイプする
15 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
3.4 VDMToolsの実行結果
SEC-FM1-B1-01
計算した結果。
上のWarningは、
今は無視して構わ
ない
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
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
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
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
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
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
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
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
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
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
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++の式
をタイプしても同じ結果が得られ
ることを確認する。
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. 文字コードを選択
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ウィンドウ
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
30 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
例題の実行
次に文字列(文字型の列)と真偽値を扱うブール型を練習する。
列型も少し触れる。
前ページで、必要なファイルは読み込まれ、構文チェックも終わ
っているので、型チェックを行い、次に初期化を行ってから、
print new 入門1().こんにちは("佐原伸")
とタイプしてみよう。
結果は、次のページに示す
5.1.7 VDM++言語入門1 例題の実行1
SEC-FM1-B1-01
31 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
5.1.8 VDM++言語入門1 例題の実行1の結果
SEC-FM1-B1-01
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を
参照のこと。
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 値の表示結果
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
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)
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} -- ブール型の集合
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
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身長 : 身長;
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
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
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ソースを参照のこと。
42 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
5.2.5 VDM++言語入門2 実行ウィンドウで実行
SEC-FM1-B1-01
実行ウィンドウのDialog画面で下記のようにタイプする
p new 入門2().集合演算の練習()
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ブレイク
ポイントの設定を参照のこと。
44 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
5.2.5.2 VDM++言語入門2 ブレイクポイント設定後
SEC-FM1-B1-01
実行ウィンドウ右下にブレイクポイントが表示される。
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の略である。
46 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
5.2.5.4 VDM++言語入門2 値を表示
SEC-FM1-B1-01
r2を選択し、マウスの右クリックで値を表示してみよう。
47 Copyright © 2013 IPA, All Rights Reserved Software Reliability Enhancement Center
5.2.5.5 VDM++言語入門2 値の表示結果
SEC-FM1-B1-01
r2の値の表示結果は、以下のようにtrueとなる
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 実行ウィンドウで実行
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"
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身長 : 身長;
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}
とする
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
とする
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
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().メタボ社員リストを得る()
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. 説明していないこと - 条件式、条件文、ループ文
Recommended