• 検索結果がありません。

早稲田大学大学院 基幹理工学研究科 情報理工学専攻

N/A
N/A
Protected

Academic year: 2022

シェア "早稲田大学大学院 基幹理工学研究科 情報理工学専攻"

Copied!
88
0
0

読み込み中.... (全文を見る)

全文

(1)

2010 年度 修士論文

インタラクティブなモデルの検査を可能にする LMNtal ビジュアルツールの設計と実装

提出日: 2011 年 1 月 27 日 指導 : 上田 和紀 教授

早稲田大学大学院 基幹理工学研究科 情報理工学専攻

学籍番号: 5109B003-7

綾野 貴之

(2)

概要

情報システムに大きく依存している現代社会において,ソフトウェアの障害や誤作動は 大きな損失をもたらし,人命にも関わる重大な事故を起こす危険性をはらんでいる.その ような背景からソフトウェアの品質を向上させるための手段としてモデル検査技術が注目 を集めている.モデル検査とはモデル記述言語を用いてシステムの動作を有限状態遷移系 にモデル化し探索する検証手法であり,網羅的探索によってモデルの不具合を発見する.

階層グラフ多重集合書き換えに基づく状態遷移系記述言語LMNtalにおいても2007年よ

りLMNtalをモデル記述言語とするモデル検査器の構築が行われ,高信頼なシステム構

築をサポートするようになった.LMNtalモデル検査器は検査のための特別な準備を最低 限にするよう設計されており,LMNtalで記述されたほどんどすべてのシステムを対象に 仕様を満たすか判定することができる.同一の言語で開発と検証を可能にすることで,探 索や検証分野にも拡大し広範な応用を目指している.

本研究でもモデル検査の応用を開拓すべく,新たに検証をビジュアライズする環境の構 築を行った.LMNtalモデル検査器やコンパイラ,プログラム実行可視化ツールなどの各

種LMNtal処理系をユーザーが容易に操作できるように統合開発環境LaViTの設計と実

装を行い,その統合された環境の1つの機能として検証ビジュアルツールStateViewer を提供した.

StateViewerはLMNtalモデル検査器からの情報を解析してモデルの全状態遷移グラ

フや検証結果の可視化を行う.しかし探索深度を揃えた状態描画などをするものの,モデ ルの性質によって状態遷移グラフの形状も大きく異なるため単一の描画方法では対応しき れなかった.そこでどのような状態遷移グラフでも可能な限りわかり易く正確に把握でき るようにするため,状態と遷移が重ならないようにするダミーノードの導入や3D空間で の描画,遷移関係の解析による状態配置,遷移をバネに見立てた力学による状態配置など の工夫を行った.また単にグラフの描画を行うだけではなく,実行シミュレーション機能 や状態検索機能,遷移検索機能などシステムの性質を解析するための機能をGUIで提供 した.特にLMNtalの性質に着目し,同一書き換え規則で状態遷移可能な状態集合を1 つの状態に抽象化を行うことで,組み合わせ爆発を起こした状態空間をブラウジング可能 なサイズにまで状態数削減を行う状態集合抽象化機能も実装した.

ユーザーはこれらの機能を適宜使用することでインタラクティブなモデルの検査がで き,システムの理解を深めることが可能となっている.書き換え規則の不備や仕様外の デッドロックの発生検出,対称性の発見などテキストだけでは見逃す可能性の高い重要な モデルの性質をユーザーに提供できるようになった.

(3)

目次

1章 はじめに 1

1.1 研究の背景と目的 . . . 1

1.2 関連研究 . . . 2

1.3 本論文の構成 . . . 5

2LMNtal言語解説 6 2.1 LMNtal言語の概要 . . . 6

2.2 LMNtal処理系 . . . 13

2.3 LMNtalプログラム実行可視化ツール . . . 13

3LMNtalモデル検査 14 3.1 モデル検査とは . . . 14

3.2 LMNtalモデル検査器SLIM . . . 14

3.3 LTLモデル検査の実行方法 . . . 15

3.4 LTLモデル検査の実行例 . . . 17

3.5 非決定実行機能 . . . 18

4LMNtal統合開発環境LaViTの構成 20 4.1 LaViT構成概要 . . . 20

4.2 開発支援機能 . . . 21

4.3 検証支援機能 . . . 22

4.4 検証評価機能 StateProfiler . . . 23

5章 統合開発環境LaViTの設計と実装 26 5.1 統合開発環境LaViTの設計 . . . 26

5.2 統合開発環境LaViTの実装 . . . 28 ii

(4)

6章 検証ビジュアルツールStateViewerの構成 30

6.1 StateViewerの基本機能 . . . 31

6.2 状態配置機能 . . . 32

6.3 交差数削減機能,ダミーノード機能 . . . 33

6.4 状態集合抽象化機能 . . . 33

6.5 実行シミュレーション機能 . . . 34

6.6 検索機能 . . . 34

6.7 3D状態遷移描画機能 . . . 35

6.8 LTL StateViewer . . . 36

7StateViewerの設計と実装 50 7.1 StateViewerの設計方針 . . . 50

7.2 3D StateViewerの設計 . . . 50

7.3 StateViewerの基幹部分の実装 . . . 51

7.4 グラフ描画の実装 . . . 52

7.5 Adjust Reset機能の実装 . . . 52

7.6 抽象化機能の実装 . . . 54

8章 実行例と機能評価 56 8.1 Petersonのアルゴリズム . . . 56

8.2 エレベーターモデルの検証 . . . 59

8.3 StateViewerのスケーラビリティの評価. . . 62

9章 まとめと今後の課題 63 9.1 まとめ . . . 63

9.2 今後の課題 . . . 64

謝辞 66 参考文献 67 Appendix.A LMNtalソースコード 69 A.1 LMNtalサンプルソースコード . . . 69

Appendix.B LaViTソースコード 72

iii

(5)

B.1 LaViTソースファイルリスト . . . 72

Appendix.C LaViTバージョン 76

C.1 LaViTのバージョン履歴 . . . 76

iv

(6)

図目次

1.1 ユーザーインターフェースjSpinの実行例 . . . 3

1.2 SpinSpiderによってGraphvizが生成した状態遷移グラフの画像 . . . . 3

1.3 モデル検査器LTSAの実行例 . . . 4

2.1 LMNtal構成要素 . . . 7

2.2 LMNtalの構文規則 . . . 8

2.3 プロセスの型の範囲 . . . 10

2.4 LMNtalの比較演算子 . . . 10

2.5 UNYO UNYOの実行画面 . . . 13

3.1 LMNtalにおけるLTLモデル検査の流れ . . . 16

4.1 LaViTの開発支援機能. . . 21

4.2 LaViTと他処理系の構成 . . . 22

4.3 検証支援機能のインターフェース . . . 24

4.4 有限状態モデルに対するStateProfilerの実行. . . 25

4.5 無限状態モデルに対するStateProfilerの実行. . . 25

5.1 LaViTが使用する他処理系の構造 . . . 27

5.2 LaViTのインターフェース構造 . . . 28

6.1 StateViewer実行例の全体図 . . . 31

6.2 初期配置(Church数2の2乗) . . . 37

6.3 Adjust Resetよる配置(Church数2の2乗) . . . 37

6.4 力学モデルによる配置(Church数2の2乗) . . . 37

6.5 抽象化機能の適用(Church数2の2乗) . . . 37

v

(7)

6.6 初期配置(ハノイの塔) . . . 38

6.7 Adjust Resetよる配置(ハノイの塔) . . . 38

6.8 力学モデルによる配置(ハノイの塔) . . . 38

6.9 初期配置(水差しの問題) . . . 39

6.10 Adjust Resetよる配置(水差しの問題) . . . 39

