使用VS Code时如何在TLA +配置文件中设置CONSTANTS?

时间:2019-11-29 09:09:23

标签: tla+

我正在使用VS Code和vscode-tlaplus插件而非TLA + Toolbox学习TLA +。现在,我有了这个TLA文件,其中定义了一些常量:

---- MODULE test ----
EXTENDS TLC, Integers, Sequences

CONSTANTS Capacity, Items, ValueRange, SizeRange

ItemParams == [size: SizeRange, value: ValueRange]
ItemSets == [Items -> ItemParams]
===

我想在cfg文件中设置以下内容:

SPECIFICATION Spec

CONSTANTS
    SizeRange = 1..4
    ValueRange = 0..3
    Capacity = 7
    Items = {"a", "b", "c"}

但这会导致以下错误:

TLC threw an unexpected exception.
This was probably caused by an error in the spec or model.
See the User Output or TLC Console for clues to what happened.
The exception was a tlc2.tool.ConfigFileException
:
TLC found an error in the configuration file at line 5
It was expecting = or <-, but did not find it.

到目前为止,我仅找到此解决方法:

.tla

---- MODULE test ----
EXTENDS TLC, Integers, Sequences

CONSTANTS Capacity, Items, ValueRange, SizeRange

ConstSizeRange == 1..4
ConstValueRange == 0..3

ItemParams == [size: SizeRange, value: ValueRange]
ItemSets == [Items -> ItemParams]
====

.cfg

SPECIFICATION Spec

CONSTANTS
    SizeRange <- ConstSizeRange
    ValueRange <- ConstValueRange
    Capacity = 7
    Items = {"a", "b", "c"}

因此,定义常量似乎没用。

我做错了,还是这是预期的行为?

谢谢

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 TLC仅支持非常特定的TLA +表达式作为CFG文件中分配给常量的值。我同意,如果支持更强大的表达式,那就太好了。

通常按照惯例进行处理:您有一个“好的副本” SpecName.tla TLA +规范,不能通过TLC直接对其进行模型检查,还有另一个MCSpecName.tla TLA +规范,它覆盖了其中的各种定义第一个使其可模型检查,并定义常量值。因此,在您的情况下,您将:

Test.tla:

---- MODULE Test ----
EXTENDS TLC, Integers, Sequences

CONSTANTS Capacity, Items, ValueRange, SizeRange

ConstSizeRange == 1..4
ConstValueRange == 0..3

ItemParams == [size: SizeRange, value: ValueRange]
ItemSets == [Items -> ItemParams]
====

MCTest.tla:

---- MODULE MCTest ----
EXTENDS Test

ConstSizeRange == 1..4

ConstValueRange == 0..3

====

MCTest.cfg:

SPECIFICATION Spec

CONSTANTS
    SizeRange <- ConstSizeRange
    ValueRange <- ConstValueRange
    Capacity = 7
    Items = {"a", "b", "c"}

您可以看到在TLA +示例中使用了该约定,例如Paxos。实际上,这是一个很好的约定,使您不必编写“良好副本”规范即可更准确地反映现实情况,而不必遵循模型检查器的异想天开。例如,在良好的复制规范中,您可能有一个now变量来定义当前时间;它可以是实数值,并且在每个Tick动作之后都可以以任意的正实数值前进。在您的MC规范中,您将覆盖nowTick以使用Naturals的某些子集。