Реализация Enqueue и Dequeue для Queue с помощью Alloy

Имея следующее:

sig Queue { root: Node }
sig Node { next: lone Node }
fact nextNotReflexive { no n:Node | n = n.next }
fact nextNotCyclic { no n:Node | n in n.^next }

Может кто помочь по реализации Enq и Deq?

pred Enq[q,q':Queue, n:Node]{}
pred Deq [q,q':Queue]{}

Любая помощь приветствуется.


person user2177817    schedule 16.03.2013    source источник
comment
с чем именно у вас проблемы?   -  person Aleksandar Milicevic    schedule 19.03.2013


Ответы (1)


Вы можете легко определить очередь:

pred Enq[q, q': Queue, n: Node] {
  q'.root = n and n.next = q.root
}

Но удаление из очереди не так просто. Проблема в том, что вам нужно изменить узел, а не очередь, чтобы внести изменения в последний узел, необходимый для удаления элемента из очереди. На самом деле вам нужно заменить предпоследний узел в очереди другим узлом, чье поле «следующий» пусто, но, поскольку вы используете идентификатор атома для представления уникальности узла, этот узел на самом деле будет другим узлом.

person Joe Near    schedule 30.05.2013