NuSMV: инициализация константы диапазона с помощью параметра

#model-checking #nusmv

#проверка модели #nusmv

Вопрос:

Я новичок в NuSMV. Я пытаюсь определить модуль, в котором каждое состояние имеет переменную длительности, которая может варьироваться от 0 до указанной границы.

 MODULE state(inc, bound)
 VAR 
   duration : 0..bound;
 
 ASSIGN 
  init(duration) := 0;
  next(duration) := inc ? (duration   1) mod (bound 1) : duration ;

 DEFINE limit := duration = bound; 
 

Однако это приводит к синтаксической ошибке : A variable is expected in left-hand-side of assignment: init(duration) := 0 . Я могу исправить это, объявив duration duration : 0..1 bound .

В моем основном модуле я хочу вычислить total_duration (или фактически вычислить все возможные комбинации длительности состояния и убедиться, что ни одна комбинация не превышает e.i. 3, как в СПЕЦИФИКАЦИИ) для запуска моей модели и убедиться, что переменная не достигает определенного предела.

Вот мой основной модуль:

 MODULE main
 VAR 
  s0 : state(TRUE, 0);
  s1 : state(s0.limit, 0);
  s2 : state(s1.limit, 3);
  state : {s0, s1, s2};

 DEFINE
  max_duration := s0.bound   s1.bound   s2.bound;

 VAR
  total_duration : 0..max_duration;

 ASSIGN
  init(state) := s0;

  next(state) := 
    case
      state = s0 : s1;
      state = s1 : s2;
      state = s2 : s2;
    esac;

  total_duration := s0.duration   s1.duration   s2.duration;

SPEC
  AG (state = s2 -> AF total_duration <= 3);
 

Моя проблема в том, что когда я запускаю модель, NuSMV продолжает добавлять к total_duration переменной и, таким образом, завершается ошибкой с сообщением « line 39: cannot assign value 5 to variable total_duration «. Это связано с объявлением duration : 0..1 bound , потому что в конкретном примере
s0.duration = 0, s1.duration = 0 и s2.duration = 3 он попытается добавить 1 1 4 to total_duration , поскольку это привязка состояния 1.

Однако, если я проверю трассировку, нет точки, где total_duration превышает 3. Я проверил следующие спецификации:

 -- specification AG total_duration < 4  is true

-- specification  F total_duration = 4  is false
-- specification EF total_duration >= 4  is false
 

Как я могу это исправить? Либо путем объявления продолжительности другим способом, либо путем изменения чего-либо еще?

Ответ №1:

Программное обеспечение делает что-то очень простое. Он принимает домен каждого дополнения и проверяет, сможет ли результирующая переменная содержать результат каждой возможной комбинации значений. В этом случае:

  • область s0.duration 0..1
  • область s1.duration 0..1
  • область s2.duration 0..4

таким образом, в принципе, максимум total_duration может быть 6 , и его домен, таким образом, должен быть 0..6 . Поэтому:

 DEFINE
  max_duration := s0.bound   s1.bound   s2.bound   3
 

Возможно, вы захотите выполнить NuSMV следующий параметр:

 -keep_single_value_vars
  Does not convert variables that have only one
  single possible value into constant DEFINEs
 

Таким образом, вы сможете запускать модель без необходимости добавления 1 в домен bound .

Комментарии:

1. Привет, Патрик, большое вам спасибо за ваш ответ. Краткое продолжение: есть ли способ инициализировать переменную duration с привязкой параметра без добавления 1: duration : 0..1 bound; ? Таким образом, что длительность становится: 0..bound

2. @em0605 Я обновил ответ, который должен решить вашу проблему 🙂