TLA+ / PlusCal
Leslie Lamport による形式仕様記述言語。並行・分散システムの設計を時相論理で記述し、モデル検査器で網羅的に状態空間を探索して不変条件・活性を検証する。Hillel Wayne 『実践TLA+』を通して学習した。
モデル検査の基本
Init/アクションの全状態に対して不変条件(例:NoOverdrafts残高が負にならない)が保たれるかを網羅検証する。- ラベルが原子性の粒度を決め、ラベル内処理は1ステップ(アクション)で実行される。pc(プログラムカウンタ)が現在のラベルを指す。
- 並行プロセスは reader-writer パターンなどで記述し、
awaitで条件成立を待ち、either/withで非決定性を表現する。デッドロックも検出できる。
時相特性(活性)
[]P(常に)、<>P(最終的に)、P ~> Q(P が成り立てばいずれ Q)、<>[]P(最終的には常に)。- 公平性:
fair(弱い公平性)/fair+(強い公平性)を付けないとスタッタリング(何もしない)で停止性が破れる。Dekker のアルゴリズムでライブロックを観察する例も。
PlusCal の道具立て
- 集合内包(filter/map)、タプル
<<...>>、構造体[a |-> 1]、関数[x \in S |-> expr]、CHOOSE(宣言的に連立方程式や最大値を解く)、LET-IN、プロシージャ。 - 状態機械、ゴーストデータ、TypeInvariant パターンで図書館システムや MapReduce、Two-Phase Commit をモデル化する。
定理証明系 とは異なり「網羅的テスト」に近い立ち位置で、設計の曖昧さを早期に炙り出す。関連: distributed-consensus-raft / database-transaction-theory / _moc-book-notes