Почему TLC сообщает об ошибках в действительных состояниях?
У меня есть следующая спецификация очереди:
------------------------------- MODULE queue -------------------------------
EXTENDS Naturals
CONSTANT L (* The fixed max length of the queue *)
VARIABLE q (* Represents the queue as the number of items in it *)
----------------------------------------------------------------------------
TypeInvariant == q >= 0 /\ q <= L
----------------------------------------------------------------------------
Init == q = 0
NoOp == q' = q (* Queue unchanged *)
Enqueue == q' = q + 1 (* Element added *)
Dequeue == q' = IF q = 0 THEN q ELSE q - 1 (* Element removed *)
Next == NoOp \/ Enqueue \/ Dequeue
----------------------------------------------------------------------------
Spec == Init /\ [][Next]_q
----------------------------------------------------------------------------
THEOREM Spec => TypeInvariant
============================================================================
Когда я запускаю TLC со следующими значениями констант:
L <- 3
И эти ограничения:
INVARIANT
TypeInvariant
Он сообщает об этих ошибках:
Но спецификация допускает значения в
(0 .. L)
, так почему TLC сообщает
q=1
,
q=2
,
q=3
,
q=4
как недействительные состояния?
Вывод трассировки ошибки следующий:
<<
[
_TEAction |-> [
position |-> 1,
name |-> "Initial predicate",
location |-> "Unknown location"
],
q |-> 0
],
[
_TEAction |-> [
position |-> 2,
name |-> "Enqueue",
location |-> "line 18, col 12 to line 18, col 21 of module queue"
],
q |-> 1
],
[
_TEAction |-> [
position |-> 3,
name |-> "Enqueue",
location |-> "line 18, col 12 to line 18, col 21 of module queue"
],
q |-> 2
],
[
_TEAction |-> [
position |-> 4,
name |-> "Enqueue",
location |-> "line 18, col 12 to line 18, col 21 of module queue"
],
q |-> 3
],
[
_TEAction |-> [
position |-> 5,
name |-> "Enqueue",
location |-> "line 18, col 12 to line 18, col 21 of module queue"
],
q |-> 4
]
>>
Как распознать те, которые считаются ошибками, и те, которые не связаны с этим следом? На интерфейсе не горит красный свет
q=0
.
1 ответ
Решение
- Красная ячейка показывает, что значение переменной изменилось в этом состоянии по сравнению с предыдущим значением (см. https://tla.msr-inria.inria.fr/tlatoolbox/doc/model/executing-tlc.html). Красный цвет не означает, что состояния недействительны!
- Префикс (бесконечного) поведения, сообщаемого проводником трассировки как трассировка ошибки, не удовлетворяет свойству (безопасность)
TypeInvariant
потому какTypeInvariant
это не позволяетq=4
.
Кстати, группа TLA+ - гораздо лучшее место, чтобы задавать вопросы.