集合联合的积累

时间:2012-10-19 14:55:27

标签: alloy

我有两个班级AB以及与班级R的额外数据的关系。

因此,AB通过R相互关联。

sig A {}
sig B {}

sig R {
    a : A,
    b : B,
    data : Bool
}

这里,Bool被定义为:

sig Bool {}
sig True, False extends Bool {}

现在,我像这样延长A

sig A{
    allb : some B
}

其中包含B的所有实例,其AB之间存在关联,且数据类型为True

我想将以下逻辑陈述表达为合金事实:

Formal version of text above http://dropproxy.com/f/3B

我在此假设True == 1False != 1,并且集AR分别包含AR的所有实例。

到目前为止我尝试过的是定义一个fun trueR(a : A),它应该返回RR.a = a and r.data = True的所有fact allbIsRTrue,其中A表示每个allb { {1}} R.b应该是trueR返回的sum的总和。

但是,这里是我遇到困难的地方,我找不到正确的构造来对参考中的集合求和,并尝试使用{{1}}导致语法错误。

我如何将我的形式约束指定为合金事实?

1 个答案:

答案 0 :(得分:3)

我认为你想使用set comprehension。在Alloy中,这是set comprehension的语法

{x: X | f(x)}

上面的表达式评估为X所拥有的一组f(x)

在您的示例中,为了表达allB的事实,您可以编写类似

的内容
fact fAllB {
    all a: A | 
        a.allB = {b: B | 
            some r: R | r.ra = a and r.rb = b and r.data = True}
}

在英语中,这个事实是“对于所有a集合Aa.allB是一组所有B,因此存在一些r “连接”那些确切的ab以及r.dataTrue

请注意我对您模型的其余部分所做的以下修改:

  • 我制作了Bool sig摘要,因为你可能不希望bool既不是True也不是False

  • 我制作了TrueFalse sigs singleton sigs(即one sig),因为你可能想要每个都只有一个原子

    < / LI>
  • 我将关系ab重命名为rarb,以避免名称混淆和潜在的混淆

以下是我用于此示例的模型的其余部分

abstract sig Bool {}
one sig True, False extends Bool {}

sig A {
  allB: set B
} 
sig B {}
sig R {
  ra : A,
  rb : B,
  data : Bool
}