从对称集中选择一项

时间:2019-02-15 22:55:18

标签: tla+

我具有类似于以下内容的TLA +规范:

CONSTANT Items
VARIABLE item

我希望Items是对称的,并从Items中选择一个元素并将其存储到item中。

我一直在使用item = CHOOSE x \in Items: TRUE,但是我了解到这破坏了项目的对称性:TLC将始终从集合中选择第一个项目。

我想以保持对称性的方式选择一个项目,以允许TLC探索所有状态。我不在乎我们选择哪个 项,仅是它是一个,并且它来自Items。 (后来,我需要item才能成为\in Items

虽然我希望将item作为一个元素,但将item设为基数1也可以,因此以后我可以检查\subseteq Items

我建议我将CHOOSE替换为{x \in Items: TRUE},以保持对称性,并将结果设为\subseteq Items,但这不会将结果集限制为基数1。

有没有办法让TLA +从一组对称的值中给我一个项目或一组基数?

1 个答案:

答案 0 :(得分:0)

自发布问题以来,我对TLA + / TLC有了更多了解,这是我的答案:

要简单地从初始谓词中的对称集中选择一个元素:

item \in Items

或在操作中:

item' \in Items

如果要选择与谓词匹配的项目(如CHOOSE所指定),则可以选择:

item \in {x \in Items: P(x)}

这将形成与谓词匹配的Items的子集,然后从中选择一个元素。

有些数据表明此语法与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可以找到比选择CHO状态更多的状态。