[英]Alloy syntax for remainder types?
是否有直接的方法來表示Alloy中的余數類型,而不是必須明確地減去union所有子類型? 例如,在:
sig Test {}
one sig A, B extends Test {}
我希望能夠通過速記來引用表達式Test-(A+B)
,每次Test
都被新的sig擴展時不需要改變。 雖然這只是語法糖,但它可以幫助我在重構模型時避免錯誤。
您可以引入一個表示余數的集合,如下所示:
abstract sig Test {}
sig Remainder extends Test {}
one sig A, B extends Test {}
這會將Test
原子集分成三個子集,其中Remainder
等同於Test - (A + B)
。 如果您稍后決定通過添加one sig C
來擴展Test
,例如, Remainder
仍將為您提供剩余設置。
我有一段時間沒有使用過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
命令中使用匿名謂詞一樣。
如果你想讓定義包含任何擴展Test
的新sigs,你可以使用Alloy的鮮為人知的元函數,它允許你通過一個特殊的set sig$
迭代sigs。
例如,你可以這樣做:
fun Remainder [] : set Test {
{t : Test | all sig : sig$ | sig = Test$ || t not in sig.value}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.