翻訳: A PlusCal User's Manual
- *このマニュアルには C-Syntax 版もある。2つの構文の詳細については 3 ページ参照。
Table of Contents
- Preface
- 2 つの構文
- 1 Introduction
- 2 Getting Started
- 3 The Language
- 4 Checking and Algorithm
- 5 TLA+ Expressions and Definitions
- References
- A The Grammar
- B The TLA+ Translation
- C Translator Options
- Useful Tables
- Index
- 翻訳抄
Preface
2 つの構文
PlusCal には p-構文と c-構文の 2 つの構文がある。以下は 2 つの構文で書かれたコードのスニペットである:
while x > 0 do
if y > 0 then y := y-1;
x := x-1;
else x := x-2
end if
end while;
print y;
while (x > 0)
{ if (y > 0) { y := y-1;
x := x-1 }
else x := x-2 } ;
print y;
p-構文は語数が多いためコードの意味がより明確に形、また "
このマニュアルでは p-構文バージョンについて説明する。c-構文バージョンのマニュアルは TLA+ ツールの Web サイトから入手できる。
1 Introduction
2 Getting Started
2.1 Typing the Algorithm
2.2 The TLA+ Module
2.3 Translating and Executing the Algorithm
2.4 Checking the Results
2.5 停止の確認
アルゴリズム EuclidAlg が常に停止 (終了) することを確認するには -termination オプションを付けて変換を実行する。またはファイルのコメントまたはモジュールの前後に
PlusCal options (-termination)
の行を配置することでも行える (options ステートメントに入れるときはオプション名から "-" を省略できる)。これにより停止を保証する適切な変換が生成される。次に新しいモデルを生成すると Model Overview ページの What to check? セクションの Properties 部分に Termination が追加されるだろう。これにより TLC は取りうるすべての実行が停止することを確認する (Termination プロパティはすべての PlusCal アルゴリズムのツールボックスに含まれているが、そのボックスはモデル作成時にルートモジュールに Termination プロパティが指定されている場合にのみ確認される)。
TLC が非停止実行 (non-terminating execution) を検出すると、プロパティ Termination に違反していることを示すエラーメッセージが生成され、ツールボックスのエラートレースウィンドウに非停止のトレースが表示される。36 ページのセクション 4.4 ではこのトレースの解釈方法について説明している。
2.6 A Multiprocess Algorithm
| 1. | |
|
| 2. | |
|
| 3. | |
|
| 4. | |
|
| 5. | |
|
| 6. | |
|
| 7. | |
|
| 8. | |
|
| 9. | |
|
| 10. | |
|
| 11. | |
|
| 12. | |
|
| 13. | |
|
| 14. | |
|
| 15. | |
|
| 16. | |
|
2.7 Where Labels Must and Can't Go
3 The Language
3.1 Expressions
3.2 The Statements
3.2.1 Assignment
3.2.2 If
3.2.3 Either
3.2.4 While
3.2.5 Await (When)
3.2.6 With
一般に
ステートメント。 同じ変数に値を代入する 2 つの別々の代入文。(単一の多重代入は同じ変数の異なる構成要素に値を代入することができる。)
に続くステートメント、または に続く 以外のステートメント。
3.2.7 Skip
3.2.8 Print
3.2.9 Assert
3.2.10 Call と Return
3.2.11 Goto
3.3 プロセス
マルチプロセスアルゴリズムは 1 つ以上のプロセスを含んでいる。プロセスは 2 つの方法のいずれかで開始する:
最初の形式はプロセス集合を開始し、2 つ目はプロセスを個別に開始する。識別子
上記ページ 12 のセクション 2.6 で説明したように
マルチプロセスアルゴリズムは、任意のプロセスの選択を繰り返し、そのステップの実行が可能であればそのプロセスの 1 ステップを実行することによって進行する。プロセスが終了しており、次のステップに条件式が偽となる
3.4 プロシジャ
アルゴリズムは 1 つ以上のプロシジャを持つことがある。その場合、アルゴリズムは
アルゴリズムのプロシジャは、グローバル変数宣言と (必要であれば)
任意の変数宣言の後にはプロシジャの本体が続く。これは "
プロシジャ
マルチプロセスアルゴリズムにおいてプロシジャ本体の識別子
プロセス集合内のプロセスから
どのような制御パスにおいても
3.5 マクロ
マクロはその呼び出しが翻訳時に展開されることを除けばプロシジャに似ている。マクロは、それが呼び出されたステップ内で実行されるプロシジャと見なすことができる。
マクロの宣言はプロシジャ宣言とよく似ている。例えば:
macro P(s, i) begin await s ≧ i;
s := s - 1;
end macro;
違いはマクロ本体にはラベルや
マクロ呼び出しは
await sem ≧ (y + 17);
sem := sem - (y + 17);
マクロ呼び出しを翻訳するとき、置換は構文的なものであり、マクロ定義内のパラメータ以外の記号は呼び出しのコンテキストで持っている意味となる。例えばマクロ定義の本体にシンボル
マクロをその定義で置き換えるとき、翻訳はマクロ本体内の式のマクロパラメータ
3.6 定義
アルゴリズム式は "
| 1. | |
|
| 2. | |
|
| 3. | |
|
| 4. | |
|
| 5. | |
|
| 6. | |
|
(記号 "
定義は、
3.7 Labels
3.8 The Translation's Definitions and Declarations
4 Checking and Algorithm
4.1 Running the Translator
4.2 Specifying the Constants
4.3 Constants
4.4 Understanding TLC's Output
4.5 不変性チェック
セクション 2 の例では TLC を使って数式の不変性をチェックする方法 - つまりアルゴリズムが到達可能なすべての状態で式が true となることを説明している。不変性の重要な例は型の正確さである。通常の型付きプログラミング言語では型の正確さは構文上の条件である。PlusCal は型がないため、型の正確さはアルゴリズムの特性であり、各変数の値が適切な集合の要素であることをアサートする。例えば我々は p の値が常に素数である場合に限り、つまり次の式が不変である場合に限り変数 p が素数型を持つという。ここで
アルゴリズムが型と一致しているためには、その変数の初期値が正しい "型" である必要がある。変数に初期値が設定されていない場合、そのデフォルトの初期値は defaultInitValue という名の不定型の定数である。デフォルトでツールボックスのモデルはこれをモデル値として設定する (35 ページ参照)。defaultInitValue が不定型であるため、これは変数に対する型一致値ではない。したがってアルゴリズムは変数が正しく初期化されないと型が正しくないことになる。型をチェックしたくなる変数の中にはプロシジャパラメータがある。アルゴリズムでは以下の例のようにプロシジャの形式パラメータに初期値を割り当てることができる:
procedure Foo (p1 = 0, p2 = {"a", "b"})
プロシジャ変数の宣言と同様に、形式パラメータ
プロシジャの形式パラメータはプロシジャが呼び出されたときに対応する引数と同じ値に設定されるため、その初期値は実行には影響を与えない。これらの初期値は TLA+ 仕様の対応する変数が常に正しい型の値を持つことを保証するためだけに使用される。
4.6 終了, Liveness, 公平性
セクション 2.5 では単一プロセスアルゴリズムの終了をチェックする方法を紹介した。終了は liveness 特性と呼ばれる一般的な特性の特殊ケースであり、最終的に何かが起こることを保証している。我々は TLC を使ってより一般的にアルゴリズムの liveness 特性をチェックすることができる。
アルゴリズムはいくつかの仮定 - 通常はアクションの公平性仮定 (fairness assumptions of action) - のもとでのみ liveness 特性を満たす。PlusCal アルゴリズムではラベルごとに対応するアクションが存在する。そのアクションの実行とは、そのラベルから次のラベルまでのすべてのコードの実行で構成される。アクションは実行可能である場合にのみ有効化 (enabled) される。プロセス内の以下のコードについて考える:
a: y := 42;
z := y + 1;
b: await x > self;
x := x-1;
c: ...
アクション
制御がそのラベルにある場合にのみ有効化される
ノンブロッキングアクションに対する公平性は、プロセスがそのアクションで停止できないことを意味している。したがって
ブロッキングアクションに対する公平性の条件には 2 種類がある。アクション
ノンブロッキングアクションの場合、弱い公平性と強い公平性は同等であるため公平性は 1 種類しかない。
ただの process ではなく fair process と書くことで、そのプロセスのすべてのアクションがデフォルトで弱い公平性であることを保証する。プロセスのアクションのデフォルトの公平性条件は、ラベルの後に + または - を追加することで変更できる。a:+ と書くことでアクション a:- と書くことで
fair+ process とプロセスを書くことで、そのプロセスのすべてのアクションがデフォルトで強い公平性であることを保証する。プロセスのラベルの後に - を追加することでアクションが公平性条件を満たさないことを保証する。fair+ プロセスでラベルの後に + を付けても効果はない。
fair または fair+ ではないプロセスは不公平プロセス (unfair process) と呼ばれ、そのアクションではなんの公平性仮定も持たない。そのようなプロセスのラベルの後に + や - を付けても効果はない。
以下の翻訳オプションは公平性の仮定に影響する。
-wf- 任意の不公平プロセス (前に
fairまたはfair+が付かないもの) をfairプロセスとする。 -sf- 任意の不公平プロセス (前に
fairまたはfair+が付かないもの) をfair+プロセスとする。 -nof- すべてのプロセスを不公平プロセスとする。
アルゴリズムの個々のアクションの公平性に加えてアルゴリズム全体の公平性も存在する。この特性はプロセスが少なくとも 1 つの有効化されたアクションを持つならアルゴリズムは停止できないことを保証する。この特性はアルゴリズムを --fair algorithm で開始するか、または -wfNext 翻訳オプションによって保証される。
単一プロセスまたは逐次アルゴリズムの場合、--fair algorithm で開始したり -wfNext, -wf または -sf オプションを使用することは同等である (他のプロセスがなければ、有効化されていないアクション { の前に fair (または fair+) を書くkとによって指定することもできる。ラベルの後に + や - を付けても逐次アルゴリズムでは効果がない。
11 ページのセクション 2.5 で論議した -termination オプションは、上述の公平性オプションがどれも指定されていない場合、事実上 -wf を追加することになる。
アルゴリズムが満たすべき liveness プロパティは、公平性と liveness を表すために使われる TLA+ 時相演算子を使った時相式として記述することができる。これについては 51 ページのセクション 5.10 で詳述する。時相特性は繊細で理解が難しいかもしれない。TLA+ 本のチャプター 8 はこれらの特性をより詳しく説明している。ここでは、非常に便利なある一つの演算子 ~>、発音 Leads to についてのみ説明する。
式 process の前にキーワード fair を追加する。我々はプロセスが非クリティカルセクションの中に永遠にとどまることを許している。そのためラベル ncs: と cs: の後に - を追加する。
このアルゴリズムが満たしている liveness 条件とは、あるプロセスがそのクリティカルセクションに入ろうとしているとき、あるプロセス (必ずしも同じプロセスではない) がそのクリティカルセクションに入っているか、または最終的に入るというものである。
ここで説明した言語構造と変換オプションにより、必要と考えられるアルゴリズムの公平性に関する仮定を全て表現することができるようになる。もしも他の種類の公平性仮定が必要となった場合は 51 ページのセクション 5.10 で説明している TLA+ 時相演算子を使用して自分で書くことができる。
liveness チェック (終了を含む) は不変性チェックよりも遅く、TLC は不変性チェックのような大きなモデルで liveness をチェックすることができない。
4.7 Additional TLC Features
4.7.1 Deadlock Checking
4.7.2 Multithreading
4.7.3 Symmetry
5 TLA+ Expressions and Definitions
5.1 Numbers
5.2 Strings
5.3 Boolean Operators
5.4 Sets
5.5 Functions
5.6 Records
5.7 The Except Construct
5.8 Tuples and Sequences
5.9 Miscellaneous Constructs
5.10 Temporal Operators
5.10.1 Fairness
5.10.2 Liveness
5.10.3 One Algorithm Implementing Another
TLA+ Definitions
References
A The Grammar
B The TLA+ Translation
C Translator Options
Useful Tables
Index
(省略)