TLA+入門1: TickTack
概要
このページでは最初の TLA+ の例として、システム状態に 0 と 1 を交互にとる TickTack システムについて考える。
Table of Contents
TickTack の抽象化
TLA+ による仕様の構築は経験的に以下のような手順で行うと良い。
- 目的のシステムに必要な振る舞いを定義する。
- 振る舞いが機能するために必要な状態変数を定義する。
- 全ての振る舞いを初期状態 (Init) と次の状態 (Next) で記述する。
- 振る舞いが正しいことをチェックするアサーションを作成する。
まず最初に、この TickTack システムの要件は以下の一つの振る舞いで表すことができる。
システムは 0 と 1 の状態を交互にとる。
この振る舞いを表すためには 0 か 1 かどちらかの値をとる単一の状態変数があれば十分であろう。この状態変数を
TLA+ ではあるステップの状態変数を
さて、ここまで定義できればこの TickTack システムを UML の状態遷移図で表すことも容易であろう。なお、この TickTack システムは宇宙における時間という概念が有効な限り停止することはない。
基本的な TLA+ の記述
式 (
この仕様を TLA+ で表現すると以下のような記述となる。順番に説明しよう。
---- MODULE TickTack ----
VARIABLES t
Init == t \in {0, 1}
tick == t = 0 /\ t' = 1
tack == t = 1 /\ t' = 0
Next == tick \/ tack
====
INIT Init
NEXT Next
TickTack.cfg の内容。TLA+ にはモジュールという大きな単位があり、1 行目と 7 行目のように ---- MODULE モジュール名 ---- で始まり ==== で終了する。またモジュール中の ---- は可読性のための罫線として使用することができる。これらは 4 文字以上連続する - または = であれば良い。
2 行目の VARIABLES は変数宣言でシステムで使用する状態変数を定義している (最後の S は省略可能で VARIABLE でも良い)。ここでは 0 または 1 のシステム状態を保持するために一つの変数
3 行目の Init はシステムの取りうる初期状態
4-6 行目はシステムが次に取りうる状態を表す Next と、その部品となる tick および tack を定義している。TLA+ では /\ が論理積 \/ が論理和
t' は次のステップで tick は
システムの "取りうる初期状態" と "次に取りうる状態" の定義がモデルファイル TickTack.cfg の INIT と NEXT で指定できる。したがって Init と Next には任意の定義名をつけることができる。
またこの例では使用していないが TLA+ の記述では (* block comment *) と \* line comment 形式のコメントを使用することができる。
TLC 検証結果
Fig 2 に示す仕様記述を検証すると (実行方法は TLC 検証参照) Fig 3 のような結果となり状態モデルに矛盾がないこと、つまり式 (
以上、TLA+ により TickTack システムの仕様は以下の 2 点に明文化されるステートマシンとして表現できることが確認できた。
- システムの初期状態は
である。 - 全てのステップで状態は
である。
ここでカンのいい人は仕様に停止条件がないのになぜ TLC 検証が停止したかが気になったかもしれない。その話題については TLC 検査の特徴を参照。
エラーの検出
ではここで未定義の状態を生成するように修正を加えて TLC がどのように振る舞うかを見てみよう。Fig 4 は
このエラートレースは「初期状態 tack を通過したあとに

