Alloy 4 grammar允许签名声明(以及其他一些内容)带有private
个关键字。它还允许允许规范包含表单
enum nephews { hughie, louis, dewey }
enum ducks { donald, daisy, scrooge, nephews }
The language reference没有(据我所知)描述private
关键字或enum
结构的含义。
有文件可用吗?或者它们是否在语法中作为为将来的规范保留的构造?
答案 0 :(得分:4)
这是我对这两个关键字的非官方理解。
enum nephews { hughie, louis, dewey }
在语义上等同于
open util/ordering[nephews] as nephewsOrd
abstract sig nephews {}
one sig hughie extends nephews {}
one sig louis extends nephews {}
one sig dewey extends nephews {}
fact {
nephewsOrd/first = hughie
nephewsOrd/next = hughie -> louis + louis -> dewey
}
private
关键字表示如果sig具有private
属性,则其标签在同一模块中是私有的。这同样适用于私有字段和私有函数。
答案 1 :(得分:1)
除了之前接受的答案之外,我还想在enum
s上添加一段有关Alloy的经验,特别是与标准{{1}的主要区别。 }}
如果你使用sig
,你会想出一个模型,其中有许多集合对应于同一个概念。也许一个例子可以更好地澄清它。
假设像
abstract sig + extend
您可以选择使用
sig Car {
dameges: set Damage
}
VS
abstract sig Damage {}
sig MajorDamage, MinorDamage extends Damage {}
在第一种情况下,我们可以将具有不同MinorDamage原子(MinorDamage0,MinorDamage1,...)的模型与Cars相关联,而在第二种情况下,您总是只有一个不同的汽车可以引用的MinorDamage。 / p>
在这种情况下使用enum Damage {
MajorDamage, MinorDamage
}
形式可能有一定道理(因为您可以决定跟踪不同的MinorDamage或MajorDamage元素)。
另一方面,如果你想拥有abstract sig + extend
,最好使用
currentState: set State
映射概念,以便每个enum State {Damaged, Parked, Driven}
可以引用三个State
。通过这种方式,在Car
中,您可以决定将模型投影到其中一个状态,并突出显示与此状态关联的所有Visualizer
。当然,您无法使用Car
构造执行此操作,因为通过abstract + extend
进行投影只会突出显示与MajorDamage0
相关联的Car
,而不会突出显示其他内容。< / p>
因此,总之,这实际上取决于你必须做什么。
另外,请记住,如果你有一个由X元素组成的枚举并执行
Damage
其中Y < X,Alloy根本不产生任何实例。 所以,在我们的最后一个例子中,我们不能有一个Y&lt; 3。
作为最后一点,如果您使用魔术布局按钮,枚举不会总是出现在展示台中,但正如我之前所说,您可以&#34;投射&#34;你的模型在枚举上,并在枚举的不同元素之间切换。