Supervisor Tree を Alloy で記述してみた

今ひとつ Alloy を理解できていないので、ErlangScala で使う Supervisor Tree の仕様を記述

まずは、集合を定義してみる。

abstract sig Actor {
  parent : lone Supervisor
}
sig Worker extends Actor {}
sig Supervisor extends Actor {
  child : Actor
}
  • Worker は、Actor である
  • Supervisor は Actor である
  • Actor は、親として高々1つの Supervisor を持つ
  • Supervisor は、子として0個以上の Actor を持つ

個人的に、1 Application : 1 Supervsior Tree だろうと思っているので、下記を追加する。

one sig RootSupervisor extends Supervisor {}

Actor は、高々一つの親を持つけれど、RootSupervisor は絶対に親を持たないので、下記の制約を追加する。

one sig RootSupervisor extends Supervisor {} {
  no parent
}

ここまでで、Supervisor Tree に登場する集合は、全て定義できた。ここに制約を追加していく。
現状だと、自分自身を親や子にできるので、下記の制約を追加する。

fact parent {
  no (^parent & iden)
}

fact child {
  no (^child & iden)
}

親と子の関係はペアとなるので、下記の制約を追加する。

fact pair {
  parent = ~child
}

RootSupervisor を除く全ての Actor は絶対に親が必要であるため、全ての Actor は RootSupervisor から辿れるという制約を追加する。

fact {
  Actor in RootSupervisor.*child
}

最後に確認用に空の動作を追加して実行する。

pred show () {}
run show

assert や check は勉強中なので、また今度。
最終的には、下記の通り。

module SupervisorTree

abstract sig Actor {
  parent : lone Supervisor
}
sig Worker extends Actor {}
sig Supervisor extends Actor {
  child : Actor
}
one sig RootSupervisor extends Supervisor {} {
  no parent
}

fact parent {
  no (^parent & iden)
}

fact child {
  no (^child & iden)
}

fact pair {
  parent = ~child
}

fact {
  Actor in RootSupervisor.*child
}

pred show () {}
run show

突っ込み大歓迎。