alloyの勉強
from alloyを使ってみたい
Alloyの勉強
全体的に、情報が断片的で、全体像が分かりにくい
しつこくリンクを巡っておく必要がある
これは、alloy作者が書いた『優れたデザインにとってコンセプトが重要な理由』を読んでも感じていた
筆者本人が、体系的なdocumentを書くのが苦手か、
そもそもやってることが難しいから、誰が書くにしてもそうなってしまうか
https://alloytools.org/
community
https://alloytools.discourse.group/
docs https://alloytools.org/documentation.html
quick guide https://alloytools.org/quickguide/
tutorial https://alloytools.org/tutorials/online/
alloyのtutorial読んだ https://alloytools.org/tutorials/online/index.html
やっぱ読んだほうが良かったなこれ
全部atom かrelation(orderd tuple)
それを、集合の関係を表現したり
さらにOO的な関係性をも示してる
すごい
RDBよりもよっぽど良い感じに関係を扱ってる感じ?
目的が違うが
tutorial中に登場するtips
https://alloytools.org/tutorials/online/sidenote-levels-of-understanding.html
3レベルの抽象
オブジェクト指向
集合論
atomと関係
code:als
sig S extends E {
F: one T
}
fact {
all s:S | s.F in T
}
これを3段階で説明してるが
最後のatomとrelationの説明が一番腑に落ちた
S is an atom (and so is E)
the containment relation maps E to S (among other things it does)
F is a relation from S to T
the containment relation maps S to s (among other things)
. composes relations
s.F composes the unary relation s with the binary relations F, resulting in a unary relation t, such that the containment relation maps T to t
集合論をどうやって表現してるかと言うと、
集合自体をatomで表しつつ
包含関係などを、atom間の某で実現している
Sという集合 という概念はあるが、Sの要素を列挙するわけではない
あくまで、atomを作ってて
Sを用いたいろんな記述をする上で、S atomとs atomをいろいろ対応付けするとかしてる
https://alloytools.org/tutorials/online/sidenote-relations-everywhere.html
すべてはatom or relation
atomは1項の関係とみなせば、全部relation
https://alloytools.org/tutorials/online/sidenote-format-sig.html
Alloy 6で入ったmutable fields, 線形時相論理がわりとデカい変更
https://zenn.dev/y_taka_23/articles/alloy-mutable-fields
https://www.hillelwayne.com/post/alloy6/
これが使えるなら、これ以前の時間を扱ったあらゆるexample, tutorialが古いコードになる
公式tutorialでさえ
全然更新されてないのでウーンという感じ
いまAlloy 6対応した本を書いてるんだっけ?
ということで、これは絶対理解しないといけない
別に、古いコードも動くのだが
古典論理と関係代数が分かってれば難しくなかったが、時相論理の操作が難しい
公式外
https://alloy.readthedocs.io/en/latest/
こっちのほうが一般的なドキュメントって感じ
読んだけど、こっちのほうがわかりやすい
https://www.hillelwayne.com/post/alloy6/
この記事かいたひと
mutable fieldの説明もある
haslab
haslabはalloy 6で入った線形時相論理の拡張を作ってたとこっぽい
https://github.com/haslab
https://haslab.github.io/formal-software-design/
本で見た例が出てくる気がする
ある程度alloyを理解しないとむずそう
alloy4fun
https://github.com/haslab/Alloy4Fun
crossing riverをmutable fieldで書き換えるのをやってる
途中で、そもそも頭の中の考え方を変えないといけないのが分かった
たぶんHaskellとかと近い
述語や事実を宣言的に述べるだけで良い
分岐などを手前で考えるより、富豪的に述語をつなげる
述語の内側で、ありえない状態を否定するように事実を宣言すれば良い
内部的にはSATソルバが頑張ってくれる
たとえば、Farmerがいる方からいない方へのmoveというのを
こうしない
code:alloy
let farmerSide = Farmer in s.far => s.far else s.near | ...
こうかく
code:alloy
pred movefrom, to {
Farmer in from // これでいい
some x in from {
///
}
}
あとは、こうかけば、farかnearの移動が記述できる
moves.far, s.near or moves.near,far
ほんとか?
動くが、適切な実践であるかはわからない