В книге Alloy обсуждаются различные варианты - ищите «условия кадра» в индексе.
Люди часто определяют неизменный предикат в парадигме события, что делает спецификацию более читабельной:
pred Event.unchanged (field: univ -> Time) {
field.(this.pre) = field.(this.post)
}
Вы также можете определить предикат, подобный этому
pred modifies (es: set Event, field: univ -> Time) {
all e: Event - es | field.(e.pre) = field.(e.post)
}
, и использовать его в таких условиях фрейма в стиле Рейтера (из примера блокировки книги):
sig Room {
key: Key one -> Time,
prev: Key lone -> Time,
occ: Guest -> Time
}
{
Checkin.modifies [prev]
(Checkin + Checkout).modifies [occ]
RecodeEnter.modifies [key]
}
В какой-то момент мы экспериментировали с мета-способностью , которая позволила вам определить предикат, подобный этому
pred Event.modifies (fs: set field$) {
all f: field$ - fs | f.value.(this.pre) = f.value.(this.post)
}
, но энтузиазма по этому поводу не было много.