colas_con_prioridad
//--------------------------------------------//
// Especificacion Algebraica TAD Cola //
// Autor: Pablo Sanchez (p.sanchez@unican.es) //
// http://personales.unican.es/sanchezbp //
//--------------------------------------------//
espec Cola
usa Boolean, Natural
generos PriorityQueue(Element) as PQueue
parametro
 generos Element como E
 greaterThan(x,x) = FALSE
 [greaterThan(x,y) and greaterThan(y,z)] greaterThan(x,z) = TRUE
 [NOT(equal(x,y)) and NOT(greaterThan(y,x))]
 greaterThan(x,y) = TRUE
 [NOT(equal(x,y)) and greaterThan(x,y))]
 greaterThan(y,x) = FALSE
fparametro
operaciones
 emptyPQueue : -> PQueue
 add : PQueue E -> PQueue
 parcial peek : PQueue -> E
 parcial remove : PQueue -> PQueue
 isEmpty : PQueue -> Boolean
 size : PQueue -> Natural
 // Funciones auxiliares
 max : PQueue -> Element
vars
 q : PQueue; x, y, z : Element;
precondiciones
 [isEmpty(s) != TRUE] remove(q), peek(q), max(q)
ecuaciones
 // Las generadoras son emptyPQueue y add(q,x) y no
 // son libres
 // Los patrones del tipo son:
 // - emptyPQueue
 // - add(q,x)
 [greaterThan(y,x) == TRUE]
 add(add(q,x),y) = add(add(q,y),x)
 max(add(emptyPQueue,x)) = x
 [greaterThan(x,max(q)) == TRUE] max(add(q,x)) = x
 [greaterThan(x,max(q)) != TRUE] max(add(q,x)) = max(q)
 size(emptyPQueue) = 0
 size(add(q,x)) = 1 + size(q)
 remove(add(emptyPQueue,x)) = emptyPQueue
 [greaterThan(y,max(add(q,x))) == TRUE]
 remove(add(add(q,x),y)) = add(q,x)
 [greaterThan(y,max(add(q,x))) != TRUE]
 remove(add(add(q,x),y)) = add(remove(add(q,x)),y)
 peek(add(emptyPQueue,x)) = x
 [greaterThan(y,max(add(q,x))) == TRUE]
 peek(add(add(q,x),y)) = y
 [greaterThan(y,max(add(q,x))) != TRUE]
 peek(add(add(q,x),y)) = peek(add(q,x))
 isEmpty(emptyPQueue) = TRUE
 isEmpty(add(q,y)) = FALSE
fespec