1

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

=============================================================================
4

1 回答 1

1

根据 Leslie Lamport在此处的回复,当您实例化像 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(_):

定义值

最终结果:

最终结果

瞧,TLA+ 的依赖注入!

于 2018-04-02T19:45:40.437 回答