是否有直接的方法来表示Alloy中的余数类型,而不是必须明确地减去union所有子类型?例如,在:
sig Test {}
one sig A, B extends Test {}
我希望能够通过简短的方式引用表达式Test-(A+B)
,每次Test
通过新的信号扩展时都不需要更改。虽然这只是语法糖,但它可以帮助我在重构模型时避免错误。
答案 0 :(得分:3)
您可以引入一个表示余数的集合,如下所示:
abstract sig Test {}
sig Remainder extends Test {}
one sig A, B extends Test {}
这会将Test
个原子集划分为三个子集,Remainder
等同于Test - (A + B)
。如果您稍后决定通过添加Test
来扩展one sig C
,例如,Remainder
仍会为您提供剩余设置。
答案 1 :(得分:0)
我有一段时间没有使用过Alloy,但我认为不可能以你想要的方式。但是,您可以将联合重构为模型中的一个位置。例如:
sig Test {}
one sig A, B extends Test {}
fun Remainder : set Test {
Test - (A+B)
}
run { some Remainder } for 5
使用此处称为Remainder
的函数定义关系,该函数通过从基本类型中减去所有子类型的并集来定义。
每当您向模型添加新的子类型时,只需记住将其添加到Remainder
的定义中,您就可以了。
在整个模型中,您可以引用Remainder
来获取所有纯 Test
个原子,就像我在run
中的匿名谓词中使用的那样命令。
答案 2 :(得分:0)
如果您希望定义能够保留任何扩展Test
扩展的新标记,您可以使用Alloy的鲜为人知的meta capabilities,它允许您通过特殊集合迭代sigs sig$
。
例如,您可以执行以下操作:
fun Remainder [] : set Test {
{t : Test | all sig : sig$ | sig = Test$ || t not in sig.value}
}