Chapter 2 実習

こんな簡単な例でも、読んだだけでは「ふーん、そう」という感じで、いまいちわかってない。問題は、この本をずっと読み進めていっても、いつまでたっても実際の使い方にたどり着かないことだ。(PlusCALのマニュアルはその点、少しだけ親切。それをもとにPlusCALを試してみよう - みょらみょらPython日記は書かれた。)

そこで、Chapter 3に進む前に、実際にToolboxを動かしてみることにする。

インストール

Index of /tlatoolbox/productsから、Mac版をダウンロードして、インストールの際に「古いJavaが必要です」とか言われるので言われるがままにインストールして、解凍したフォルダを適当なところにおき、toolboxを起動する。下にプログレスバーみたいなのが出てきて、起動中かとおもいきや、ただのメモリメーターみたいなので気にしなくていい。

Specの作成

File -> Open Spec -> Add new spec で、新たなプロジェクトを作成する。ファイル名を聞かれるので、<適当なディレクトリ>/<モジュール名>.tla と入力すると、モジュール名でテンプレートが作られ、エディタが開かれる。

よくわからなくてtla_trialっていれたら、それがモジュール名になってしまった。

----------------------------- MODULE tla_trial -----------------------------
EXTENDS Naturals
VARIABLE hr
HCini == hr \in (1 .. 12)
HCnxt == hr' = IF hr # 12 THEN hr + 1 ELSE 1
HC == HCini /\ [][HCnxt]_hr
--------------------------
THEOREM HC => []HCini
=============================================================================

で、保存。

実行

TLC Model Checker -> Run Model って押しても、反応がない。ただの屍のようだ。
実行するにはモデルを作成する必要がある。

TLC Model Checker -> New Model で作成。

Model Overviewのタブを見る。作った瞬間からエラーが表示されている。が、なんのエラーかは表示されない。MSRさん厳しい。。結論から言うと、What is the behavior spec? は、「Temporal formula」を選び、箱に HC と入力する。これによって、「俺はHCのチェックをしたいんだよ」となる。

ようやくRun Modelで実行することができる。ふむ。24の状態があって、重複を除くと12種類あるよ、と。どうやら成功のようだ。

ここからが大変

では、エラーチェックをどうやって見つけるのかを見てみたいとする。ためしに、HCiniを以下のように変えてみた。

HCini == hr \in (1 .. 13)

で、実行!

あれ?止まらない。hr' = hr + 1で、ずーっとhrを増やし続けている模様。
期待値としては、hrが14担った時点でTHEOREMの行と矛盾するので、エラーで止まって欲しいんだけれど、そんなに親切ではないらしい。

それより、THEOREMがどう動いているのかがわからない。ためしにHCiniは戻して、THEOREMの行を消してもチェックは完了する。

What to check?

Model Overviewで、What to check?でデフォルトではDeadlockにチェックが入っているのみ。なにもチェックしてない?
Invariantsに hr # 20 とかいれておくと、止まるようになる。(初期値が13の時に20になるよ、と教えてくれる。)でも、それってただの手動assertではなかろうか。


その他、いろいろ試行錯誤をしてみたが、だいたいエラーになる。まだまだ謎が多い。もう少し読み進めばわかるようになるのか?