我在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]
}
我想得到类似的笛卡尔积和不相交联的谓词。
由于
答案 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 {}
。