Quintとは?
Quint は、システムの「仕様」を実行可能なコードとして書き、バグがないかを自動検証してくれるツールです。 プログラムのバグを見つける方法といえば「テスト」が一般的ですが、テストは「思いついたケースしか確認できない」という限界があります。 Quintは「どんな状況でもこのルールが破れないか?」を自動で大量にシミュレーションしてくれます。インストール
Node.jsが入っていればnpmで一発です。npm install -g @informalsystems/quint
やってみた:銀行の送金システム
銀行でアリスとボブがお金を送り合うシステムを考えます。 「どんな送金を繰り返しても、お金の総量(200円)は変わらないはず」 これをQuintで書くとこうなります:module bank { var alice: int var bob: intaction init = all { alice' = 100, bob' = 100 }
action aliceToBob = all { alice >= 10, alice' = alice - 10, bob' = bob + 10 }
action bobToAlice = all { bob >= 10, bob' = bob - 10, alice' = alice + 10 }
action step = any { aliceToBob, bobToAlice }
// 不変条件:お金の総量は常に200円 val totalIsConserved = alice + bob == 200 }
バグを仕込んで検出させる
bob' = bob + 10 を bob' = bob + 20(10円送ったのに20円増える)に変えてみます。
quint run bank.qnt --invariant=totalIsConserved
結果:
1回の送金で即バグ検出。 合計が200円→210円に増えていることを見つけてくれました。 バグを直して再実行すると、何万回試しても[State 0] { alice: 100, bob: 100 } [State 1] { alice: 90, bob: 120 }[violation] Found an issue
[ok] No violation found になります。
