如何在Alloy中以三元关系投影第一列和最后一列?
假设我有r1: A->B->C
并假设r1= (A0->B1->C1,A1->B1->C0, A2->B0->C2)
,我如何将r2: A->C
定义为r2= (A0->C1,A1->C0, A2->C2)
更具体地说,如果我有:
sig A {r1:B-> C,r2:C}
sig B {}
sig C {}
如何约束r2成为第一列和最后一列的r1投影。
答案 0 :(得分:2)
一种方法是将约束放入签名中:
sig A{r1:B->C, r2:C}{
r2 = r1[B]
}
答案 1 :(得分:2)
您可以根据r2
定义r1open util/ternary
sig A{
r2:C,
r1:B->r2
}
sig B{}
sig C{}
check { select13[r1] in r2 } for 3
如果您需要一种方法来获得三元组的第一个和最后一个,请使用util / ternary中的select13
答案 2 :(得分:0)
添加以下事实似乎也可以解决这个问题:
事实{all a:A,c:C | (a-> c)在r2中如果某些b:B | (a-> b-> c)在r1}
中