TLA + Spec对外部系统的假设

时间:2017-10-24 02:12:17

标签: tla+

我正在为工作中的项目尝试TLA +。我想证明,即使对数据内部进行了一些更改,使用相同密钥获取数据也会返回相同的数据。为此,我想将外部系统建模为黑盒子,其响应具有某些属性。例如:

CONSTANT ValidKeys
CONSTANT DataPoints
CONSTANT FETCH(_)

\* Incorrect use of ASSUME, but for illustrative purposes.
ASSUME ValidKeys \in SUBSET DOMAIN FETCH(ValidKeys)
ASSUME \forall key in ValidKeys:
  LET fetched == Fetch(ValidKeys)[key]
  IN fetched \in Seq(DataPoints)

然后,我想编写自己的系统,TLA +将根据指定的假设推断出行为。这可能吗?

1 个答案:

答案 0 :(得分:2)

是的,但它更好 - 特别是如果你想使用TLC,TLA +模型检查器,它是工具箱的一部分 - 直接使用非确定性,而不是依赖于使用常量和假设的公理规范,需要你在模型检查时提供特定的实例,这可能不是你想要的。

你可以这样做:

CONSTANT ValidKey
CONSTANT DataPoint

VARIABLE x

Fetch(key) == key \in ValidKey /\ x' \in Seq(DataPoint)

这基本上是说Fetch是一些返回DataPoint s序列的操作,但你不知道哪个,并不重要。现在,在检查系统时,将Fetch检查所有可能的响应(因为Seq是无限制的,因此在进行模型检查时,您需要覆盖它描述有限序列直到某个给定长度的运算符。)

如果您希望Fetch始终“返回”相同键的相同结果,您可以执行不同的操作:

CONSTANTS ValidKey, DataPoint
VARIABLE fetch

Init == fetch \in [ValidKey -> Seq(DataPoint)] /\ ...

Next == UNCHANGED fetch /\ ...

表示fetch是所需类型的某种未知功能。 TLC将类似地检查所有可能的fetch函数的规范。