如何使用 Alloy 内核语言导出“一个”多重性约束?
How to derive the `one` multiplicity constraint using the Alloy Kernel language?
我正在阅读附录 C:软件抽象的内核语义(Daniel Jackson 着,第二版,顺便说一句,非常好读!),发现自己在理解如何推导 one
多重性方面有点卡住了使用其他内核构造的约束。
我知道 no
可以使用 expr = none
导出,并且 some
可以使用先前规则的否定导出,但我不明白如何表达 one
(因此 lone
)约束仅使用内核构造(或派生)。
我可能遗漏了一些明显的东西,但我没有看到 :)
下面是我的表达方式one expr
//there is some expr
not (expr = none)
//and all expr should be one and the same because there's only one expr.
all x1,x2: expr | x1=x2
您可以这样定义 one
:
one e iff
not all x: e | not x = x // e is non-empty
and
all x: e | all x': e | x = x' // e has no more than one member
请注意,内核语言不足以表达高阶量化(Alloy* 支持,但 Alloy 本身不是很有效)。所以量词给了我们单例的概念。
丹尼尔
我正在阅读附录 C:软件抽象的内核语义(Daniel Jackson 着,第二版,顺便说一句,非常好读!),发现自己在理解如何推导 one
多重性方面有点卡住了使用其他内核构造的约束。
我知道 no
可以使用 expr = none
导出,并且 some
可以使用先前规则的否定导出,但我不明白如何表达 one
(因此 lone
)约束仅使用内核构造(或派生)。
我可能遗漏了一些明显的东西,但我没有看到 :)
下面是我的表达方式one expr
//there is some expr
not (expr = none)
//and all expr should be one and the same because there's only one expr.
all x1,x2: expr | x1=x2
您可以这样定义 one
:
one e iff
not all x: e | not x = x // e is non-empty
and
all x: e | all x': e | x = x' // e has no more than one member
请注意,内核语言不足以表达高阶量化(Alloy* 支持,但 Alloy 本身不是很有效)。所以量词给了我们单例的概念。
丹尼尔