用Alloy实现队列的入队和出队

时间:2013-03-16 19:40:43

标签: 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]{}

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以轻松定义入队:

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

但出列并不是那么容易。问题是您需要修改节点而不是队列,以便更改出队列所需的最后一个节点。实际上,您需要使用其“下一个”字段为空的不同节点替换队列中的倒数第二个节点 - 但由于您使用原子标识来表示节点唯一性,因此该节点实际上将是不同的节点。