【问题标题】:Accumulation of union of sets集合并集的累积
【发布时间】:2012-10-19 14:55:27
【问题描述】:

我有两个类 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

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


(来源:dropproxy.com

我在这里假设True == 1False != 1 以及集合AR 分别包含AR 的所有实例。

到目前为止,我尝试定义一个 fun trueR(a : A),它应该返回所有 RR.a = a and r.data = True 和一个 fact allbIsRTrue,它声明每个 A allb 应该是R.btrueR 返回的总和。

但是,这就是我卡住的地方,我找不到正确的构造来对引用中的集合求和,并尝试使用 sum 导致语法错误。

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

【问题讨论】:

    标签: alloy


    【解决方案1】:

    我认为你想使用集合推导。在 Alloy 中,这是集合理解的语法

    {x: X | f(x)}
    

    上面的表达式计算为一组Xf(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,它们“连接”那些确切的@987654331 @ 和 b,其中 r.dataTrue

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

    • 我制作了Bool sig 抽象,因为您可能不想要既不是True 也不是False 的布尔值

    • 我制作了 TrueFalse sigs 单例 sigs(即 one sig),因为您可能希望它们中的每一个都只有一个原子

    • 我将关系 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
    }
    

    【讨论】:

    • 非常感谢您对布尔类型的详细描述和建议!
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多