Alloy Analyzer はじめの一歩(デザートは週に三度まで。)

モデリング検査ツール Alloy Analyzer を使いたい!のエントリ。第三回目です。

今回は、自己参照用の関連を定義してみました。

例えば、変更履歴を管理するために、「自身のひとつ前のレコード」の id を、外部キーとして保持するようなケースです。
こういった場合当然

  • 同一のレコードが「ひとつ前のレコード」として、複数のレコードから参照されることは有り得ない。
  • 循環参照は有り得ない。

ので、この制約を満たしたうえでの定義です。
disj というキーワードが役に立ってくれたけど、こういう使い方でいいのかな。

自己参照用の関連

module ref_myself
sig Current {
  // 複数インスタンスから参照されるpreviousは無い
  previous: disj lone Current
}
fact HistoryOfChain {
  // 循環参照禁止
  no c: Current | c in c.^previous
}
run {}

fact 中に出てくる、 "^" 記号は、Alloyでは、
『関係を辿って辿り着ける要素(関係)すべて』
を示しています。数学用語でいうところの「推移閉包」ってやつらしいんですが、ググればググるほど何なのか解りませんでした。
(数学に関することをググると、いつもそうなる)
なので、『関係を辿って辿り着けるモノすべて』
って丸覚えしたところで、あえて思考を停止することに決めました。