解析错误:替换为“Def”的表达式或运算符的级别必须至多为0

时间:2018-04-01 16:42:27

标签: tla+

我有两个规格: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

=============================================================================

1 个答案:

答案 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(_):

Defining the value

最终结果:

End result

Voila,TLA +的依赖注入!