从对称集合中选择一项
Choosing one item from a symmetric set
我有一个类似于以下内容的 TLA+ 规范:
CONSTANT Items
VARIABLE item
我希望 Items
是对称的,select 来自 Items
的单个元素并将其存储到 item
.
我一直在使用 item = CHOOSE x \in Items: TRUE
,但我了解到这会破坏项目的对称性:TLC 将始终 select 集合中的第一个项目。
我想 select 以保持对称的方式对单个项目进行处理,以允许 TLC 探索所有状态。我不关心 是哪个 项目 select -- 只关心它是一个,而且它来自 Items
。 (后面需要item
变成\in Items
.
虽然我希望 item
是单个元素,但 item
是一组基数 1 也可以,所以稍后我可以检查 \subseteq Items
.
有人建议我将 CHOOSE
替换为 {x \in Items: TRUE}
以保持对称性并使结果为 \subseteq Items
,但这不会将结果集限制为基数 1。
有没有办法让 TLA+ 从一组对称值中给我一个项目或一组基数 1?
自发布问题以来,我对 TLA+/TLC 有了更多了解,这是我的回答:
简单地 select 来自初始谓词中对称集的元素:
item \in Items
或在一个动作中:
item' \in Items
如果您想要 select 一个 匹配谓词 的项目,正如您可以使用 CHOOSE 指定的那样,那么这是替代方案:
item \in {x \in Items: P(x)}
这将构成与谓词匹配的项的子集,然后 select 构成其中的单个元素。
这里有一些数据显示了此语法与 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 发现的更多。
我有一个类似于以下内容的 TLA+ 规范:
CONSTANT Items
VARIABLE item
我希望 Items
是对称的,select 来自 Items
的单个元素并将其存储到 item
.
我一直在使用 item = CHOOSE x \in Items: TRUE
,但我了解到这会破坏项目的对称性:TLC 将始终 select 集合中的第一个项目。
我想 select 以保持对称的方式对单个项目进行处理,以允许 TLC 探索所有状态。我不关心 是哪个 项目 select -- 只关心它是一个,而且它来自 Items
。 (后面需要item
变成\in Items
.
虽然我希望 item
是单个元素,但 item
是一组基数 1 也可以,所以稍后我可以检查 \subseteq Items
.
有人建议我将 CHOOSE
替换为 {x \in Items: TRUE}
以保持对称性并使结果为 \subseteq Items
,但这不会将结果集限制为基数 1。
有没有办法让 TLA+ 从一组对称值中给我一个项目或一组基数 1?
自发布问题以来,我对 TLA+/TLC 有了更多了解,这是我的回答:
简单地 select 来自初始谓词中对称集的元素:
item \in Items
或在一个动作中:
item' \in Items
如果您想要 select 一个 匹配谓词 的项目,正如您可以使用 CHOOSE 指定的那样,那么这是替代方案:
item \in {x \in Items: P(x)}
这将构成与谓词匹配的项的子集,然后 select 构成其中的单个元素。
这里有一些数据显示了此语法与 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 发现的更多。