AlloyのAssertion
モデルの特定の特性をテストするための命題を定義する
別の箇所で書かれている仕様に対して「この条件が満たされているか?」を確認する
AlloyのCheckでAssertionを満たしているかを確認できる
満たしていない場合は反例が得られる
この時チェックされるのは1つのAssertionだけであり、他のAssertionは無視される
イメージ的にはテストコードのようなものかmrsekut.icon
ファクトから導かれることが分かっているアサーションでも記述しておいたほうがよい。 性質の別な形での表現になるし、 回帰テストのようにも使えるからである。 後になってモデルに混入した誤りがアサーションを検査することで検出できるかもしれない。 ref /mrsekut-book-4274068587/140 (4.5.3 アサーション)
https://alloytools.org/tutorials/online/sidenote-format-assert.html
例
code:alloy
assert acyclic { show2[] implies noSelfLoop[] }
show2という述語からnoSelfLoopという述語が導かれることを検証する
Tutorial for Alloy Analyzer 4.0のFile System Lesson Iの例 ref
code:alloy
abstract sig FSObject { parent: lone Dir }
sig Dir extends FSObject { contents: set FSObject }
sig File extends FSObject { }
one sig Root extends Dir { } { no parent }
fact { all d: Dir, o: d.contents | o.parent = d }
fact { FSObject in Root.*contents }
// 上記の仕様に対し、循環してないことを確認
assert acyclic { no d: Dir | d in d.^contents }
check acyclic for 5
以下2つは同値らしい
code:alloy
moveOkay: check {
all fs, fs': FileSystem, x: FSObject, d:Dir |
movefs, fs', x, d => fs'.live = fs.live
} for 5
code:alloy
assert moveOkay {
all fs, fs': FileSystem, x: FSObject, d:Dir |
movefs, fs', x, d => fs'.live = fs.live
}
check moveOkay for 5
1つ目の方は、assertionとAlloyのCheckを同時に書いている?
https://alloytools.org/tutorials/online/frame-FS-6.html
/mrsekut-book-4274068587/140 (4.5.3 アサーション)