6.11 力学モデルによる配置(水差しの問題) . . . 39

6.12 Adjust Reset配置後ダミー導入(水差しの問題) . . . 39

6.13 Dummy Mix Adjustよる配置(水差しの問題) . . . 39

6.14 垂直方向の遷移の重なり . . . 40

6.15 Set Vertical Dummyの適用. . . 40

6.16 3D StateViewerの実行例 . . . 40

6.17 実行シミュレーション機能の実行例 . . . 41

6.18 LMNtalルール構文を用いた状態検索の実行例 . . . 42

6.19 ルール名による遷移検索の実行例 . . . 42

6.20 検索をした3D StateViewerの実行例 . . . 42

6.21 通常のState Viewerによる実行. . . 43

6.22 3D State Viewerによる規則性の発見 . . . 43

6.23 LTL StateViewerの実行例 . . . 44

6.24 LTL StateViewerの3D実行例 . . . 44

7.1 モデル検査器SLIMとStateViewerの処理の流れ . . . 51

7.2 ダミーノードを制御点とするベジエ曲線の描画 . . . 52

7.3 簡単なプログラムへのAdjust Reset機能適用例 . . . 52

7.4 重なった状態の間隔を均等にあける . . . 53

7.5 重なった状態の間隔を再帰的に均等にあける . . . 53

7.6 抽象化機能の実装の概要 . . . 54

8.1 Petersonのアルゴリズムの状態遷移グラフ . . . 56

8.2 Petersonのアルゴリズムを検証するための記述. . . 57

8.3 Petersonのアルゴリズムのエラーサイクルの描画 . . . 58

8.4 エラーサイクルが検出されないLTL StateViewerの実行 . . . 58

8.5 エレベーターモデルにおけるStateViewerの実行 . . . 60

8.6 エレベーターモデルにおける3D StateViewerの実行 . . . 60

vi

(8)

8.7 エレベーターモデルにおけるエラーサイクルの検出 . . . 61 8.8 エレベーターモデルにおけるエラーサイクルの検出(3D) . . . 61 8.9 53万状態の描画 . . . 62

vii

(9)

表目次

4.1 処理系操作ボタンの説明 . . . 23

5.1 LMNtal処理系の実装言語 . . . 29

6.1 Control Buttonタブの機能一覧(1) . . . 45

6.2 Control Buttonタブの機能一覧(2) . . . 46

6.3 Otherタブの機能一覧 . . . 47

6.4 右クリック時の機能一覧 . . . 48

6.5 マウスとキーボードの操作一覧 . . . 49

viii

(10)

1

1

はじめに

1.1 研究の背景と目的

LMNtal(Linked Multisets of Nodes transformation language)[1, 2, 18]は階層グラフ 多重集合書き換えに基づく状態遷移系記述言語である.階層グラフをルールと呼ばれる書 き換え規則によって動的に変化させることで,複雑なデータ構造を操作するプログラム や多重集合書き換えを伴うプログラムを簡潔に記述することができる豊富な表現力を有 する.

そこで LMNtalの並行言語の特性と高い表現力を生かし,2007年からLMNtalをモ

デル記述言語としたモデル検査器SLIM(Slim Lmntal IMplementation)[5]を開発してい る.モデル検査とは,モデル記述言語を用いてシステムの動作を有限状態遷移系にモデル 化し,その有限状態遷移グラフを網羅的に探索することによって不具合を発見する自動検 証技術である.社会的なシステムの重要性からソフトウェアの信頼性を向上させるための 手段としてモデル検査技術が注目を集めている.

LMNtal モデル検査器は,LMNtal実行時処理系で稼動する LMNtalプログラムをほ

とんど修正することなしにそのままモデル検査の対象とすることができる特徴を持ってい

る.このLMNtalモデル検査器は軽量高速化のために JavaによるLMNtal 処理系とは

切り離されてC言語で実装され,現在では最適化が進み並列化[12]などの工夫がなされ ている.

しかしモデル検査器は定義した仕様に対してエラーが検出されると反例を出力するもの の,エラーが検出されない場合はシステムの性質に関する情報は提供されない.また仕様 による検査となるため,仕様を超えたシステムの性質は一般的にわからず,予期しない デッドロックや記述者の意図をしない動作などをしている可能性が残る.

(11)

1.2 関連研究 2 これを補うために統合開発環境 LaViT(LMNtal Visual Tools) は,システムの状態 遷移グラフを可視化することでモデルの挙動を視覚的に示す検証ビジュアルツール StateViewerを提供している.StateViewerはモデルの全実行経路,さらにはモデル検査 の結果の可視化を行い,モデル検査だけでは表現されなかったシステムの性質表現を目的 にしている.またユーザーが自ら状態遷移グラフに対して検索機能や抽象化機能をイン タラクティブに適用することでさらにシステムの動作の理解を深めることを目的にして いる.

またLMNtalにはUNYO UNYO[4, 9]と呼ばれるLMNtalプログラム実行可視化ツー ルが存在する.このUNYO UNYOはアニメーションでプログラムの処理の進行の表示 し動作の把握を容易にすることができる.操作性のためにモデル検査器SLIM同様,Java

によるLMNtal処理系とは独立している.

このように同じ言語で単一のソフトウェアとして実装するのではなく,システムの目的 に適した言語選択と設計方法による実装が必要であったためそれぞれ独立して開発され た.その結果,LMNtal環境の導入が複雑になってしまい,他処理系を利用するにはそれ ぞれ異なる実行手順が必要になった.統合開発環境LaViTはモデル検査器 SLIMや実行 可視化ツールUNYO UNYOを単一のGUIで導入や起動ができるようにすることも重要 な目的として位置付けている.

1.2 関連研究

既存の可視化検証ツールでは,状態数の多い遷移グラフは想定されておらず利用場面は 限定されることが多い.またLaViTのStateViewerは状態遷移グラフをインタラクティ ブに解析する機能を多く提供している点で他の可視化検証ツールと異なる場合が多い.本 節では統合開発環境LaViTや検証ビジュアルツールStateViewerの特に重要な関連研究 を紹介する.

1.2.1 SPIN のユーザーインターフェース jSpin

Gerard J. Holzmannによって開発されたSPIN(Simple Promela Interpreter)[17] は 高速で軽量なモデル検査器である.LMNtal モデル検査器SLIMもSPINのアルゴリズ ムを一部参考にしている.

SPIN は利用の流れが複雑で高速化やメモリ使用量削減のためのオプションが多く用 意されているが,ユーザインターフェースのjSpin[22] を用いて簡略化できる.jSpin の

(12)

1.2 関連研究 3

1.1 ユーザーインターフェースjSpinの実行例

1.2 SpinSpiderによってGraphvizが生成した状態遷移グラフの画像

実行例を図1.1に示す.jSpinは主に利便性の向上や導入の簡易化を目的としているが,

LaViTは利便性の向上や導入の簡易化を高めることだけでなく,StateViewerによって

状態遷移グラフを可視化しシステムの性質を表現することを積極的に検証に役立てようと している点が異なる.

(13)

1.2 関連研究 4

1.3 モデル検査器LTSAの実行例

jSpin には,モデルの状態遷移の情報をグラフ描画ツールGraphvizに渡し状態遷移グ

ラフを表示するSpinSpiderと呼ばれる機能が存在する.SpinSpiderの実行例を図1.2に 示す.描画を汎用的なグラフ描画ツールに任せることで洗練されたグラフ描画を行うこと ができるが,対象の多い規模の大きな描画にGraphvizは向いておらず,状態遷移グラフ は描画対象が多くなりがちなためSpinSpiderは使用範囲が限られている.また画像ファ イルとして出力するためインタラクティブな状態遷移グラフの把握には対応していない点 がStateViewerと異なる.

