33
Copyright (C) 2013 National Institute of Informatics, All rights reserved. 「モデル検査」のススメ (ゲームシナリオ進行編) 2013821国立情報学研究所 GRACEセンター/先端ICTセンター 長久勝 mailto : [email protected] Twitter : @mnagaku

「モデル検査」のススメ (ゲームシナリオ進行編)

Embed Size (px)

DESCRIPTION

CEDEC2013「『モデル検査』のススメ (ゲームシナリオ進行編)」講演スライド増補版

Citation preview

Page 1: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

「モデル検査」のススメ (ゲームシナリオ進行編)

2013年8月21日

国立情報学研究所 GRACEセンター/先端ICTセンター

長久勝

mailto : [email protected]

Twitter : @mnagaku

Page 2: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

2

がいよう

仕様の通りに正しく振る舞うソフトウェアを開発するのは極めて困難であるが、ソフトウェア工学において検討されてきた「モデル検査」は、ソフトウェアをモデル化し、その振る舞いを網羅的に検証することで、仕様の通りに正しく振る舞うソフトウェアの開発を支援する。

コンピュータゲームにおけるシナリオ進行は、状態遷移に基づくスクリプト表現(DSL)で記述されることが多く、モデル検査を行うためのモデル表現と親和性が高い。

本講演では、簡単なノベルゲームエンジンを示し、その上に記述されたゲームのシナリオ進行を、モデル検査によって検証できることを示す。

Page 3: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

3

じゅこうすきるとえられるちけん

受講スキル 大学教養レベルの論理学。ノベルゲームなどのスクリプトが書ける程度のゲーム開発経験

得られる知見 ゲームシナリオ進行に関してモデル検査を使うための具体的なノウハウ。ゲーム開発にモデル検査を導入するためのヒント

Page 4: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

4

おはなしするおじさん

長久勝(ながくまさる)

国立情報学研究所 GRACEセンター/先端ICTセンター 特任技術専門員

ゲーム、映像配信の技術職を経て現職。ソフトウェア工学教育と、学術クラウドに携わっている。早稲田大学MNC非常勤講師兼務。NADEC主宰、ゲームコミュニティサミット2013実行委員、IGDA日本 福島ゲームジャムT/F副世話人。単著「Javaゲームプログラミング アルゴリズムとフレームワーク」、雑誌特集「生物の生きるしくみを応用する免疫アルゴリズム」、TopSE修了制作「FDRによるRPGシナリオの検証」、共著「ゲームクリエイターが知るべき97のこと」。CEDECでは、2005-2011「ゲームAI RT」、CEDECラボ2008プログラム委員、2009講演「僕より賢いSATソルバー」。

Page 5: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

5

おはなしするおじさん

日科技連SQuBOK開発領域委員

もうすぐ改定作業が終わります

最新刊「ゲームクリエイターが知るべき97のこと②」

今日の話は①の方の話だけど

Page 6: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

6

かいじょうあんけーと

職種

プログラマ

スクリプタ、レベルデザイナ

企画、シナリオライタ

その他

知識

三段論法が分かる

状態機械が分かる

網羅的試験が分かる

Page 7: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

7

おしながき

正しく動くソフトウェア

モデル検査

ゲームシナリオ

デモ

Page 8: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

8

ただしくうごくそふとうぇあ

正しく動く≠イイ感じ

「イイ感じ」は曖昧

何が「正しい」か決めて、 それが損なわれないように動くのが「正しく動く」

何が「正しい」か書くのが仕様書

何が「正しい」かを明らかにするために、 何が「正しくない」か書くこともある

「正しい」とも「正しくない」とも判断できない部分が残っている仕様書は「『正しくない』仕様書」

Page 9: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

9

ただしくうごくそふとうぇあ

「戦闘で勝つとアイテムがもらえる」

大雑把過ぎて何が「正しい」挙動か分からない

「戦闘に勝った後、戦闘画面からフィールド画面に戻ると、敵の居た場所に、別途定める確率で、別途定めるアイテムが入った宝箱が出現する。宝箱に隣接した位置で、宝箱を向いて、Aボタンを押すと、アイテムを取得した旨の演出が行われ、持ち物にアイテムが加えられる」

