簡體   English   中英

其余類型的合金語法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM