maude続き
最近研究活動が滞っている。活を入れねば。
ところでMaudeでは、LTLの検査モジュールが同梱されており、
これをつかってモデル検査をすることができる。
以下はTurorialの写経。
最初に検査したい本体(tutorial例題ではMUTEX)の動作を定義します。
load model-checker.maude mod MUTEX is sorts Name Mode Proc Token Conf . subsorts Token Proc < Conf . op none : -> Conf [ctor] . op __ : Conf Conf -> Conf [ctor assoc comm id: none] . ops a b : -> Name [ctor] . ops wait critical : -> Mode [ctor] . op [_,_] : Name Mode -> Proc [ctor] . ops * $ : -> Token [ctor] . rl [a-enter] : $ [a, wait] => [a, critical] . rl [b-enter] : * [b, wait] => [b, critical] . rl [a-exit] : [a, critical] => [a, wait] * . rl [b-exit] : [b, critical] => [b, wait] $ . endm
つぎに、この本体に対するpredicateを定義します
ここではcritical,waitという述語の意味を定義します。
SATISFACTIONというのはmodel-checker.maudeの中にあります。
mod MUTEX-PREDS is protecting MUTEX . including SATISFACTION . subsort Conf < State . op crit : Name -> Prop . op wait : Name -> Prop . var N : Name . var C : Conf . var P : Prop . eq [N, critical] C |= crit(N) = true . eq [N, wait] C |= wait(N) = true . eq C |= P = false [owise] . endm
よいよモデル検査部の作成。初期状態を定義します。
mod MUTEX-CHECK is protecting MUTEX-PREDS . including MODEL-CHECKER . including LTL-SIMPLIFIER . ops initial1 initial2 : -> Conf . eq initial1 = $ [a, wait] [b, wait] . eq initial2 = * [a, wait] [b, wait] . endm
そこでa,bともにクリティカルセクション(crit)に入らない
ことを検査します。
Maude> red modelCheck(initial1, [] ~(crit(a) /\ crit(b))) . reduce in MUTEX-CHECK : modelCheck(initial1, []~ (crit(a) /\ crit(b))) . rewrites: 22 in 10ms cpu (434ms real) (2200 rewrites/second) result Bool: true