在Alloy中为每个关系创建一个对象

时间:2015-01-09 23:26:23

标签: alloy

我有以下def。在合金中:

sig A {b : set B}
sig B{}
sig Q {s: A , t: B}

我想添加一组约束,这样对于每个关系 b1:b ,只存在一个 Q1:Q ,其中Q1.s和Q1.t分别指b1的来源和目标。例如,如果我有一个包含A1和B1且b1连接它们的实例(即b1:A1-> B1),那么我也希望有一个Q1,其中Q1.s = A1和Q1.t = B1

显然Q的数字(基数)等于b关系的数字(基数)。

我设法写了这样一个约束:

t in s.b 
all q1,q2:Q | q1.s=q2.s and q1.t=q2.t => q1=q2
all a1:A,b1:B | a1->b1 in b => some q:Q | q.s=a1 and q.t=b1

我想知道是否有人用更简洁的方式来表达我对合金事实的意图。如果它让生活更轻松,我愿意使用Alloy util 包。

由于

2 个答案:

答案 0 :(得分:1)

sig A { b : set B }
sig B {}
sig Q { ab : A -> B }{ one ab }
fact { b = Q.ab and #Q = #b }

答案 1 :(得分:0)

我会通过添加两个关系 s和t 来完成@ user1513683答案,以使其成为问题的完整答案:

sig A { b : set B }
sig B {}
sig Q { ab : A -> B , s:A, t:B}{ one ab and t=ab[s]}
fact { b = Q.ab and #Q = #b }