TLA+入門2: 独立した 2 変数のシステム
概要
このページでは TLA+ の例として時相論理演算子を扱う。
Table of Contents
:
前述の TickTack システムは単一の変数だけだったため単純に状態変化をステップとみなすことができた。しかし 2 つ以上の独立した状態変数で構成されるシステムではある値が変化したときに別の値が変化しているとは限らない。このようなシステムでは特定の状態変数に対して変化しないステップを仕様として許可する必要がある (このような状態変数が変化しないステップをスタッターステップ (stuttering step) と呼ぶ)。
TickTack システムを少し拡張して時刻のみを表示する時計について考える (これは Specifying Systems [1] の最初の例と同じ)。時刻
演算子 (temporal logic operator) の Globally を導入し、
時計が独立した単独のシステムであればこの仕様の記述は適切である。ただし時計がシステムの一部で、例えば気温と同時に表示されるようなケースでは、時刻を表す
時間である
例: 逐次処理
The TLA+ Video Course で例示しているプログラムを使用して説明する。以下のようなプログラムは:
int i = 0;
void main(){
i = someNumber(); // pc = "start"
i += 1; // pc = "middle"
}
仕様化された数式および TLA+ として以下のように表現することができる。これは元のプログラムとよく似ているが、プログラムが実行を表しているのに対して、仕様化された数式および TLA+ はステートマシンの状態が仕様に準拠しているか否かの true/false のみを表していることに注意。ここで各ステップは TLA+ の慣習として変数 pc を用いて識別している。
Init == (pc = "start") /\ (i = 0)
Next == \/ /\ pc = "start"
/\ i' \in 0..1000
/\ pc' = "middle"
\/ /\ pc = "middle"
/\ i' = i + 1
/\ pc' = "done"
変数 x は x' は x' として表されている変数は次のステップでは x として現れる)。
AND, OR はそれぞれ数学記号 /\ と \/ で表す。これらは従来の数式のように二項演算子として表記する以外にリストのように書くこともできる。
集合と包含 x \in 0..100 のように表す。
ステートマシンに基づく TLA+ の記述は UML の状態遷移図と親和性が良い。状態遷移図としては Fig 1 のように表すことができる。
TLA+ で逐次処理を記述するとき 1) 実行中の位置を保持する状態変数を導入し (変数名は慣習的に pc とする)、2) 各ステップごとに状態チェックを定義し、3) 最終的に仕様は