Но я поражен, что NuSMV не может понять, что этот тупик со временем будет разрешен
Я не уверен, что эта ситуация соответствует определению "тупика" . В любом случае, NuSMV
правильно указывает, что существует выполнение, в котором программа никогда не достигнет состояния S70
.
Контрпримером для проблемы достижимости (в правильной модели без тупиковых состояний) всегда является бесконечный след выполнения . Контрпример, который вы получите:
S1->S2->S3->S2
состоит из двух частей:
- a prefix part: последовательность состояний, начиная с начального состояния, которое достигает части бесконечного цикла . В данном случае это просто
S1
.
- a loop part: самоподходящая последовательность состояний, которую легко идентифицировать, поскольку она заканчивается в том же состоянии, в котором она запускается. В этом случае это
S2 -> S3 -> S2
Это действительный бесконечный путь выполнения вашего автомата, означающий, что программа вправе всегда переходить с S3
на S2
и никогда не переходить на S4
, и поскольку она никогда не трогает S70
это также контрпример для вашей собственности.
Я не уверен, как я могу помочь вам в вашей проблеме, поскольку вы не указали, используете ли вы LTL или CTL , а также не дали никакой дополнительной информации о твоя модель Может быть необходимо изменить вашу модель, ваши свойства или оба. Если можно, я бы посоветовал вам взглянуть на слайды во второй части этого курса по NuSMV
/ nuXmv
, чтобы лучше понять инструмент.
EDIT
Предположим, что в моделируемом сценарии реального мира технически невозможно, чтобы такое бесконечное выполнение когда-либо происходило, т.е. такая возможность является результатом некоторых упрощений, введенных на этапе моделирования , или того, что такая ситуация может действительно иметь место, но нас просто не интересует такой крайний случай по задокументированным причинам.
Тогда решение состоит в том, чтобы исключить такую трассировку выполнения из части проверки, чтобы она не могла появиться в качестве контрпримера. Точное решение может зависеть от проверяемой модели, которая мне недоступна, но пример может быть:
(! (G (F S2))) -> (F S70)
В этой кодировке предполагается, что обратной петли на S2
после S70
не существует. В противном случае следует использовать другие подходы.