1.2.2 モデル検査器 LTSA

LTSA(Labeled Transition System Analyzer)[19]はFSP(Finite State Process)形式 の有限状態機械を検証することができる検証統合環境である.LTSAではプロセスの状態 遷移を可視化することができ,シミュレーション機能も用意されている.またJavaで実 装されており,コンパイルが必要ないため他のモデル検査器と比較して導入や実行が非常 に容易である.実行例を図1.3に示す.

ラベル付き遷移系を代数的に表現できるFSPは,データ構造に柔軟性がなく表現力が乏 しいためプログラミング言語として一般的に位置付けられていない.しかしLMNtal モ デル検査器は階層化が可能で柔軟性に富むデータ構造を持つプログラミング言語LMNtal をモデル記述言語としている.状態遷移グラフを可視化する機能においても,シミュレー

(14)

1.3 本論文の構成 5 ション機能以外にモデルを検査する機能を有しておらず定型化された状態遷移グラフの 描画を行うにとどまる.LaViTのStateViewerはシミュレーション機能だけでなく,検 索機能や,状態遷移を解析した配置機能,状態遷移に特化して工夫された描画など多く の機能を有する.また LTSAは状態数100の状態遷移のグラフ描画が不可能であるが,

StateViewerは10万状態以上描画できるためスケーラビリティでも優れている.

1.3 本論文の構成

本論文の構成は下記の通りである.

2章はLMNtalの概要について解説する.

3章はLMNtalモデル検査について解説する.

4章はLMNtal統合開発環境LaViTの構成を解説する.

5章はLMNtal統合開発環境LaViTの設計と実装について解説する.

6章は検証ビジュアルツールStateViewerの構成を解説する.

7章は検証ビジュアルツールStateViewerの設計と実装について解説する.

第8章は実行画面を用いながらLMNtal統合開発環境の使用例を示す.

9章は本研究のまとめと今後の課題について述べる.

(15)

6

2

LMNtal 言語解説

LMNtal(Linked Multisets of Nodes transformation language)は階層グラフ書き換え に基づく並行言語モデルである.本章では,LMNtalの言語と LMNtalの実行を行うシ ステムについて説明する.なお本章は文献[1, 2, 18]を基に再構成したものである.

2.1 LMNtal 言語の概要

LMNtalはルールと呼ばれる書き換え規則によって階層グラフを動的に変化させること

で複雑なデータ構造を操作するプログラムや多重集合書き換えを伴うプログラムを簡潔に 記述することができる.

2.1.1 LMNtal の構成要素

LMNtalのプログラムはプロセスと呼ばれる4つの要素アトム,リンク,膜,ルールか

ら構成される.

アトムはアトム名と呼ばれる名前と0本以上のリンクを持つ.例えばX,Yの2本のリ ンクを持つ名前nのアトムはn(X,Y).と記述する.

リンクはアトムを1対1で接続してグラフを構成する.例えばアトムa,bをリンク X で接続したグラフはa(X),b(X).と記述する.

膜はアトムなどの要素の多重集合を構成し,多重集合は入れ子にすることで階層構造を 構成する.例えばアトムiをもつ膜は{i}と記述する.さらにこの膜とアトムjをもつ膜 は{{i},j}.と記述する.

ルール(書き換え規則) はアトムとリンクと膜からなる階層グラフを動的再構成する.

(16)

2.1 LMNtal言語の概要 7

2.1 LMNtal構成要素

ルールには名前をつけることができるため,例えばアトムyをアトムzに書き換える名前 rのルールはr@@ y:-z.と記述する.ルール名はプログラム上の動作には影響しないが,

実行時の出力に含まれるようになるためデバッグや挙動の把握に役立てることができる.

LMNtalプログラム

¶ ³

{a(X),b}. c,d(X). d(A):-e(A).

µ ´

を図で表現したものを図2.1に示す.

2.1.2 LMNtal 基本構文

LMNtalの構文規則を図2.2に示す.

P はプロセス,T はルールのプロセス書き換え規則の表現に用いるプロセステンプ レートである.0 は中身のないプロセスを表す.p はアトム,X はリンク名を表す.

p(X1, . . . , Xm)はアトムpm本のリンクを持つことを表す.1つのリンクは2つのア トムを接続する.そのためLMNtalのプロセスは,同じリンク名が2回を超えて出現し てはならない(リンク条件).プロセス P に1回だけ出現するリンク名はP の自由リン クを表す.この自由リンクはプロセスP の外部にあるアトムにつながる.

P, P はプロセスの並列合成, {P} は膜 {} によって階層化されたプロセスP である.

ルールT :- T はプロセスの書き換え規則で,膜によって階層化されたプロセスを対象と する.例えば

¶ ³

{ x. { x:-a. }. x:-b. }. x:-c.

µ ´

(17)

2.1 LMNtal言語の概要 8

P ::= 0 (空)

| p(X1, . . . , Xm) (m0) (アトム)

| P, P (分子)

| {P} (セル)

| T:-T (ルール)

T ::= 0 (空)

| p(X1, . . . , Xm) (m0) (アトム)

| T, T (分子)

| {T} (セル)

| T:-T (ルール)

| @p (ルール文脈)

| $p[X1, . . . , Xm|A] (m >0) (プロセス文脈)

| p(*X1, . . . ,*Xm) (m >0) (アトム集団)

A ::= [] (空)

| *X (リンク束)

2.2 LMNtalの構文規則

では,アトムxと同じ階層にあるルールx :- bだけが適用される.

ルール文脈の@pは膜の中のすべてのルールにマッチする.プロセス文脈の$pは膜の 中のルール以外のプロセスのうち,明示的に指定されていないプロセス全体とマッチす る.例えば

¶ ³

{ x,$p,@p } :- { $p,@p }.

µ ´

は先の構造において@pは膜内のルールx:-b.にマッチし,$pは膜内の明示されたアトム x以外の構造{x:-a. }.にマッチする.

2.1.3 ガード付きルール

LMNtal のルールには書き換えを行う構造を指定するためにガード付きルールが存在

する.

Head:- Guard|Body

(18)

2.1 LMNtal言語の概要 9 ガードにはプロセスの型や比較演算子が用意されており,プロセスに関する制約を書くこ とができる.

int(X)

リンクX の先には1つの整数アトム.

float(X)

リンクX の先には1つの浮動小数点数アトム.

unary(X)

リンクX の先には1つのアトム.

ground(X)

リンクX の先には1つ以上接続されたアトム(膜を持たない).

例えば¶ ³

p(1). p(2.0). p(a). p(a(b,c)). p(a(X)),{b(X)}.

µ ´

を考える.リンクを1 つ持つアトムp が4 つある.アトム p のリンク先にはそれぞれ 違ったグラフ構造がある.p(X)としてマッチさせようとしたときにリンクX のガードに よってマッチするものが変化する.

p(X) :- int(X)|. —p(1)にマッチ

p(X) :- f loat(X)|. — p(2.0)にマッチ

p(X) :- unary(X)|. — p(1)とp(2.0)とp(a)にマッチ

p(X) :- ground(X)|. — p(1)とp(2.0)とp(a)とp(a(b,c))にマッチ intとfloatはunaryの部分型であり,unaryはgroundの部分型である.これを図2.3 に示す.

またリンク先のプロセスの型が指定されている場合,そのリンクのリンク条件は満たさ なくてよい.例えば

¶ ³

n(p).

n(X) :- a(X),b(X),c(X).

µ ´

はリンク条件を満たしていないためコンパイルエラーとなるが

(19)

2.1 LMNtal言語の概要 10

2.3 プロセスの型の範囲

