我有两个班级A
和B
以及与班级R
的额外数据的关系。
因此,A
和B
通过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
的所有实例,其A
与B
之间存在关联,且数据类型为True
。
我想将以下逻辑陈述表达为合金事实:
Formal version of text above http://dropproxy.com/f/3B
我在此假设True == 1
和False != 1
,并且集A
和R
分别包含A
和R
的所有实例。
到目前为止我尝试过的是定义一个fun trueR(a : A)
,它应该返回R
和R.a = a and r.data = True
的所有fact allbIsRTrue
,其中A
表示每个allb
{ {1}} R.b
应该是trueR
返回的sum
的总和。
但是,这里是我遇到困难的地方,我找不到正确的构造来对参考中的集合求和,并尝试使用{{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
集合A
,a.allB
是一组所有B
,因此存在一些r
“连接”那些确切的a
和b
以及r.data
为True
。
请注意我对您模型的其余部分所做的以下修改:
我制作了Bool
sig摘要,因为你可能不希望bool既不是True
也不是False
我制作了True
和False
sigs singleton sigs(即one sig
),因为你可能想要每个都只有一个原子
我将关系a
和b
重命名为ra
和rb
,以避免名称混淆和潜在的混淆
以下是我用于此示例的模型的其余部分
abstract sig Bool {}
one sig True, False extends Bool {}
sig A {
allB: set B
}
sig B {}
sig R {
ra : A,
rb : B,
data : Bool
}