我正在为工作中的项目尝试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 +将根据指定的假设推断出行为。这可能吗?
答案 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
函数的规范。