合金三元关系覆盖

时间:2018-04-29 20:13:07

标签: alloy

我在sig Record中有一个三元关系,如果前两个元素匹配,我有一个谓词changeRecord来修改第三个元素。但是++覆盖只检查域(第一个元素),我该怎么做?

sig Account{}
sig Record{
    allowance: Account -> Account -> one Int
}
pred changeRecord(a1, a2: Account, r1, r2: Record, val: Int){
    val > 0
    a1 != a2
    r2.allowance = r1.allowance ++ (a1 -> a2 -> val) // ***
}

***行目前替换任何以a1开头的元组,其中a1 - > a2 - > val,但我希望替换只发生在像a1 - >这样的行上。 a2 - > someothervalue。

1 个答案:

答案 0 :(得分:0)

这是第一个版本,仅覆盖匹配a1-> a2与a1-> a2-> val'的元组。 它涉及几个步骤,我相信更多有经验的Alloy用户可以更简洁地完成相同的任务,也许是采用不同的思路。

row

这个想法是在步骤1和2.中将r1.allowance中与a1-> a2匹配的那些元组分开,在步骤3中从r1.allowance中减去它们,并用a1-> a2-> val'覆盖它们。在第4步中,最后将覆盖的集加r1_allowance_without_a1_a2_val“分配”到第5步中的r2.allowance。请注意,对于某些a1-> a2对,在r1.allowance中可能有多个具有不同val的元组,所有这些元组将是被a1-> a2-> val'覆盖,然后,当然,在r2.allowance中只会出现一个a1-> a2-> val'。 备注:我尚未广泛检查此解决方案的正确性。