NuSMV Version 2 の使い方メモ
これは情報科学類計算機 (Mac) 上で NuSMV2 を使うためのメモです。
まず、~kam/sysverif/simple.smv を見て概要を理解してください。
同じファイルは、授業ホームページにも置いてあります。
http://logic.cs.tsukuba.ac.jp/~kam/sysverif/simple.smv
この入力ファイルについての説明を以下に書きます。
* 入力ファイルの基本構成は以下の通り。
----------------------------------------------------
MODULE モジュール名
VAR
変数1の定義 (定義の終わりに ; を書く)
変数2の定義
...
(定義の順番は適当でよい)
ASSIGN
初期状態における変数1の値を決める式 (式の終わりに ; を書く)
初期状態における変数2の値を決める式
次の瞬間における変数1の値を決める式
次の瞬間における変数2の値を決める式
...
(式の順番は適当でよい)
LTLSEPC 仕様1 (CTL仕様を書くときは、「SPEC 仕様1」と書く)
LTLSEPC 仕様2
...
(仕様の順番は適当でよいが、その順番にモデル検査が実行され
出力がでてくる)
----------------------------------------------------
* モデルの1つの状態は、「各変数がどういう値を取るか」で決まる。
ex1.smv では、
request変数が TRUE か FALSE か、
status 変数が ready か busy か、
なので、合計で4通りの状態がある。
状態1. request=FALSE, status=ready
状態2. request=FALSE, status=busy
状態3. request=TRUE, status=ready
状態4. request=TRUE, status=busy
* モデルの「遷移」(transition、1つの状態から次の状態への移動)は、
ASSIGN以下の文で決まる。これは、「次の状態における変数がどうなる
か」を記述したものである。
初期値
init(status) := ready;
次の状態での値
next(status) := ...
* 場合分けの式は case で書く。
case
B1: busy;
B2: {ready,busy};
esac;
ここで B1, B2 は boolean 型の式である。
* 変数の値は、1つとは限らない。つまり、
複数の状態を1度にあらわしたいことがあるので、
その場合は集合を使う。
next(status) = {ready,busy};
* LTL の仕様は LTLSPEC というキーワードの後に書く。
G, F, X, (..U..) 時相論理の記号
-> ならば
& かつ
| または
! でない
原子命題は、真偽値を取る変数そのものや、等式など。
boolean型の変数は、それ単独で論理式になる。
たとえば、request
等式は、論理式になる。
たとえば、status=busy や request
* CTL の仕様は SPEC というキーワードの後に書く。
AG, AF, EG, EF, AX, EX, A[..U..], E[..U..]
* case 文がわかりにくいようなので、補足する。
next(x) :=
case
e1: a1;
e2: a2;
e3: a3;
TRUE: b;
esac;
このようなcase式では、e1,e2,e3 は真理値(TRUE か FALSE)を
取る式であり、next(x) の値は、
もし、今の瞬間の e1 の値が TRUE なら、a になり、
そうでなくて、もし、今の瞬間の e2 の値が TRUE なら、a2 になり、
そうでなくて、もし、今の瞬間の e3 の値が TRUE なら、a3 になり、
そうでなければ、b になる。
ということを表している。
最後の TRUE: b; という部分は、C言語の switch 文でいうところの
default のケースに相当する。
上記のように、case式の中身は上から順番に処理されることに注意されたい。
亀山幸義