我已经问过合金here中的笛卡尔积和不相交的联合。在那里,我认为集合是一元定义的谓词。
如果我简单想要在Alloy中取消联合两个简单签名,那该怎么办。
假设我有以下签名:
sig A {}
sig B {}
我想定义从A到B Û B
的关系,我使用Û
作为disjoint union。这可能直接用合金吗?
答案 0 :(得分:3)
我可以想到两种方法。 (但我意识到,重新阅读你的问题,我不知道你的最后一段是什么意思。所以也许这与你的目标无关。)
首先:一个不相交的联合用标志标记每个成员,这样你就可以知道它来自哪个父集,并且不相交联合中的任何元素都不在两个父集中。如果练习的目的是确保你知道不相交联盟的每个成员来自哪个父集,并确保没有不相交联盟的成员来自多个父集,那么在这种情况下,正常联合似乎做你需要的。在您的示例中,签名A和B已经是不相交的,并且始终可以判断给定原子是在A还是在B中。所以第一种方法就是使用表达式A + B
。
第二:如果A + B
不能做,由于问题中没有给出的原因,你真的想要一组对,那么定义那组对。在每对中,第一个元素来自A,第二个元素是1(或其他一些标志),或者第一个元素来自B,第二个元素是2(或其他一些标志)。
写这个的一种方法是:
{v : X + Y, n : Int | (v in X and n = 1) or (v in Y and n = 2) }
另一种等效方式是:
{x : X, y : Int | y = 1}
+
{x : Y, y : Int | y = 2}
第三种方式更简单:
{v : X, n : 1} + {v : Y, n : 2}
更简单:
(X -> 1) + (Y -> 2)
与任何表达式一样,这可以打包在一个函数中:
fun du[Left, Right : set univ] : (Left + Right) -> Int {
(Left -> 1) + (Right -> 2)
}
然后A和B的不相交联合可以写成du[A, B]
。
我重复我的建议,花些时间学习理解。