我有两个规格:System和SystemMC。系统规范是我指定的系统的“好”规范,对文档很有用。它定义了一个CONSTANT MessyAction(_)(在我正在编写的实际规范中,一个哈希函数),它以一种有效的模型可检查的方式指定,因此会降低规范的可读性。我在SystemMC规范中实现了MessyAction(_),所以我可以模型检查系统规范。但是,解析器在SystemMC规范中给出以下错误:
实例化模块'System'中的级别错误:替换为'MessyAction'的表达式或运算符的级别必须至多为0.
这个错误意味着什么,以及如何在不添加针对TLC优化的大量内容的情况下实现模型检查系统规范的目标?这是系统规范:
------------------------------- MODULE System -------------------------------
EXTENDS
Naturals
CONSTANTS
MessyAction(_)
VARIABLES
Counter
-----------------------------------------------------------------------------
TypeInvariant ==
/\ Counter \in Nat
Init ==
/\ Counter = 0
Increment ==
/\ Counter' = Counter + 1
/\ MessyAction(Counter)
Next ==
\/ Increment
=============================================================================
这是SystemMC规范:
------------------------------ MODULE SystemMC ------------------------------
EXTENDS
Naturals
CONSTANTS
MaxCounterValue
VARIABLES
Counter,
PastValues
ASSUME MaxCounterValue \in Nat
-----------------------------------------------------------------------------
MessyAction(c) ==
/\ PastValues' = PastValues \cup {c}
S == INSTANCE System
TypeInvariant ==
/\ PastValues \subseteq Nat
/\ S!TypeInvariant
Init ==
/\ PastValues = {}
/\ S!Init
Increment ==
/\ Counter < MaxCounterValue
/\ S!Increment
Next ==
\/ Increment
=============================================================================
答案 0 :(得分:1)
Per Leslie Lamport的回复here,当您实例化一个非常量模块(包含变量的模块),如System时,CONSTANT实体只能由其他常量实例化。因此,在SystemMC中,您可以将MessyAction(_)重命名为MessyActionImpl(_),将MessyAction(_)定义为CONSTANT,然后在模型中将MessyAction(c)定义为MessyActionImpl(c)。系统规范没有改变,但这是新的SystemMC规范:
------------------------------ MODULE SystemMC ------------------------------
EXTENDS
Naturals
CONSTANTS
MessyAction(_),
MaxCounterValue
VARIABLES
Counter,
PastValues
ASSUME MaxCounterValue \in Nat
-----------------------------------------------------------------------------
MessyActionImpl(c) ==
/\ PastValues' = PastValues \cup {c}
S == INSTANCE System
TypeInvariant ==
/\ PastValues \subseteq Nat
/\ S!TypeInvariant
Init ==
/\ PastValues = {}
/\ S!Init
Increment ==
/\ Counter < MaxCounterValue
/\ S!Increment
Next ==
\/ Increment
=============================================================================
在工具箱中创建模型时,将MessyAction(_)常量的值定义为MessyActionImpl(_):
最终结果:
Voila,TLA +的依赖注入!