如何在 TLA+ 中执行详尽的状态检查?
How to perform exhaustive state checking in TLA+?
是否可以检查是否达到模型中的每个合法状态?
如果可以的话,属性应该怎么写?
考虑下面的模块,其中调制了 24 小时制时钟。
我能够检查 hour
是否处于非法状态,即它在 0 到 23 之间。
但是,如果我写了一个错误的 Next
谓词,例如hour' = (hour + 1) % 23
,并非所有状态都已达到,但属性不会捕获此错误。
----------------------------- MODULE Clock -----------------------------
EXTENDS Naturals
VARIABLE hour
Init ==
hour \in 0..23
Next ==
hour' = (hour + 1) % 24
Spec ==
/\ Init
/\ [][Next]_hour
\* Properties
hourMinBound == [](hour >= 0)
hourMaxBound == [](hour <= 23)
=============================================================================
尝试
ReachesAllStates == \A h \in 0..23: <>(hour = h)
这将检查它是否至少到达每个状态一次。要检查它是否持续到达每个状态,您需要
KeepsReachingAllStates == \A h \in 0..23: []<>(hour = h)
是否可以检查是否达到模型中的每个合法状态? 如果可以的话,属性应该怎么写?
考虑下面的模块,其中调制了 24 小时制时钟。
我能够检查 hour
是否处于非法状态,即它在 0 到 23 之间。
但是,如果我写了一个错误的 Next
谓词,例如hour' = (hour + 1) % 23
,并非所有状态都已达到,但属性不会捕获此错误。
----------------------------- MODULE Clock -----------------------------
EXTENDS Naturals
VARIABLE hour
Init ==
hour \in 0..23
Next ==
hour' = (hour + 1) % 24
Spec ==
/\ Init
/\ [][Next]_hour
\* Properties
hourMinBound == [](hour >= 0)
hourMaxBound == [](hour <= 23)
=============================================================================
尝试
ReachesAllStates == \A h \in 0..23: <>(hour = h)
这将检查它是否至少到达每个状态一次。要检查它是否持续到达每个状态,您需要
KeepsReachingAllStates == \A h \in 0..23: []<>(hour = h)