在 TLA+ 中保留顺序的同时过滤元组

Filtering a tuple while preserving order in TLA+

我正在为 TLA+ 中的主备份协议建模,并在元组中进行复制配置。一些设置 TLA+:

NNodes == 3
Nodes == 1..NNodes

然后,在Pluscal算法中:

config = << 1, 2, 3 >>;
healthy = [ n \in Nodes |-> TRUE ];

我有一个 processhealthy 中的值设置为 FALSE,并希望另一个进程从 [=22] 中删除条目=]config 基于 healthy 是否为 FALSE,同时保留 config.

中剩余条目的顺序

如果 config 是一个集合,删除不健康的条目将是微不足道的,但我正在寻找一种使用元组完成此操作的好方法。我可以在循环中使用 Append,但这会导致 TLC 处理很多额外的状态。 TLA+ 或 Pluscal 有更好的方法吗?

理想情况下,解决方案不会假定配置中的条目按排序顺序开始,但我可以解决该限制。

配置元素的顺序重要吗?否则我建议用一组 config = {1,2,3} 替换它。您可以轻松地将集合过滤为集合差异 config \ {2}.

Sequences 模块包含 SelectSeq 运算符,可解决您的确切用例。它看起来像

SelectSeq(config, LAMBDA x: healthy[x])

请参阅指定系统的第 341 页。