enum
以前に受け入れられた回答に加えて、特に標準との主な違いについて、Alloy on s での1 週間の経験から得られたいくつかの有用な洞察を追加したいと思いsig
ます。
を使用abstract sig + extend
すると、同じ概念に対応するセットが多数存在するモデルが作成されます。たぶん、例がそれをより明確にすることができます。次のようなものとします
sig Car {
dameges: set Damage
}
使用する選択肢があります
abstract sig Damage {}
sig MajorDamage, MinorDamage extends Damage {}
対
enum Damage {
MajorDamage, MinorDamage
}
最初のケースでは、車に関連付けられたさまざまな MinorDamage アトム (MinorDamage0、MinorDamage1、...) を持つモデルを考え出すことができますが、2 番目のケースでは、異なる車が参照できる MinorDamage は常に 1 つだけです。
この場合、abstract sig + extend
フォームを使用することにはある程度の意味があります (さまざまな MinorDamage または MajorDamage 要素を追跡することを決定できるため)。
一方、currentState: set State
を使用したい場合は、
enum State {Damaged, Parked, Driven}
State
概念をマッピングして、それぞれCar
が参照できる正確に 3 つを持つようにします。このように、 では、Visualizer
モデルを 1 つの状態だけに投影することを決定でき、Car
この状態に関連付けられているすべての がハイライト表示されます。もちろん、コンストラクトでそれを行うことはできませんabstract + extend
。投影すると、それに関連するものMajorDamage0
だけが強調表示され、それ以外は何も強調表示されないためです。Car
Damage
結論として、それは本当にあなたがしなければならないことにかかっています。
また、X要素で構成された列挙型を持っている場合、実行することに注意してください
run some_predicate for Y
Y < X の場合、Alloy はインスタンスをまったく生成しません。したがって、最後の例では、Y < 3 を持つことはできません。
最後の注意として、マジック レイアウト ボタンを使用する場合、列挙型が常にビジュアライザーに表示されるわけではありませんが、前述したように、モデルを列挙型に「投影」して、列挙型のさまざまな要素を切り替えることができます。