Оба контрпримеры фальсифицируют свойство в самом первом состоянии трассировки выполнения, так что то, что происходит дальше, не очень важно.
Из документов nuXmv
:
4,7 Следы
Трассировка состоит из начального состояния, за которым может следовать
последовательность пар состояний-входов, соответствующая возможному выполнению
модели. Помимо начального состояния каждая пара содержит
входы, которые вызвали переход в новое состояние, и новое состояние
сам. Исходное состояние не имеет таких входных значений, определенных как
не зависит от значений любого из входов. [...]
Таким образом, трасса обычно имеет следующую структуру:
S_0 | I_0 -> S_1 | I_1 -> S_2 | ... | I_{N-1} -> S_N
Идея состоит в том, что состояние S_{k+1}
получается путем применения входных данных I_k
к состоянию S_k
.
Можно попробовать использовать команды goto_state
и print_current_state
, чтобы перейти к контрпримеру и напечатать содержимое каждого состояния. В качестве альтернативы можно вспомнить, что NuSMV
и nuXmv
выводят только изменяемые переменные из одного состояния в другое, поэтому трассировка выполнения должна выглядеть следующим образом:
-> State: 1.1 <-
v3 = 0
-> Input: 1.2 <-
v1 = 7
v2 = 3
-- Loop starts here
-> State: 1.2 <-
v3 = 10
-> Input: 1.3 <-
v1 = 7
v2 = 3
-- Loop starts here
-> State: 1.3 <-
v3 = 10
-> Input: 1.4 <-
v1 = 7
v2 = 3
-- Loop starts here
-> State: 1.4 <-
v3 = 10
-> Input: 1.5 <-
v1 = 7
v2 = 3
-> State: 1.5 <-
v3 = 10
Так что, в основном, после первого перехода мы навсегда останемся в одном и том же состоянии с неизменными входами и выходами.
Возможно, вы захотите связаться со списком рассылки NuSMV
или nuXmv
и сообщить об этой проблеме в программе вывода.