我在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。
答案 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'。 备注:我尚未广泛检查此解决方案的正确性。