X =Y XY が等しい (X とY はground型) X\ =Y XY が等しくない (X とY はground型) X =:=Y XY が等しい (X とY はint型) X =\ =Y XY が等しくない (X とY はint型) X < Y XY より小さい (X とY はint型) X =< Y XY 以下 (X とY はint型) X > Y XY より大きい (X とY はint型) X >=Y XY 以上 (X とY はint型)

2.4 LMNtalの比較演算子

¶ ³

n(p).

n(X) :- unary(X) | a(X),b(X),c(X).

µ ´

と書くことでアトムpを複製することができるプログラムになる.

またプロセスを比較演算子によって比較することができる.主な比較演算子を図2.4に 示す.プロセスに型がある場合のみ比較でき,それぞれの型に対応した比較演算子が用意 されている.そのため型指定を省略できる.例えば

(20)

2.1 LMNtal言語の概要 11

¶ ³

a(3),a(7).

a(X),a(Y) :- X<Y | a(Y).

µ ´

と,整数の比較を行うことができる.

またガード内で新たなint 型のプロセスを定義することができる.これによりガード 内で四則演算をすることができる.例えば

¶ ³

a(3),a(7).

a(X),a(Y) :- Z=X+Y | a(Z).

µ ´

を実行すると,新しいアトムa(10)が生成される.

ルール左辺の膜の後に“/”を付加すると,それ以上ルールの適用が起こらない膜にしか マッチしなくなる.これによって子孫膜における計算終了の検出に利用できる.例えば

¶ ³

{

a(3),a(7),a(12).

a(X),a(Y) :- Z=X+Y | a(Z).

}.

{ $p,@p }/ :- $p.

µ ´

は,膜内のルールの適用が終了した後に,膜外のルールがマッチする.

2.1.4 省略構文

LMNtalにはいくつか省略構文がある.

リスト

Ai を第 i要素とするリスト構造をX= [A1,A2,. . . , An]と書ける.X はリスト の先頭につながるリンクである.

項記法

木構造のデータを他言語と同様に記述することができる.アトムaの第k引数とし て,リンク名の代わりに最終引数を省略したアトムbを書くと,aの第k 引数とb の最終引数とがリンクで接続されているものとみなす.つまりa(b)はa(X),b(X) と等しい.

コネクタ

(21)

2.1 LMNtal言語の概要 12 コ ネ ク タと 呼 ば れ る = は リ ン ク の 接 続 を 表 す .例 え ば a(X),b(Y),X=Y は , a(X),b(X) と等しい.他の略記法と合わせることで,a(X),b(X) を a=b と略 記できる.

無リンクアトム

リンクが0本のアトムの括弧()は省略できる.例えばa()は単にaと略記できる.

前置演算子

リンクが1本でアトム名が0+0または00 の場合は前置演算子のように書ける.例 えば’+’(X)は+X,’-’(Y)は-Yと略記できる.

2.1.5 コメント

コメントはブロックコメントと一行コメントがある.ブロックコメントは“/*”と“*/”

で囲まれた部分で書くことができる.ただし入れ子にすることはできない.一行コメント は行の“%”か“//”以降がコメントになる.

¶ ³

/*

ブロックコメント

*/

//一行コメント

%一行コメント

µ ´

2.1.6 プログラム例

例として複数の整数の和を求めるLMNtalプログラムを示す.

¶ ³

n(1), n(2), n(3). sum(0).

plus@@ n(N),sum(S) :- M=N+S | sum(M).

µ ´

3つのアトムnと3つの整数アトム1,2,3がリンクでそれぞれ接続されている.またア トムsumと整数アトム0がリンクで接続されている.ルールplusは,アトムnとそれに 接続された整数アトム,アトムsumとそれに接続された整数アトムをとり加算したもの をアトムsumに接続し直す.このルールを繰り返すことでアトムsumに接続された整数 アトムに整数アトムの和を求めることができる.またこのプログラムの解は1 つである

(22)

2.2 LMNtal処理系 13

2.5 UNYO UNYOの実行画面

が,加算の順序を定めていないため実行過程の非決定性をもつ.

2.2 LMNtal 処理系

Javaによって実装されたLMNtal処理系は大きく分けてコンパイラと実行時処理系か らなる.コンパイラは独自に設計した中間命令列へと変換し,それを実行時処理系で解釈 実行することができる.他にも中間命令列をそのままテキストとして出力する機能も持っ ている.また実行時処理系は多言語インターフェースを実装しており,入出力やGUI, ネットワーク接続など機能の拡張を行うことができる.

2.3 LMNtal プログラム実行可視化ツール

LMNtalプログラム実行可視化ツールはLMNtalプログラムの処理の進行を可視化す

ることで実行内容の把握を容易にすることができる.このLMNtalプログラム実行可視 化ツールはUNYO UNYO[4, 9]と呼ばれる.実行画面を図2.5に示す.UNYO UNYO は階層グラフを多様な力学アルゴリズムによって動的に再配置を行う.そのためルールの 適用やユーザーによる操作によって階層グラフが変化しても柔軟に可視化することができ

る.またLMNtal処理系によるルール適用が行われた差分グラフだけを扱うようにする

など,大規模なグラフを想定した設計と実装がなされている.

(23)

14

3

LMNtal モデル検査

LMNtalの処理系はモデル検査機能を有する.本章ではモデル検査の概要と,LMNtal

モデル検査器について述べる.

3.1 モデル検査とは

モデル検査とは,モデル記述言語を用いてシステムの動作を有限状態遷移系にモデル 化し,その有限状態遷移グラフを網羅的に探索することによって不具合を発見する自動 検証技術である.例えばモデル検査器SPIN[17]ならばPromelaでモデルを記述し状態 遷移グラフを網羅的に探索する.仕様の記述は SPINでも採用されている LTL(Linear Temporal Logic)やCTL(Computational Tree Logic)などの時相論理式が用いられ,シ ステムの状態遷移に関する性質を検査することができる.しかし探索する状態空間は組み 合わせ爆発を起こしやすく,非常に多くのメモリと時間を必要としてしまう.そのため状 態空間の管理手法や状態の圧縮表現手法,状態数削減手法が求められる.

3.2 LMNtal モデル検査器 SLIM

並行言語である LMNtalはルールの実行順序や適用箇所を定めていないため,他の言 語よりも容易に非決定性を持たせることができる.また複雑なデータ構造を操作するプロ グラムや多重集合書き換えを伴うプログラムを簡潔に記述することができる豊富な表現 力を有する.そこでLMNtalの並行言語の特性と豊富な表現力を生かし,LMNtal をモ デル記述言語としたモデル検査機能[5]を開発している.このLMNtalモデル検査器は SLIM(Slim Lmntal IMplimentation)と呼ばれ,LMNtalで書かれたシステムの信頼性

(24)

3.3 LTLモデル検査の実行方法 15 の向上を図っている.

このモデル検査器SLIMはJavaによる実行時処理系とは別に開発が行われ,動作の高 速化とメモリの使用量を抑える設計がされており,実装もC言語で行われている.Java による実行時処理系とはデータの保持の方法が異なるため,1つのアトムのリンク本数は 127本以下,整数アトムなどのデータアトム同士の接続ができないなどいくつかの制約 があるが,Javaによる実行時処理系で稼働するほとんどすべてのLMNtalプログラムを SLIMで実行することができる.通常実行でJavaによる処理系と比較すると,10倍以上 の高速化と,数分の一にメモリ使用量も抑えることが可能になった.モデル検査機能はこ の高速なSLIM実行時処理系に組み込まれる形で実装されたためSLIMで実行できるプ ログラムをそのままモデル検査の対象にすることができるのが特徴である.

3.3 LTL モデル検査の実行方法

