C Manual (PlusCAL) つづき。3章。

Cマニュアル、意外によみやすいのでこのまま続けて読むことにした。

3は言語仕様。

3.2.1 Assignment

:= はわかる。けど、-> と |-> の違いがいまいちわかってない。S->Tは写像(集合と集合のマッピング)と理解できそうだけど、それだけだとしっくりこない使い方もされている。

はPlusCALの特殊表記。同じ変数への複数の代入をアトミックに行うときに使う。主に arrayなどに使うことになりそう。

3.2.2 If

If (test) hogehoge else boroboro

TLA+の場合は IF THEN ELSEだったと思うので、ちょっと違う。

3.2.3 Either

etiher A
or B
or C

と使う。TLC(TLAのモデルチェッカー)にどれか選ばせる(というか全通り組み合わせを調べさせる)ための分岐。
なので、switch文とは違う。

3.2.4 While

label_1: while (test) body

まあ、普通だ。なんでわざわざlabel_1: とラベルがついてるかというと、while文にはかならずラベルがつくという鉄の掟があるから。もちろん、translatorが必要に応じてつけてくれるんだけど、鉄の掟を忘れぬようにとのLamport先生がおっしゃっております。

3.2.5 Await (When)

条件がTrueになったときだけ実行される。主にマルチプロセッシングのblockingを表現するのに使う。同じラベルの中であれば、どこにあろうとその条件を満たさなければそのラベルは実行されない。

3.2.6 With

with (id \in S) body

Sが空じゃない時は、idはSからランダムに選ばれる。これまたTLCに分岐させるために使われるってことだな。
Sが空の時は待つ。つまりblock。

3.2.7 Skip

なにもしない。

3.2.8 Print

何かを表示。モデルチェック的には何の影響もないのでskipと同じ。

3.2.9 Assert

TLCモジュールが必要。 モデルチェック的にはなんの影響もないが、assertがFalseになればそこでエラーとなる。

3.2.11 Goto

どこかのラベルに飛ぶ

3.3 Process

process (ProcName \in IdSet) と複数プロセスを定義するか、process (ProcName = Id) と一つのプロセスを定義するか。
宣言の次に local variableを持つことができて、その後に bodyがくる。

3.4~3.6 Procedure, Macro, Definition

Procedureはさっき飛ばした3.10のcall, returnを使う。正直、この後の Macro, Definitionと合わせて理解が充分でない。今後復習したい。

3.7 Label

何度も出ているラベル。いつものラベルを置けるところ、置かないといけないところのルール。