NuSMVを初めて使い、この簡単なターンベースのゲームをモデル化しようとしています。パイルには10個のレンガがあり、各プレイヤーは1回転につき1〜3個のレンガを取ることができます。最後のレンガを取る人はゲームに勝ちます。プレーヤーAが最初に行くと仮定し、ここで私の試みです。 「最終的に勝者がある」と表現したいが、コードが機能しないのは、brick = 0の後にプレーヤーがレンガを取るのを妨げないため、最終的にプレーヤーaとbが両方とも勝者になるということです。 |私のポイントを説明するために、ここでNuSMVモデルチェック:シンプルなゲームモデルを作成
MODULE main
VAR
bricks : 0..10;
i : 1..3;
j : 1..3;
turn : boolean;
winner : {none, a, b};
ASSIGN
init(winner) := none;
init(bricks) := 10;
init(turn) := TRUE;
next(turn) := case
turn : FALSE;
!turn: TRUE;
esac;
next(bricks) :=
case
bricks - j >= 0 : bricks - j;
bricks - j < 0 : 0;
TRUE:bricks;
esac;
next(winner) := case
turn=TRUE & bricks = 0: a;
turn=FALSE & bricks = 0: b;
TRUE:winner;
esac;
SPEC AF (winner = a | winner = b)
とSPEC AF(勝者=なし勝者=)の私の出力は次のとおりです。
は、ここに私のコードです。
i = 1
j = 1
turn = TRUE
winner = none
State: 1.2 <-
bricks = 9
j = 3
turn = FALSE
State: 1.3 <-
bricks = 6
turn = TRUE
State: 1.4 <-
bricks = 3
turn = FALSE
State: 1.5 <-
bricks = 0
j = 1
turn = TRUE
State: 1.6 <-
turn = FALSE
winner = a
State: 1.7 <-
turn = TRUE
winner = b
あなたが見ることができるように、モデルは依然としてプレーヤーbが既に勝った後にゲームに勝つ反例を提供します。