モデル検査器SLIMにおいてLTLモデル検査を行う場合は

検査対象のLMNtalプログラムファイル

検証したい性質のLTL式を変換したNever Claimファイル

Never Claim内で使用する命題記号の定義ファイル

の3つのファイルが必要になる.LTLからNever Claimへの変換はLTL2BA[20]を使 用する.例えば“常に pが成立する”を表したLTL式[]pをLTL2BAでNever Claim に変換すると

¶ ³

never { /* []p */

accept_init:

T0_init:

if

:: ((p)) -> goto T0_init fi;

µ} ´

となる.

Never Claim内で使用する命題記号の定義は,LMNtalルールのように Symbol=Head :- Guard|

(25)

3.3 LTLモデル検査の実行方法 16 と記述する.命題記号の定義は1行に1つずつ行い,複数の命題記号を定義する場合は 改行する.命題記号の名前をSymbolに記述し,LMNtalのルールにおけるヘッドとガー ドと同じようにHeadGuardを記述する.なお,ガード条件が必要ない場合は記述を 省略することができる.このHeadGuardで記述されたLMNtalのルールがマッチす るならば命題は真となり,しなければ偽となる.例えば,命題記号名pを“アトムaがあ り,リンク先はground型である” と定義するには

¶ ³

p = a(X) :- ground(X) |

µ ´

と記述する.例えばa(b(c))が存在すれば命題記号のルールがマッチするため,命題pは 真となる.

このように記述した Never Claim内で使用する命題記号の定義ファイルと,検証した い性質のLTL式を変換したNever Claimファイルを検査対象のLMNtalプログラムファ イルと共にモデル検査器SLIMに与えることでLTLモデル検査を行うことができる.こ のモデル検査の流れを図3.1に示す.

3.1 LMNtalにおけるLTLモデル検査の流れ

LMNtalモデル検査器SLIMは,検証対象の LMNtalプログラムのルール適用と,性

質オートマトンの状態遷移とを交互に行うことで,実行を進めつつ状態遷移グラフを生成 する.探索はSPINでも用いられているnested DFSで行い,探索中に受理サイクルが見 つかった場合はそこまでの経路を反例として出力する.

なお,LaViTでは1つのインターフェースでLTL式の記述と命題記号の定義をするこ

とができ,ファイルの生成も自動で行う.詳しくは4章で紹介する.

(26)

3.4 LTLモデル検査の実行例 17

3.4 LTL モデル検査の実行例

ここでは簡単なLMNtalの例題に対してにLTLモデル検査を行う.アトムnにリンク した整数アトムを書え換えていくLMNtalプログラムを以下に示す.

¶ ³

n(1).

n(N) :- N<5,M=N+1 | n(M).

n(N) :- N<5,M=N+2 | n(M).

n(N) :- N>=5 | n(1).

µ ´

アトムnに接続された整数アトムが5未満なら1ずつ増やすルールと,2ずつ増やすルー ル,5以上ならば1にするルールの3ルールがある.次に命題記号p, q, rを定義する.

¶ ³

p = n(N) :- N>0 | q = n(5)

r = n(1)

µ ´

アトムnに接続された整数アトムが 0より大きければ命題pは真に,整数アトムが5な らば命題qは真に,整数アトムが1ならば命題rは真に定義した.

ここで“アトムnに接続された整数アトムは,常に正の整数アトムである” であること を調べるためにLTL式[]pの否定をNever Claimに変換して検査を行うと

¶ ³

No Accepting Cycle (or Invalid State) exists.

’# of States’(stored) = 6.

’# of States’(end) = 0.

’# of States’(invalid) = 0.

µ ´

とエラーは検出されない.

次に“アトムnに接続された整数アトムは,必ずいつか5になる”の仕様[]<>qを満た すか調べると

(27)

3.5 非決定実行機能 18

¶ ³

CounterExamplePaths 1::T0_init{n(1). @5. }

* 4::accept_S2{n(2). @5. } 6::accept_S2{n(4). @5. } 8::accept_S2{n(6). @5. } 9::accept_S2{n(1). @5. }

* 4::accept_S2{n(2). @5. }

’# of States’(stored) = 9.

’# of States’(end) = 1.

’# of States’(invalid) = 0.

µ ´

と,エラーサイクルが検出され,整数アトムが5にならないサイクルがあることがわかる.

さらに“アトムnに接続された整数アトムは,必ずいつか1になる” の仕様[]<>rを満 たすか調べると

¶ ³

No Accepting Cycle (or Invalid State) exists.

’# of States’(stored) = 11.

’# of States’(end) = 1.

’# of States’(invalid) = 0.

µ ´

と,整数アトムは必ずいつか1になることがわかる.

3.5 非決定実行機能

モデル検査器SLIMはLMNtalプログラムの全実行経路を出力する機能も備えている.

この機能は非決定実行機能と呼ばれる.例えば3.4節で前述したLMNtalプログラム

¶ ³

n(1).

n(N) :- N<5,M=N+1 | n(M).

n(N) :- N<5,M=N+2 | n(M).

n(N) :- N>=5 | n(1).

µ ´

のLMNtal プログラムは,加算の方法によって様々な実行経路を取り得る.このプログ

(28)

3.5 非決定実行機能 19 ラムに対してSLIMの非決定実行機能を用いると

¶ ³

States 6::n(6).

5::n(5).

4::n(4).

2::n(2).

3::n(3).

1::n(1).

Transitions init:1 6::1 5::1 4::5,6 2::3,4 3::4,5 1::2,3

µ ´

の出力が得られる.

States以下では

状態番号::状態のテキスト表現

の表記により,番号とLMNtalの状態の対応付けを行い,Transitions以下では 状態番号::遷移先の状態番号のリスト

の表記により,遷移の情報を表示している.またinitが初期状態番号を示す.これにより 全実行経路を把握することができる.

全状態数が有限であれば通常の実行では停止しないプログラムであってもLTLモデル 検査および非決定実行機能は必ず停止する.

(29)

20

4

LMNtal 統合開発環境 LaViT

構成

LaViTが実装した機能は大きく分けて4つに分類される.

開発支援機能

処理系仲介インターフェースとLMNtal専用エディタ

検証支援機能

LMNtalモデル検査器の操作性を高めるLTLモデル検査インターフェース

検証評価機能

モデルに対するLMNtalモデル検査器の性能を定量的に示すグラフビューア

検証可視化機能

システムの性質を視覚的に表現するインタラクティブな検証ビジュアルツール 本章では主に開発支援機能,検証支援機能,検証評価機能について紹介し,検証可視化機 能は6章で紹介する.なお,バージョン2.4.2時のLaViTをもとに紹介する.LaViTの 使用例を図4.1に示す.

4.1 LaViT 構成概要

LaViTの構成概要を図4.2に示す.LaViTは

JavaによるLMNtal実行時処理系とLMNtalコンパイラ

モデル検査器SLIM

(30)

4.2 開発支援機能 21

4.1 LaViTの開発支援機能

LMNtalプログラム実行可視化ツールUNYO UNYO

LTLからNever Claimへ変換するLTL2BA

の処理系を 1 つのユーザーインターフェースで操作できるようになっている.公開版

LaViT*1をダウンロードすると,LTL2BA以外の処理系が同封されており,環境でコン

パイルが必要なSLIMなどのインストールをLaViTは自動で行う.

4.2 開発支援機能

LaViTのウィンドウの左部分がLMNtalプログラムを編集するエディタ部,右半分が

タブで切り替えができる機能部である.

エディタ部の上部でプログラムを編集することができる.ここでは LMNtalプログラ ムを解析し“int”などの予約語やコメントを色付けを行い,プログラムの記述性・可読性 を向上させている.

