tla+ - 一组对,有和没有重复

标签 tla+

我有两套:

X = {a, b}
Y = {1, 2, 3}

我想生成以下一组对:

{<<a, 1>>, <<a, 2>>, <<a, 3>>}
{<<a, 1>>, <<a, 2>>, <<b, 3>>}
{<<a, 1>>, <<b, 2>>, <<a, 3>>}
{<<a, 1>>, <<b, 2>>, <<b, 3>>}
...
{<<b, 1>>, <<b, 2>>, <<b, 3>>}

在每个集合中,第一个元素来自 X,第二个元素来自 Y。X 可以重复,Y 不能。怎么做?

最佳答案

使用 \X运算符为我们提供了所有对的集合:X \X Y = {<<a, 1>>, <<a, 2>>, ... <<b, 3>>} . SUBSET (X \X Y)给了我们所有可能的集合。 {s \in SUBSET (X \X Y): Cardinality(s) = 3} (来自 FiniteSets 模块)为我们提供了所有 3 元素集。

我们希望在每对的第二个元素上使它唯一。让我们定义一个新的运算符:

UniqueBy(set, Op(_)) == Cardinality(set) = Cardinality({Op(s): s \in set})

如果我们这样做 {x[2] : x \in {<<a, 1>>, <<a, 2>>, <<a, 2>>}} ,我们得到 {1, 2} ,它的基数较小,将被过滤掉。所以我们最后的表达是

{s \in SUBSET (X \X Y) : UniqueBy(s, LAMBDA x: x[2]) /\ Cardinality(s) = 3}

注意没有基数检查{<<a, 1>>}将是集合集合的一部分,这不是您要查找的内容。

关于tla+ - 一组对,有和没有重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47823153/

相关文章:

logic - => 和 <=> 之间的区别

tla+ - 在 TLA+ 中比较序列和集合的元素

specifications - TLA+错误: The invariant Invariants is not a state predicate

formal-verification - 检查分支是否被执行

tla+ - 在TLA+中使用模块重载实现哈希函数

concurrency - 简单并发程序的归纳不变量是什么?

configuration-files - TLA+工具箱运行模型时出错: overridden value Nat

graph - TLA +如何可视化状态图

formal-methods - 此 TLA+ 规范正确吗?