形式手法でバグの少ない
モデリングができたらいいな

   2012/4/19 by TANAKA Daisuke
形式手法って?
• 計算機科学における数学を基盤としたソフト

ウェアおよびハードウェアシステムの仕様記
述、開発、検証の技術である。




  http://ja.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E6%89%8B%E6%B3%95
仕様記述?
identifier
      ::= "a..z,$,_" { "a..z,$,_,
0..9,unicode character over 00C0" }

 class_name
      ::=
      identifier
      | ( package_name "." identifier )


• バッカス・ナウア記法でJavaのクラス名の仕

 様を記述
検証?
モデル検査、自動定理証明…
モデル検査

• モデル検査(Model              Checking)とは、形式システムをア
ルゴリズム的に検証する手法である。ハードウェアや
ソフトウェアの設計から導出されたモデルが形式仕様
を満足するかどうか検証する。




 http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%87%E3%83%AB%E6%A4%9C%E6%9F%BB
自動定理証明

 • コンピュータプログラムによって数学的定理に対する

   証明を発見すること。
   →プログラムの正しさを保証したり、安全なプログラ
   ムを書くことができる。




http://ja.wikipedia.org/wiki/%E8%87%AA%E5%8B%95%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E
…( ゚Д゚)ポカーン
(ー_ー)...ZZZZZZ乙乙
まずはalloyで始めてみよう
alloyで何ができるの?
• ソフトウェア設計の仕様記述言語


• 統合アプリケーション


• 検証はもちろん、視覚化がすごい
数独
(充足可能性問題(SAT)
    NP困難)
数独
1つのブロックに1∼9
1つの行に1∼9
1つの列に1∼9
数独のルール=仕様
 を記述する
Numberの定義
                         集合論でいう直和

abstract sig Number { data: Number -> Number }
abstract sig Region1, Region2, Region3 extends
 Number {}

one sig N1, N2, N3 extends Region1 {}
one sig N4, N5, N6 extends Region2 {}
one sig N7, N8, N9 extends Region3 {}
3×3のブロック
      の定義                集合論でいう継承

abstract sig Number { data: Number -> Number }
abstract sig Region1, Region2, Region3 extends
 Number {}

one sig N1, N2, N3 extends Region1 {}
one sig N4, N5, N6 extends Region2 {}
one sig N7, N8, N9 extends Region3 {}
(R1,R1),(R1,R2),(R1,R3)
    実体の定義              (R2,R1),(R2,R2),(R2,R3)
                       (R3,R1),(R3,R2),(R3,R3)
abstract sig Number { data: Number -> Number }
abstract sig Region1, Region2, Region3 extends
 Number {}

one sig N1, N2, N3 extends Region1 {}
one sig N4, N5, N6 extends Region2 {}
one sig N7, N8, N9 extends Region3 {}


       Nは数字であり座標である
pred complete(rows: set Number,
cols: set Number) {
! Number in cols.(rows.data)
}

          指定された行or列に
        N1∼N9が1つずつ存在
pred rules() {
! all x, y: Number { lone y.(x.data) }     N1∼N9は1つずつ、か
                                          つN1∼N9のマップを保
                                                    持している
!   all row: Number { complete[row , Number]    }
!   all col: Number { complete[Number, col] }


!
!
    complete[Region1,
    complete[Region1,
                        Region1]
                        Region2]
                                   行・列に1∼9まで存在
!   complete[Region1,   Region3]
!   complete[Region2,   Region1]
!   complete[Region2,   Region2]
!
!
    complete[Region2,
    complete[Region3,
                        Region3]
                        Region1]
                                   9個のブロックはそれ
!   complete[Region3,   Region2]
!   complete[Region3,   Region3]   ぞれ1∼9が1つずつ存在
}
DEMO
┐(´-`)┌で?
参照カウント式GC


      from きしだのはてな

http://d.hatena.ne.jp/nowokay/20120106#1325874065
「参照されているかどうか」
でGCする仕様は問題ないか?
abstract sig メモリ{
                    参照しているメモリ(ルート)
    参照: set 割り当て    参照されているメモリ(割り当
}                       て)の定義

one sig ルート extends メモリ{
}

sig 割り当て extends メモリ{
}
fact{
  all a:割り当て | some m:メモリ |
    not a in a.参照 and
    a in m.参照
}

                 自己参照はなし
DEMO
視覚化するとこんな感じ
assert ルートからたどれる{
    no a:割り当て |
     not a in ルート.^参照
}

check ルートからたどれる

          全ての割り当てメモリがルー
           トからたどれるかチェック
DEMO
視覚化するとこんな感じ
「参照されているかどうか」で
はGCできないメモリがあった
おさらい
仕様を記述した
初期値を入力し、
仕様を満たすか確認した
さらに仕様を満たす OR 満た
さない組み合わせを調べた
(参考)中身が気になる人向け
• 実世界の問題(だいたいは論理命題に変換する)を扱う

 場合、考えられる全ての状態を確認するモデル検査
 は、得てして状態組み合わせ爆発を起こすことが多い

• しかし記号的アルゴリズムを使用して、暗黙的にグラ

 フ化し解くことが可能

• alloyには強力なSAT   Solverが実装されている
形式手法って
使われているの?
Coq


• 自動定理証明のための言語


• 関数指向言語のような、副作用のない言語と仲がよい


• 某SIerで研究・検討されている
CSP


• 仕様記述言語


• NASAなどでも研究されている。実際に“普通のソフト

ウェアテスト”では見つからないバグを発見している
まとめ
仕様を記述する
UTをやる前に、その仕様が正
  しいかを検証する
でも集合理論、論理命題、圏
論のような抽象的指向は難し
     そう
alloy、無料です


  http://alloy.mit.edu/alloy/
以上、ご清聴
ありがとうございました

形式手法とalloyの紹介