Spin Model Checker を使用して、2 つのオブジェクト (A と B) 間のゲームをモデルチェックしようとしています。オブジェクトはボード上を移動し、各位置はその (x,y) 座標によって定義されます。2 つのオブジェクトは衝突しないはずです。init、A Model、B Model の 3 つのプロセスがあります。私は ltl プロパティをチェックするモデルです: (2 つのオブジェクトが同じ場所を占有するかどうかをチェックする liveness プロパティ)
ltl prop1 { [] (!(x_a == x_b) && !(y_a == y_b)) }
私が得るエラートレイルは次のとおりです: init -> A Model -> B Model -> init
ただし、表示されているデータに基づいてエラー トレイル (反例) を取得する必要はありません: x_a=2、x_b=1、y_a=1、y_b=1。
また、最初の init は init プロセスのすべての行を通過しますが、2 番目の init はその最後の行までしか表示されません。
また、私の A モデルと B モデルは、以下に示すように、「do」ブロック内のガードとアクションのみで構成されています。ただし、それらはより複雑で、'->' の右側に if ブロックがあります。
active proctype AModel(){
do
:: someValue == 1 -> go North
:: someValue == 2 -> go South
:: someValue == 3 -> go East
:: someValue == 4 -> go West
:: else -> skip;
od
}
アトミックブロックに何かを入れる必要はありますか? 私が質問している理由は、エラー トレイルが示している行が 'do' ブロックにも入っておらず、2 つのモデルの最初の行に過ぎないからです。
編集: LTL プロパティが間違っていました。私はそれを次のように変更しました:
ltl prop1 { [] (!((x_a == x_b) && (y_a == y_b))) }
しかし、私はまだまったく同じエラートレイルを取得しています。