確率やアイテムの種別は定めた通りか、宝箱のどの方向からも開けられるか、持ち物にちゃんとアイテムが入るか

Page 10: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

10

ただしくうごくそふとうぇあ

宝箱からアイテムを取らないで別の画面に移動したらどうなる?取らないままじっとしていたらどうなる?

異常系とかも明示しないとダメ

必要なら非機能についても書く

段階的詳細化

大雑把な要求から、実装や試験が可能な仕様に詳細化していく

各段階での対応関係(トレーサビリティ)、守るべき性質を壊さないように工夫して行う

Page 11: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

11

もでるけんさ

仕様書に書かれた「正しい」を、設計もしくは実装が守っているか検証するための手法の一つ

検査対象となるシステムを 状態機械としてモデル化

モデル上の全ての状態遷移について 網羅的に「正しい」が破られないか探す

Page 12: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

12

じょうたいきかい

100円玉と50円玉だけ受け入れて 100円の商品を出す自動販売機の例

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入

100円玉投入 / 50円玉排出

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下 購入ボタン押下

Page 13: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

13

じょうたいきかいでみるただしさ

どんな状態からでも商品を得る遷移が存在する

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入

100円玉投入 / 50円玉排出

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下 購入ボタン押下

Page 14: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

14

じょうたいきかいでみるただしくなさ

どんな状態からでも商品を得る遷移が 存在する?

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下

Page 15: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

15

もでるけんさき

モデル検査器

「状態機械で見る正しさ」を検査するツール

SPIN、SMV、UPPAAL、LTSA、FDR2、PAT、JavaPathFinder、CBMC、SyncStitch、etc…

今日はLTSAを紹介します

Page 16: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

16

もでるけんさき

LTSA

http://www.doc.ic.ac.uk/ltsa/

Javaで書かれてるので、どこでも動く

Appletでも動く

簡単な使い方や情報を紹介してるBlog http://d.hatena.ne.jp/susumu/searchdiary?word=ltsa

http://ameblo.jp/kenkyu-nisshi/entry-10602734547.html

講義用スライドを玉井先生が日本語化したもの (英語の本家教科書を読む際にも参考になる) http://www.graco.c.u-tokyo.ac.jp/~tamai/concurrency.html

Page 17: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

17

もでるをかく

S自販機 = S内部留保0円,

S内部留保0円 = (e50円玉投入 -> S内部留保50円

| e100円玉投入 -> S内部留保100円),

S内部留保50円 = (e購入ボタン押下げ -> S内部留保50円),

S内部留保100円 = (e購入ボタン押下げ -> a商品排出 -> S内部留保0円

| e50円玉投入 -> a50円玉排出 -> S内部留保100円

| e100円玉投入 -> a100円玉排出 -> S内部留保100円).

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下

Page 18: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

18

もでるを けんさする

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下

//メニューの[check]-[progress]

Composition:

DEFAULT = S自販機

State Space:

6 = 2 ** 3

Progress Check...

-- States: 6 Transitions: 9 Memory used: 128062K

Finding trace to cycle...

Depth 1 -- States: 1 Transitions: 1 Memory used: 128062K

Finding trace in cycle...

Progress violation for actions:

{a100円玉排出, a50円玉排出, a商品排出, e100円玉投入, e50円玉投入}

Trace to terminal set of states:

e50円玉投入

Cycle in terminal set:

e購入ボタン押下げ

Actions in terminal set:

e購入ボタン押下げ

Progress Check in: 0ms

Page 19: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

内部留保0円

内部留保100円

100円玉投入

内部留保50円50円玉投入

50円玉投入

100円玉投入 / 50円玉排出

50円玉投入 / 50円玉排出 100円玉投入 / 100円玉排出

購入ボタン押下 / 商品排出

購入ボタン押下 購入ボタン押下19

もでるをかく けんさする S自販機 = S内部留保0円,

S内部留保0円 = (e購入ボタン押下げ -> S内部留保0円

| e50円玉投入 -> S内部留保50円

| e100円玉投入 -> S内部留保100円),

