其余类型的合金语法?

时间:2014-02-25 18:29:10

标签: alloy

是否有直接的方法来表示Alloy中的余数类型,而不是必须明确地减去union所有子类型?例如,在:

sig Test {}
one sig A, B extends Test {}    

我希望能够通过简短的方式引用表达式Test-(A+B),每次Test通过新的信号扩展时都不需要更改。虽然这只是语法糖,但它可以帮助我在重构模型时避免错误。

3 个答案:

答案 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}
}