自从发布问题以来,我对 TLA+/TLC 有了更多了解,这是我的答案:
要简单地从初始谓词中的对称集中选择一个元素:
item \in Items
或在一个动作中:
item' \in Items
如果您想选择一个与谓词匹配的项目,如您可以使用 CHOOSE 指定的那样,那么这是替代方法:
item \in {x \in Items: P(x)}
这将形成与谓词匹配的项目子集,然后选择其中的一个元素。
这里有一些数据显示了这种语法和 CHOOSE 之间的区别。考虑这个模块:
----------------------------- MODULE ChooseDemo -----------------------------
CONSTANT Items
VARIABLE item
TypeInvariant == item \in Items
Init == item = CHOOSE x \in Items: TRUE
Next == item' \in {x \in Items: x /= item}
=============================================================================
当Items
有三个项目:
- 不是对称集:TLC 找到 1 个初始状态和总共 7 个(3 个不同的)状态。
- 对称集:TLC 找到 1 个初始状态和总共 3 个(1 个不同的)状态。
现在考虑这个模块:
--------------------------- MODULE SetFormingDemo ---------------------------
CONSTANT Items
VARIABLE item
TypeInvariant == item \in Items
Init == item \in {x \in Items: TRUE}
Next == item' \in {x \in Items: x /= item}
=============================================================================
当Items
有三个项目:
- 不是对称集:TLC 找到 3 个(3 个不同的)初始状态和总共 9 个(3 个不同的)状态。
- 对称集:TLC 找到 3(1 个不同)初始状态和总共 5(1 个不同)状态。
因此,通过使用集合形成语法,TLC 比使用 CHOOSE 找到更多的状态。