Implementing CCS in Maude2

やっぱりπ計算の前にCCSだよねーということで Implementing CCS in Maude2 (著者による.ps) を軽く読んだ。
ラベル付き遷移を書き換えでやるのは案外面倒らしく、せっかくの | や + がfrozenになってしまっている(前回のπ計算ではラベル無しのreduction(τ遷移に相当)だったので問題なかった)。 まあ 別に規則を書けば済む話なんですが。 あとsubsortって案外きもちわるい subsort Process < ActProcess のあたりが特に。 Hennessy-Milner logic の実装もある。ここで 演算子 [a]F で必要な 「aで遷移する先の全てのプロセス」という探索が普通のMaudeのsearch(書き換えの候補を最初の一つだけ提示) ではできないので、リフレクション(みたいなもの)な探索 metaSearchを使って遷移先を全て列挙するということをやっている。こういうメタなこともできるのがMaude

動かしてみる

http://maude.cs.uiuc.edu/maude1/casestudies/ccs/ より、論文で使われている maudeのソースが得られる。
そのままだと MachineInt が解決できないと言われたので protecting RENAMED-INT でインポートした。
MachineInt は Nat で代用できたのでそのように書き換えた。

diff
-  var N : MachineInt .
+  var N : Nat .
:
-  op allOneStep : Term MachineInt Term -> TermSet .
+  op allOneStep : Term Nat Term -> TermSet .
:
-  var N : MachineInt .
+  var N : Nat .

あとMODAL-LOGICモジュールはうまく読み込めなかったので省いた。 (追記) MachineIntをNatにしたら読み込めた。

実行

手元のmaude (Darwin) では 一緒に付いてくる machine-int.maude を引数に指定したらいけた。 標準では読み込まれないものなのか? Darwin版だから? Maude1.0 にしかない?

$ maudeccs2.maude
:
:
Maude> rew 'Proc .
rewrite in EXAMPLE : 'Proc .

rewrites: 64 in 0ms cpu (382ms real) (89887 rewrites/second)
result ActProcess: {'a}'b . 'Proc
Maude> 

ふむ 'a.'b.'Proc が ラベル 'a で プロセス 'b.'Proc に遷移していることが確認できる。

またこんど 以前定義した abort を実装する。眠いのでここまで。