Alloy中'private'关键字的含义? 'enum'声明的含义?

时间:2012-08-16 17:56:34

标签: alloy

Alloy 4 grammar允许签名声明(以及其他一些内容)带有private个关键字。它还允许允许规范包含表单

的枚举声明
enum nephews { hughie, louis, dewey }
enum ducks { donald, daisy, scrooge, nephews }

The language reference没有(据我所知)描述private关键字或enum结构的含义。

有文件可用吗?或者它们是否在语法中作为为将来的规范保留的构造?

2 个答案:

答案 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;你的模型在枚举上,并在枚举的不同元素之间切换。