合金中的不相交联合和笛卡尔积

时间:2014-12-06 16:52:57

标签: alloy

我在Alloy中有两套理解谓词(uniary):

pred A (o : Object){ .. } 

pred B (o : Object) { ..} 

我想定义谓词,其中一个是不相交的联合,另一个是A和B的笛卡尔乘积。

PS:要定义它们的并集和交集,我可以定义以下谓词:

pred Union(o : Object){
    A[o] or B[o]
}

pred Inter(o:Object){
  A[o] and B[o]
}

我想得到类似的笛卡尔积和不相交联的谓词。

由于

2 个答案:

答案 0 :(得分:2)

您可能会混淆谓词的概念和集合的概念。你有一个好公司(弗雷格,一个人),但结果证明是危险的。

表达式o in A[o]o in B[o]应该引发类型错误,因为如果A和B是谓词,那么表达式A[o]B[o]应该计算为true或false ,而不是可以想象成为会员的那些。

如果你想要一个谓词U,当A或B或两者对于那个对象都是真的时,对象是真的,那么你想要像

这样的东西
pred U[o : Object] { A[o] or B[o] }

如果你想要一个独特的分离 - 我认为这就是你在谈论一个不相交的联盟时的意思 - 那么

pred X[o : Object] { (A[o] and not B[o]) or (B[o] and not A[o]) }

如果你想要A,B和X为真的集合,那么你想写

{ o : Object | A[o] } 
{ o : Object | B[o] } 
{ o : Object | X[o] } 

其中第三个当然可以写成

{ o : Object | (A[o] and not B[o]) or (B[o] and not A[o]) }

集合理解符号(再次,我鼓励您阅读相关文档)也可以处理元组集;满足A和B的对象集的笛卡尔积将以这样的方式写出:

{ a, b : Object | A[a] and B[b] }

答案 1 :(得分:0)

以下是我正在寻找的解决方案:

A和B的笛卡儿积被定义为A * B = {(a,b)| A中的A和B中的a}。因此,使用set comprehension表达式将其置于Alloy语法中将如下所示:

pred ACartesB(o1:Object, o2: Object){
    A[o1] and B[o2]
}

A和B的不相交联合定义为A + B = {(a,1)联合(b,2)| A中的A和B中的a}。 1和2是区分A + B中A和B的相同元素的指标。因此,将其置于合金背景中将如下:

pred AdisjUnionB(o:Object, i: Int){
    (A[o] and i=1) or (B[o] and i=2)
}

PS: 我们假设我们的签名中有sig Object {}