エディタ部の下部のボタンで処理系を実行することができる.各ボタンの動作を表4.1 に示す.

図4.1に示されている機能部ではSystemタブが選択されており,上部では処理系から

*1http://www.ueda.info.waseda.ac.jp/lmntal/

(31)

4.3 検証支援機能 22

4.2 LaViTと他処理系の構成

の出力を,下部ではLaViTのシステム動作のログをそれぞれ表示している.上部のテキ ストには検索機能がついており,大量の出力が表示され可読性の悪くなった場合でもアト ム名などでテキスト検索できる.下部のログでは処理系を実行する際のオプションなどを 表示しているため,バックエンドでどのような処理が行っているかを確認することができ

る.またLMNtal処理系の概算実行時間の表示もするため,時間のかかる処理を行った

場合でも容易に実行時間を知ることができる.プログラムエディター,処理系実行ボタ ン,出力表示,ログ表示を1つのウィンドウにまとめることでスムーズな開発が行えるよ うに考慮した.

4.3 検証支援機能

機能部をLTL記述用に切り替えて,3章で説明したLTL式の記述と式中で使用した命 題記号の定義の記述の画面を図4.3 に示す.自動的に記述した内容のファイルが生成さ れ,下部のLoadとSaveボタンで LTL式と命題記号の定義をセットで読み込みと保存 ができるようになっている.LTL式を変換する LTL2BAはLTL式の入力部分の横にあ

るTranslate ボタンで起動することができる.LTL2BAはサイトからダウンロードし所

(32)

4.4 検証評価機能 StateProfiler 23 ボタンのラベル 説明

LMNtal(Java) JavaによるLMNtal実行時処理系でエディタ部のプログラ ムを通常実行する

UNYO(2G) JavaによるLMNtal実行時処理系に組み込まれている古い

バージョンのUNYO UNYOでプログラムを可視化する

UNYO(3G) 外部化され高機能化した UNYO UNYO でプログラムを可

視化する

StateProfiler プログラムに対して検証評価機能StateProfilerを実行する SLIM モデル検査器SLIMで通常実行を行う

StateViewer 検証可視化機能StateViewerでモデルの動作を可視化する Kill 実行中の他処理系の動作を止める

4.1 処理系操作ボタンの説明

定のディレクトリに置くと,Translate ボタンを押す際にLaViTが自動でインストール を行うようになっている.モデル検査器SLIMを実行する際もオプションにファイルの パスを自動的に指定するため,ユーザーはファイルの操作を意識せずにモデル検査を行う ことができる.

4.4 検証評価機能 StateProfiler

LMNtalモデル検査では状態の同型性判定に時間がかかることが多く,モデルの性質に

よって状態空間の探索にかかる時間が大きく異なる.また,反例を見つけるかすべての状 態の探索が終了するまで定量的な出力は無いため,時間がかかる大きいモデルはモデル検 査が進行しているか分からず,検査の実行速度を評価する方法も無かった.

そこで LaViTはモデル検査器の状態展開速度を測定する機能を備えた.この機能を

StateProfilerと呼ぶ.自然数アトムを生成するLMNtalプログラム

¶ ³

c(1).

c(N) :- N<4000,M=N+1 | c(M),n(N).

µ ´

にStateProfilerを実行した結果を図4.4に示す.X軸が時間軸,Y 軸が状態数を表し,

モデル検査器が展開した状態数を逐一プロットする.グラフの上部では展開直後の状態の

(33)

4.4 検証評価機能 StateProfiler 24

4.3 検証支援機能のインターフェース

LMNtal構造をテキストで表示している.このLMNtalプログラムでは展開ごとに 1状

態のアトムが1つずつ増えていくため,状態の同型性判定に時間がかかるようになり展開 速度が遅くなっていくことがわかる.

またLMNtalモデル検査で無限状態空間の探索を行うと停止しないが,StateProfiler

は誤って無限状態になってしまうプログラムを書いてしまったときもデバッグに使用でき る.また無限でなくとも莫大な状態空間になってしまうプログラムの性質を見ることがで きる.整数アトムを無制限にインクリメントするLMNtalプログラム

¶ ³

c(1).

c(N) :- M=N+1 | c(M).

µ ´

にStateProfilerを実行した結果を図 4.5に示す.探索が停止しないプログラムにおいて

も,展開しているLMNtal構造を知ることができるためどのような状態展開が行われて いるかユーザーは把握することができる.

(34)

4.4 検証評価機能 StateProfiler 25

4.4 有限状態モデルに対するStateProfilerの実行

4.5 無限状態モデルに対するStateProfilerの実行

(35)

26

5

統合開発環境 LaViT の設計と実装

本章では前章で説明したLMNtal統合開発環境LaViTの設計と,それに基づく実装に ついて述べる.検証ビジュアルツールStateViewerの設計と実装は前章同様7章で紹介 する.

5.1 統合開発環境 LaViT の設計

LaViTの設計にあたって以下の事に特に注意した.

LMNtalを取り巻く処理系は多方面に独自の拡張がされる

1つのソフトウェア LaViTとして操作できるようにし,処理系の分断を可能な限 りユーザーに意識させないようにする

GUIの特性を活かしたLaViTとしての独自機能を提供する

LaViT自体の機能や他処理系の機能は些細なものであっても使えるようにして

ユーザーの選択肢を広げる

ただし機能連携の多さから他機能に影響を与えるような不安性があるものは取り除き,

ユーザーに提供しない公開方針をとっている.

5.1.1 LaViT と他処理系の構成設計

LMNtalにはプログラム実行可視化ツールUNYO UNYOやモデル検査器SLIMなど

いくつかの処理系が存在し多彩な機能を提供している.他処理系の構造を図5.1に示す.

これらのシステムはその目的に合わせて適した言語が選択され設計と実装がされた.その

(36)

5.1 統合開発環境LaViTの設計 27

5.1 LaViTが使用する他処理系の構造

結果,処理系の導入や実行方法が煩雑になってしまい,ユーザーが機能を十分に使い切れ なくなってしまった.

そこでLaViTはLMNtalにおける開発や他処理系を操作の障壁をできるだけ少なくす

るため,公開版のLaViTと一緒に可視化ツールやモデル検査器を同封し,インストール もすべてGUI上で行えるようにした.また他処理系は同封されLaViTと連携するもの の可能な限り他処理系の活発な開発に影響がないようにするため,標準入出力でのデータ のやり取りを行うようにした.この結合度を低く保つ設計により,同封されている他処理

系はLaViTに依存することなく単独で動作させることも可能になっている.

5.1.2 LaViT のインターフェース設計

可視化ツールやモデル検査器を起動するためのコマンドなどは極力入力せず,ボタンだ けで直感的に操作できるように設計した.これによりプログラマがLMNtalプログラム の記述に集中できるようにし,他処理系の操作方法を極力意識をしなくて良いようになっ ている.

LaViT上のウィンドウの概要を図5.2に示す.エディタ部と機能部はプログラマの意

図に応じて自由に領域を変えることができる.機能部はタブになっており,どの機能を使 うかに応じて切替が可能になっている.タブ内はそれぞれの機能が目的に応じて集まるよ うに配置を行い,タブの切替が最低限で済むようにしている.また例えば処理系起動ボタ ンでStateViewerを起動するとタブがStateViewerタブに自動で切り替わるように,実 行した処理系の機能に応じて自動で適切なタブに切り替わるようにした.

(37)

5.2 統合開発環境LaViTの実装 28

5.2 LaViTのインターフェース構造

5.2 統合開発環境 LaViT の実装

LaViTは

連携すべきLMNtal処理系とUNYO UNYOがJavaで実装されている

JavaのSwingによってユーザーが使いやすいGUIの実装が行える