S内部留保50円 = (e購入ボタン押下げ -> S内部留保50円

| e50円玉投入 -> S内部留保100円

| e100円玉投入 -> a50円玉排出 -> S内部留保100円),

S内部留保100円 = (e購入ボタン押下げ -> a商品排出 -> S内部留保0円

| e50円玉投入 -> a50円玉排出 -> S内部留保100円

| e100円玉投入 -> a100円玉排出 -> S内部留保100円).

Composition:

DEFAULT = S自販機

State Space:

7 = 2 ** 3

Progress Check...

-- States: 7 Transitions: 13 Memory used: 22162K

No progress violations detected.

Progress Check in: 2ms

Page 20: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

20

げーむしなりお

攻略情報でフローチャートがよく出てくる

ゲームシナリオは状態機械で表現可能

フラグが立つ

ゲームシナリオ進行に使われる道具は 限られている

フラグは進行状態を表す

フラグの変化に注目したモデル化で検査ができる

Page 21: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

21

げーむしなりお

do / 鍵取得=false

開始さて進めて どんどん進めて

ぐるぐる脱出最後のドア

探索

do / 鍵取得=true

鍵発見

もうないドア開

開く

開かない

終了

次へ 次へ

次へ

次へ

周りを探すドアを開ける

次へ [鍵取得==false]

次へ [鍵取得==true]

次へ

次へ

次へ [鍵取得==true]

次へ [鍵取得==false]

次へ

次へ

次へ

Page 22: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

22

でも

ゲームのスクリプトに潜むバグを LTSAで取ってみます

http://code.9leap.net/codes/show/37974

ログインして、Forkして、自分用の環境を作る

config.jsのdebugフラグをtrueに変える

実行するとLTSA用のモデルがdialogで出る

LTSAにコピペで持って行く

ブラウザによってコピペ不可なのがあるので注意

Page 23: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

23

けんさできるせいしつ

const False = 0 const True = 1 fluent HAS_KEY = <{m.s鍵発見.s最後のドア}, {m.sさて進めて.sどんどん進めて}> initially False fluent OPEN_DOOR = <{m.s開く.s終了}, {m.sさて進めて.sどんどん進めて}> initially False assert P1 = [](OPEN_DOOR -> HAS_KEY)

イベントによって変化する状態を定義し、その状態の関係をLTLで検査式として書く

P1:ドアが開いた状態の時は、必ず鍵を持っている状態でなければならない

progress END = {m.s終了.s開始}

進行性検証

どんな状態からでも、いつか「m.s終了.s開始」のイベントを起こせる

「m.s終了.s開始」のイベントが起こせなくなる進行とは、エンディングに到達できないパスがあるということ

property Test = (m.s鍵発見.s最後のドア -> m.s開く.s終了 -> Test).

安全性検証

システムを抽象化(捨象)して守るべき性質を記述

「m.s鍵発見.s最後のドア」、「m.s開く.s終了」以外のイベントを無視した場合、システムが 「Test = (m.s鍵発見.s最後のドア -> m.s開く.s終了 -> Test)」 と等価か調べる

鍵を発見していないのにドアが開いたり、鍵を複数回発見してからドアが開いたりすると、等価にならない

Page 24: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

24

げーむしなりおともでるけんさ

デモでの不具合は単純に見える

人間の認識可能な量は簡単に超えてしまう

モデル検査は本来、並行システムの検証に用いられるが、今回題材としているシナリオ進行では並行性を扱わない

一般的なゲームシナリオ進行では、並行性がない、もしくは、既に並行合成が終わった後の並行性がないプロセスを扱う

並行性のないモデル化ができるので、状態爆発を回避できる

Page 25: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

25

ひんと

スクリプトも、リポジトリにコミットした時、CIでモデル検査される仕組みだと、うれしい

ルールやツールを工夫すれば、ゲーム内の設定の一貫性などを検査することも可能

Page 26: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

26

ついかさんぷる

http://code.9leap.net/codes/show/38365

デモと同じ手順でLTSAにモデルを持って行く const False = 0

