Заказ в Сплаве, используя утилиту / заказ
Я пытаюсь узнать о том, как работает заказ в Alloy. У меня есть временная подпись, которую я использовал для создания экземпляра модуля заказа. Я хочу, чтобы предикат addPage добавил страницу в книгу в момент времени t', где t' = t.next. (Как правило, добавьте страницу в Книгу в следующий раз) Однако она не работает должным образом, и вместо этого Time2 имеет меньшее количество страниц, чем Time1. Может кто-нибудь объяснить мне, почему это происходит? Благодарю.
open util/ordering[Page] as P0
open util/ordering[Time] as T0
sig Page {}
sig Time {}
sig Book
{
pages: Page -> Time
}
pred addPage(b:Book, p:Page, t: Time)
{
t != T0/last implies
{
let t' = t.next |
b.pages.t' = b.pages.t + p
}
}
run addPage {} for 3
2 ответа
Проблема заключается в лишних фигурных скобках в операторе run. Я думаю, что Alloy выполняет пустой предикат в этом случае.
Пытаться:
run addPage for 3
вместо. Вы увидите визуализацию, где отмечены выбранные экземпляры для b, t и p.
Вы пытаетесь изменить состояние, которое может быть смоделировано только в логике ограничений. Обратите внимание, что выражение в addPage в основном неэффективно / запустите вашу модель без него / и что в решении есть только один атом Book.
Вот модель, с которой можно начинать и постепенно дорабатывать.
open util/ordering[Time]
sig Page {}
sig Time {}
sig Book {
pages : Page lone -> Time // each Time atom is mapped to at most one Page atom
}
pred addPage(b0, b1 : Book, pg : Page, t0, t1 : Time) {
one pg and // one page at a time (it's likely redundant)
not pg in b0.pages.Time and // it's a 'new' page
b0.pages + pg->t1 = b1.pages and // 'new state' of b0
t1 = t0.next // pg is 'added' with the next time stamp
}
run addPage for 3 but 2 Book
Я использовал необязательные операторы 'и', поместил t1 = t0.next в конце ограничения, поместил b1.pages /, представляющий "новое состояние" / справа, и использовал кавычки в комментариях, чтобы подчеркнуть, что реального состояния нет изменение и последовательность операций в смысле императивного программирования работ.