Windows,Mac,Linuxなど幅広い環境で動作させる

の理由から Java によって実装された.他処理系の実装言語については表 5.1に示す.

LaViTはオープンソース*1で開発されている.ソースファイルの一覧を付録B.1に示す.

2009年から実装が行われ,バージョン2.4.2まで 45回のバージョンアップが行われた.

バージョンアップの内容を付録C.1に示す.

5.2.1 LaViT と他処理系の結合部の実装

既に示した図4.2にあるように,JavaによるLMNtal処理系にはLmntalRunner,SLIM にはSlimRunner,UNYO UNYOにはUnyoRunner,LTL2BAにはLtl2baRunnerが仲 介役として存在し,これらのクラスによって処理系をカプセル化して起動している.各種

*1http://code.google.com/p/lavit/

(38)

5.2 統合開発環境LaViTの実装 29

処理系名 機能 実装言語

JavaによるLMNtal処理系 実行時処理系,コンパイラ Java

UNYO UNYO LMNtal実行可視化ツール Java

SLIM 軽量高速な実行時処理系,モデル検査器 C言語

LaViT 統合開発環境,検証ビジュアルツール Java

5.1 LMNtal処理系の実装言語

Runnerは実行開始時に呼び出すのrun()メソッド,終了判定するためののisRunning() メソッド,実行が成功したか判定するためのisSuccess()メソッド,実行を中断するため

のkill()メソッドを実装している.またそのRunnerの特性に応じて,実行時間を得る実

装や,出力の取得方法を変更する実装などがなされている.さらに各種処理系はThered を起動するため,LaViTの操作とは同期実行する事も非同期実行することもが可能になっ ており,ユーザーがスムーズに処理系を起動できる実装の工夫がなされている.

5.2.2 エディタ部の実装

エディタ部はユーザーの使用頻度が高い機能であると予想されるため,試行錯誤しなが ら実装を繰り返し行った.読み込みや新規保存,上書き保存などファイルの基本的な操作 はもちろん,コピー,カット,ペースト,元に戻す(Undo),やり直し(Redo)などの機能 を提供した.またデバッグ時に役に立つよう行番号の表示も行っている.さらにLMNtal のプログラミングをし易くするために,“int”や“ground”といったLMNtalの予約語や コメントを色付けする機能も備えている.特にLMNtal プログラム色付け機能と元に戻

す(Undo),やり直し(Redo)は相互に影響を及ぼすため実装を工夫している.ユーザー

の入力とプログラムの色付けを区別して履歴として持ち,元に戻す動作ややり直し動作 をする場合はその履歴に基づいて色付けはスキップするように実装している.これによ りユーザーが元に戻す,またはやり直す際に色付け動作だけが対象にならないようにし,

ユーザーの意図する履歴まで遡ることができる.

(39)

30

6

検証ビジュアルツール

StateViewer の構成

StateViewerが実装した機能は大きく分けて8つに分類される.

状態配置機能

遷移を考慮した状態配置や,遷移をバネに見立てた力学モデルの適用による配置を 行う

交差数削減機能

遷移と遷移の交差を削減する

ダミーノード機能

ダミーノードを導入することで状態と遷移の重なりを回避する

状態集合抽象化機能

状態の集合を1状態に抽象化しブラウジングする状態数の削減を行う

実行シミュレーション機能

ユーザーが適用ルール,遷移先状態を選択し仮想的にLMNtal通常実行を1ステッ プずつ進めることで実行経路を確認できる

検索機能

状態や遷移の検索を行う

3D状態遷移描画機能

Java3Dを使用して3次元上に状態遷移グラフを描画する

LTL StateViewer

モデル検査器の検証結果をStateViewerで描画する

(40)

6.1 StateViewerの基本機能 31 本章では実行例を示しながらこれらの機能を説明する.

またControl Buttonタブの各ボタンや各チェックボックスの動作を表6.1と表6.2に,

Otherタブの各ボタンや各チェックボックスの動作を表6.3に,Windowsにおける右ク

リック時に表示される機能の動作を表6.4に,マウスとキーボードによる動作を表6.5に それぞれ示す.

6.1 StateViewer の基本機能

6.1 StateViewer実行例の全体図

StateViewerはLMNtalモデル検査器SLIMから得られる状態遷移の情報を解析し可 視化を行う.単純に描画をするだけでなく,インタラクティブにモデルを検査するための 機能をGUIで提供した.StateViewerの実行例を図6.1に示す.

1つの円がプログラムの1つの状態を表し,矢印が状態の遷移を表している.状態を表 す円をクリックすると状態の内容をテキスト表示させることができる.また状態の色は遷 移数と被遷移数によって決定される.特に被遷移数が0の初期状態は青,遷移数が0とな る最終状態は赤で表示される.これにより最終状態などの状態遷移グラフにおいて重要な 状態の発見をしやすくなっている.

(41)

6.2 状態配置機能 32

6.2 状態配置機能

StateViewerの状態配置機能は

遷移関係にある状態の平均Y座標に配置(Adjust Reset機能)

ノードを反発物体に,遷移をバネに見立てた力学モデルによる配置

に大きく分かれる.ただし,ダミーノードの導入タイミングによって状態遷移グラフの形 も変わってくる.また探索の深さを自然に表現するために状態遷移グラフのx 座標は状 態の深さによって等間隔に並ぶように固定し,配置機能によって変化することがないよう にした.

LMNtalによるλ計算のエンコーディング[21]でChurch数表現による2の2乗を計

算し,StateViewerで状態遷移グラフを表示したものを図6.2 に示す.このグラフに対

してAdjust Reset機能を実行したものを図6.3に示す.さらに力学モデルによる配置を

行ったものを図6.4に示す.Adjust Reset機能でも力学モデルによる配置でも最終状態 が二つ存在すること,両最終状態に至るステップ数が異なることなどがはっきりと観察す ることができる.

次に円盤6枚のハノイの塔のプログラム

¶ ³

poles([p([1,2,3,4,5,6,999]),p([999]),p([999])]).

p@@ P1=p([H1|T1]), P2=p([H2|T2]) :- H1<H2 | P1=p(T1), P2=p([H1,H2|T2]).

µ ´

の状態遷移グラフを図6.6に示す.この図から再帰的な構造があることが予想できるが自 明ではない.このグラフに対してAdjust Reset機能を実行(図6.7)すると,再帰的な構 造を見て取ることができる.さらに力学モデルによる配置(図6.8)を行うと交差もなく再 帰的な構造を完全に見て取ることができる.

ハノイの塔の状態遷移グラフでは力学モデルによる配置が優位であったが必ずしもそう とは限らない.例としては水差しの問題が挙げられる.ソースコードを付録A.1.1に添付 している.初期配置(図6.9)から Adjust Reset機能を実行 (図6.10)すると対称性が見 えるが.力学モデルによる配置(図6.11)を行うとその対称性が崩れてしまう.そのため

StateViewerは1つの配置方法だけの採用ではなく,ユーザーが意図に応じて配置方法を

変えることができるようにしている.

(42)

6.3 交差数削減機能,ダミーノード機能 33

6.3 交差数削減機能,ダミーノード機能

StateViewerはユーザーが正確に状態遷移グラフを理解できるように遷移と遷移の交差

を削減する交差数削減機能,遷移と遷移,遷移と状態の重なりを削減するダミーノード機 能を提供している[13].

水差しの問題の状態遷移グラフにAdjust Reset機能を実行(図6.10)したものに対し てダミーノードを入れると図6.12のようになる.遷移と遷移の重なりが少なくなり,遷 移先の状態が明確にわかるようになる.さらに交差数削減機能を適用したものを6.13に 示す.交差が少なくなることで遷移がはっきりと把握し易くなる.