const True = 1 fluent DEAD_ME = <{m.s死ぬ.s終了}, {m.s終了.s開始}> initially False fluent LIVE_CAT = <{m.s終了.s開始}, {m.s猫死ぬ.s死ぬ}> initially True assert P1 = [](DEAD_ME -> LIVE_CAT)

自分を殺すのが必ず猫だとした場合、 自分が死んだ時に、既に猫が死んでいたらおかしい

ほんとは、死んだら生き返らない検査項目も必要だけど、ここでは割愛

物語の内容についての制約も検査できる

モデル化に工夫しておくと、自動化も可能 キャラ表示命令から香盤表を自動生成して、その情報を使うとか

シーンにアノテーション(タグ)を付けて、遷移以外のイベントを自動で埋め込めるようにするとか

Page 27: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

27

かたよったさんこうぶんけん

CSPベースのモデル検査器は、LTSAの他にもFDR2やPATなど、結構ある

Page 28: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

28

ふつうのさんこうぶんけん

日本語だと中島先生のSPIN本かな

Page 29: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

29

ろんぶんなど

[CEDEC2008]モデル検証入門 ~ツールに振る舞いを検査させる~

http://cedil.cesa.or.jp/session/detail/154

モデル検査のゲームシナリオへの適用

http://www.seiki.org/mass/modelchecking/

設計段階におけるゲームシナリオのモデル検査

http://www.ppll.jp/mt.pdf

FDRによるRPGシナリオの検証 https://docs.google.com/file/d/0B4r-xhiV8R5xd1QyaE8yOVBrNmc/edit?usp=sharing

Page 30: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

30

このりんぐ、われわれのうえに、 ひとり、かみがいる 菅野ひろゆき(1968-2011) 「この世の果てで恋を唄う少女YU-NO」に代表される複雑なシナリオ進行において先駆的

もし「複雑なシナリオ進行」の開発コストが低かったとしたら、もっとシナリオ進行で遊ばせるゲームが増えるのではないだろうか

モデル検査をその道具に使えないだろうか

アニメで表現できない面白さを

Page 31: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

31

ここまでよんでくれてありがとうね

Twitterで絡んでもらえば、いろいろお話します @mnagaku

今回のセッション、いろいろ反省した

「ゲームとモデル検査ワークショップ」をやる

ハンズオンで体験してもらう会

少人数で、 参加者各自が何がしかの納得を持って帰れる会

平日20時-22時、神保町を予定

そのうちTwitterで情報流します

Page 32: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

32

じょうほうけんってどんなとこ?

国立情報学研究所

http://www.nii.ac.jp/

講演者の所属する国立情報学研究所は、情報学という新しい学問分野での「未来価値創成」を目指すわが国唯一の学術総合研究所として、ネットワーク、ソフトウェア、コンテンツなどの情報関連分野の新しい理論・方法論から応用展開までの研究開発を総合的に推進しています。また、大学共同利用機関として、学術コミュニティ全体の研究・教育活動に不可欠な最先端学術情報基盤(サイバー・サイエンス・インフラストラクチャ:CSI)の構築を進めるとともに、全国の大学や研究機関はもとより民間企業やさまざまな社会活動との連携・協力を重視した運営を行っています。民間企業出身の研究者も在籍しており、民間企業との共同研究も多く行われています。

Page 33: 「モデル検査」のススメ (ゲームシナリオ進行編)

Copyright (C) 2013 National Institute of Informatics, All rights reserved.

33

とっぷえすいーってなあに?

トップエスイー

http://www.topse.jp/

講演者が国立情報学研究所GRACEセンターの一員として運営に参加しているソフトウェア工学の社会人向け教育プログラム「トップエスイー」は、ソフトウェアシステム構築の現場で強力なツール類を十分利用できる”スーパーアーキテクト”を育成するために創設されました。先端的な教材を基に、ソフトウェア産業における次世代リーダの育成を行っています。モデル検査などソフトウェアの設計を検証する技術も学ぶことができます。これまで7期189名の修了生を輩出しており、講演者も2期生として修了制作「FDRによるRPGシナリオの検証」で優秀賞を獲得しています。