假设我定义了以下签名:
sig B,C,D{}
现在我写的时候
sig A{
r: B one -> lone C
}
这意味着{all a:A | A.r in B one -> lone C}
;也就是说,对于每个a:A,A.r是一个二元关系,其中B侧的多重 1 和C侧的 lone 。
现在假设我定义:
sig A{
r: B one -> lone C some -> lone D
}
可以说它意味着{all a:A | A.r in B one -> lone C some -> lone D}
;但这究竟意味着什么?
我查看了这个答案here,但它似乎没有解决上述问题。至少它仍然让我感到困惑如何解释?
答案 0 :(得分:0)
表示
all a:A | a.r in B one -> lone C some -> lone D
;但这究竟意味着什么?
我不是合金专家,但根据我的理解,这意味着:如果r
非空,则其形式遵循多重约束,如下所示:
assert implications {
some r implies all a: A |
(all c: C | one a.r.D.c) // exactly one B for every C
&& (all b: B | lone a.r[b]) // at most one C for every B
&& (all d: D | some a.r.d) // some C for every D
&& (all c: C | lone a.r[B][c]) // at most one D for every C
}
check implications for 6
答案 1 :(得分:0)
一旦考虑约束以及->
的关联性如何适用于该关系,就会变得更加明确。
在这个特殊情况下
sig A { r: B one -> lone C some -> lone D }
相当于写作
sig A { r: B one -> lone (C some -> lone D) }
表示有一个B
与最多一个关系相关,其形式为(C some -> lone D)
。
可以使用
检查此等效性equivalence1: check {
(all a: A | a.r in B one -> lone C some -> lone D) implies
(all a: A | a.r in B one -> lone (C some -> lone D))
}
应该成立,例如
equivalence2: check {
(all a: A | a.r in B one -> lone C some -> lone D) implies
(all a: A | a.r in (B one -> lone C) some -> lone D)
}
不应该坚持。