AlloyのSignature
集合を定義する
code:Alloy
sig A {}
sig B, C {}
以下のように書いた時、A,Bは共通部分を持たない
code:alloy
sig A, B {}
以下も、AとBは共通部分を持たない
code:Alloy
sig C {}
sig A, B extends C {}
ただし、AでもBでもないCは存在する可能性はある
abstractがあると、C = A + Bになる
code:Alloy
abstract sig C {}
sig A, B extends C {}
つまり、AでもBでもないCが存在しないことを表す
ただし、subsetがないabstract sigはsigと同等
subsetを作って初めて差が出る
inを使うと、部分集合だが、排他的ではない、という意味になる
code:alloy
sig C {}
sig A, B in C {}
A,BはCの部分集合だが、共通部分を持つ可能性がある
複数の集合の和集合の部分集合としても定義できる
code:alloy
sig C in A + B {}
集合演算子
+
和集合
&
共通部分
-
差集合
in
部分集合
pに含まれるタプルが全てqに含まれる場合、p in qは真になる
Alloyはスカラも集合も同じ表現なので、inは、$ \inと$ \subeの両方の意味を表す
=
イコール
fieldは関係の導入
code:alloy
sig A {f: e}
とかけば、
code:alloy
f in A -> e
というfactが存在するのと同じ意味
fieldの多重度を省略した場合はoneと同じ
以下2つは等価
code:alloy
sig A {f: e}
sig A {f: one e}
fieldのoverloadについて
読み飛ばした
seq
s.firstとかs.idxOfだとか色々methodが使えるらしい
singleton
code:alloy
one sig A {}
つまり、Aのinstanceは常に同じものを指す
一つの要素のみを持つ集合A