Заказ в Сплаве, используя утилиту / заказ

Я пытаюсь узнать о том, как работает заказ в 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 /, представляющий "новое состояние" / справа, и использовал кавычки в комментариях, чтобы подчеркнуть, что реального состояния нет изменение и последовательность операций в смысле императивного программирования работ.

Другие вопросы по тегам