Adjust Reset機能を適用後,ダミーを導入し,交差数削減を実行する一連の流れを1

つにまとめた機能がDummy Mix Adjustとなっている.

またダミーノードの導入は深さ dの状態が深さd−n(n >= 2)への遷移(バッグエッ ジ)をもつ場合に挿入される Set Back Dummy機能だけでなく,同深度のノードで遷移 と状態が重なっている場合にダミーノードを挿入して回避するSet Vertical Dummy機 能も用意されている.例えばLMNtalプログラム

¶ ³

n(1).

n(N) :- N=\=1 | n(1).

n(N) :- N=\=2 | n(2).

n(N) :- N=\=3 | n(3).

n(N) :- N=\=4 | n(4).

µ ´

をStateViewerで実行すると図 6.14となる.実際には一番上のノードから一番下への

ノードへの遷移が存在するが,遷移が重なってしまい表現されていない.そこで Set

Vertical Dummy機能を実行すると,図6.15のように同深度の遷移と状態の重なりを避

けるためのダミーが自動で挿入され重なりを回避する.

6.4 状態集合抽象化機能

状態数の多いモデルはブラウジングや描画に限界があり,システムの挙動の理解が困難 な場合が多い.そこでStateViewerは複数の状態を1状態として表示する抽象化機能を 備えている.その抽象化対象になる状態集合は

(43)

6.5 実行シミュレーション機能 34

ルール名を選択してそのルールで遷移可能な状態(Transition Abstraction)

直接マウスで選択した状態(Select Abstraction) の2パターン用意している.

特にユーザーの選択したLMNtalルールで到達可能な状態集合を対象に抽象化を行う ことで,0ステップで遷移したように見せることができる.つまりユーザーが描画不要と

判断したLMNtalルールを描画対象から外すことができる.例として図 6.2に対してλ

計算のベータ簡約以外のLMNtalルールで抽象化したものを図6.5に示す.複数の状態 をまとめた抽象化状態は四角で表している.その四角の状態をダブルクリックすると抽象 化対象となった状態集合の状態遷移グラフを独立して表示することができる.これにより 規模の大きくなった状態遷移グラフでも,抽象化機能を適用することで情報量を減らさず にブラウジングが容易になる状態数まで描画対象を削減することができる.

6.5 実行シミュレーション機能

状態遷移グラフがもつ情報を用いて仮想的にLMNtal通常実行を1ステップずつ進め,

実行する様子を再現する実行シミュレーション機能をStateViewerは備える.実行例を 図6.17に示す.

start ボタンでシミュレーションを開始し,表示されている遷移先の状態を見ながら

適用したいルールを選択する.forwardにあるボタンが先に進むルール適用のボタンで,

backにあるボタンが戻るルール適応のボタンであり,深さが同じ場合はY座標が大きい 遷移先状態順にボタンが並んでいる.ルールを適応するとグラフ上でも選択している状態 が移動し,状態のテキスト表示が適応した順に記録されていく.

自動選択機能(Auto Run)も実装しており,通常は一番上のボタンが自動で選択され実 行が進む.またルールに優先順位をつけて,順位が高いものから順に選択させることもで きる.選択スピードも0.1秒から2秒の間で選択可能で,把握できる速度に調節できる.

このシミュレーション機能により,ユーザーはプログラムの実際の振舞をルール選択し ながら確認することができる.

6.6 検索機能

状態を検索しマッチした状態だけを強調表示することもできる.例として水差しの問題 を考える.

(44)

6.7 3D状態遷移描画機能 35 図6.9から図6.13までで示した状態遷移グラフは300mlと400mlの水差しで測れる水 の全状態の構造を持っているため,ここから200mlの状態があるか調べれば良い.実際 に200mlの水差しの状態があるか調べるため Headはjug(200, N),$pとし,Gurad は N >0で検索するとマッチする状態が図6.18のように強調表示される.よって200mlを 測ることは可能とわかり,初期状態から強調表示されている状態までのパスが解となる.

また状態だけでなく遷移の検索もできる.遷移先,遷移元の関係からの検索とルール 名による検索をサポートしている.例えば水差しの問題において “水をいっぱいにする” ルールfillで行われる遷移を強調したものが図6.19である.これによりルールfillでは初 期状態に戻らないなどの遷移の特徴を把握することができる.

6.7 3D 状態遷移描画機能

StateViewerの描画力を上げるために,Java3Dによる3次元空間での状態遷移グラフ のブラウジングをサポートしている.StateViewerと同様,クリックするとその状態の内 容をテキストで表示する.また3D StateViewer で選択した状態はStateViewerでも選 択されるようになっている.

6.3節で挙げた例題に対して3D StateViewerを適用したものを図6.16に示す.6.3節 では遷移同士の重なりを避けるためにダミーノードを導入していたが,3次元であるため 遷移同士の重なりは空間上では発生せず,正確にブラウジングできる.

検索の結果表示にも対応しており,6.6節で行った200mlが測れている状態の検索結果 を3D StateViewerで表示したものを図6.20に示す.

簡単なLMNtalプログラム

¶ ³

n(1,a).

n(1,b).

n(1,c).

n(N,Atm) :- M=N+1,M=<3 | n(M,Atm).

µ ´

を通常のStateViewerで実行すると図6.21のようになる.ここからは規則性などはすぐ

に見て取れないが,3D StateViewerで図6.22のようにブラウジングするとこの状態遷移 グラフは正六面体になっていることがわかる.このように通常のStateViewerでは発見 できないような規則性や対称性が3D StateViewerによって見つけることができるように なった.

(45)

6.8 LTL StateViewer 36

6.8 LTL StateViewer

StateViewerにはLTLモデル検査を行ったときの性質オートマトンとシステムオート

マトンとの同期積オートマトンの全探索経路を可視化し,モデル検査でのエラーサイクル を強調表示するLTL StateViewer機能が存在する.

ここで3.4節で実行したLTLモデル検査をLTL StateViewerで実行する.“アトムn に接続された整数アトムは,必ずいつか5になる” の仕様 []<>qを満たすか調べるとエ ラーサイクルが検出されていたが,これをLTL StateViewerで描画すると図6.23のよう になる.同期積オートマトンの受理状態を二重の円で表し,エラーサイクルを強調してい る.またこれを3Dでも表示することができる.3Dで表示したエラーサイクル検出を図 6.24に示す.これらのエラーサイクルをブラウジングすることで,どのようなパスが反例 となっているかテキストだけでなくStateViewer上でも確認することができる.

(46)

6.8 LTL StateViewer 37

6.2 初期配置(Church22)

6.3 Adjust Resetよる配置(Church22)

6.4 力学モデルによる配置(Church22)

6.5 抽象化機能の適用(Church22)

(47)

6.8 LTL StateViewer 38

6.6 初期配置(ハノイの塔)

6.7 Adjust Resetよる配置(ハノイの塔)

6.8 力学モデルによる配置(ハノイの塔)

参照

関連したドキュメント

る。また、本件は商務部が直接に国有企業に関する経営者集中行為を規制した例でもある

例) ○○医科大学付属病院 眼科 ××大学医学部 眼科学教室

金沢大学は学部,大学院ともに,人間社会学分野,理工学分野,医薬保健学分野の三領域体制を

専攻の枠を越えて自由な教育と研究を行える よう,教官は自然科学研究科棟に居住して学

東京大学 大学院情報理工学系研究科 数理情報学専攻. hirai@mist.i.u-tokyo.ac.jp

情報理工学研究科 情報・通信工学専攻. 2012/7/12

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

東北大学大学院医学系研究科の運動学分野門間陽樹講師、早稲田大学の川上