如何使用 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 本身不是很有效)。所以量词给了我们单例的概念。

丹尼尔