ESPECIFICACIÓN Listas PARÁMETROS GENÉRICOS TIPOS TipoElemento FIN PARÁMETROS TIPOS TipoLista OPERACIONES (* Constructoras generadoras *) CrearVacia: → TipoLista Construir: TipoElemento (* Observadoras *) × TipoLista → TipoLista PARCIAL Primero : TipoLista PARCIAL Resto : TipoLista → TipoElemento → TipoLista EsVacia : TipoLista → Booleano Longitud : TipoLista → Natural PARCIAL Ultimo : TipoLista → TipoElemento Pertenece : TipoElemento × TipoLista → Booleano (* Constructoras no generadoras *) Concatenar : TipoLista × TipoLista → TipoLista BorrarElemento: TipoElemento × TipoLista → TipoLista InsertarFinal: TipoElemento x TipoLista → TipoLista VARIABLES lista, lista2 : TipoLista; elemento, elem : TipoElemento; ECUACIONES DE DEFINITUD DEF(Primero(Construir(elemento, lista))) DEF(Resto(Construir (elemento, lista))) DEF(Ultimo(Construir (elemento, lista))) ECUACIONES (* Observadoras *) Primero(Construir(elemento,lista)) ≡ elemento Resto (Construir (elemento,lista)) ≡ lista EsVacia (CrearVacia) ≡ CIERTO EsVacia (Construir (elemento,lista)) ≡ FALSO Longitud (CrearVacia) ≡ 0 Longitud (Construir (elemento,lista)) ≡ 1 + Longitud (lista) Ultimo (Construir (elemento,lista)) ≡ SI EsVacia (lista) → elemento | Ultimo (lista) Pertenece (elem, CrearVacia) ≡ FALSO Pertenece (elem, Construir (elemento,lista)) ≡ elem = elemento O Pertenece (elem, lista) (* constructoras no generadoras *) Concatenar (CrearVacia, lista2) ≡ lista2 Concatenar (Construir (elemento,lista), lista2) ≡ Construir (elemento, Concatenar (lista, lista2)) BorrarElemento (elem, CrearVacia)= CrearVacia BorrarElemento (elem, Construir (elemento,lista))= SI elem = elemento → lista | Construir(elemento, BorrarElemento (elem,lista)) InsertarFinal (elem, CrearVacia) = Construir(elem, CrearVacia) InsertarFinal (elem, Construir(elemento,lista)) = Construir(elemento, InsertarFinal(elem,lista)) 1 Listas.ads GENERIC TYPE PACKAGE TYPE TYPE TipoElemento IS PRIVATE; Listas IS TipoLista IS LIMITED PRIVATE; TipoCursor IS PRIVATE; ListaVacia, MemoriaAgotada,CursorNoValido: EXCEPTION; PROCEDURE CrearVacia (lista: IN OUT TipoLista); -- POST: 'lista' es la lista vacía. -Si 'lista' tiene nodos, éstos se destruyen. PROCEDURE Construir(e: IN TipoElemento; lista: IN OUT TipoLista ); -- PRE: Queda suficiente espacio en el heap para insertar -- un nuevo elemento en la lista -- POST: inserta un nodo conteniendo 'e' al principio de 'lista'. -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena FUNCTION Primero (lista: TipoLista) RETURN TipoElemento; -- PRE: 'lista' no está vacía -- POST: devuelve el primer elemento de la lista -- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía PROCEDURE Resto (lista: IN TipoLista; resto: IN OUT TipoLista); -- PRE: 'lista' no está vacía; -queda suficiente memoria para crear el resto -- POST: devuelve en 'resto' una copia del resto de 'lista' -- (todo menos el primer nodo) -- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía -'MemoriaAgotada' si no queda memoria FUNCTION EsVacia (lista: TipoLista) RETURN Boolean; -- POST: devuelve cierto si 'lista' está vacía. FUNCTION Longitud (lista: TipoLista) RETURN Natural; -- POST: devuelve el número de nodos de 'lista'. FUNCTION Ultimo (lista: TipoLista) RETURN TipoElemento; -- PRE: 'lista' no está vacía -- POST: devuelve el último elemento de la lista -- EXCEPCIONES: 'ListaVacia' si 'lista' está vacía FUNCTION Pertenece( e: TipoElemento; lista: TipoLista) RETURN Boolean; -- POST: devuelve cierto si 'e' está en 'lista' PROCEDURE InsertarFinal(lista: IN OUT TipoLista; e: IN TipoElemento); -- PRE: Queda suficiente espacio en el heap para insertar -- un nuevo elemento en la lista -- POST: 'lista' es una nueva lista cuyo último elemento es 'e' -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena PROCEDURE Concatenar (l1:IN TipoLista ; l2:IN TipoLista; salida:IN OUT TipoLista); -- PRE: Queda suficiente espacio en el heap para crear la concatenación -- POST: 'salida' es una nueva lista cuyo contenido es una copia de la -concatenación de 'l1' y 'l2' -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena PROCEDURE BorrarElemento ( e: IN TipoElemento; lista: IN OUT TipoLista); -- POST: Elimina de 'lista' la primera aparición de 'e' (si la hay). PROCEDURE Copiar (destino: IN OUT TipoLista; origen: IN TipoLista); -- PRE: Queda suficiente espacio en el heap para crear la concatenación --POST: Devuelve en 'destino' una copia completa de 'origen'. -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena 2 FUNCTION "="(lista1, lista2: TipoLista) RETURN Boolean; -- POST: devuelve cierto si 'lista1' y 'lista2' son iguales PROCEDURE Destruir (lista: IN OUT TipoLista); -- POST: Elimina todos los nodos de 'lista' de la memoria FUNCTION Elemento(lista: TipoLista; c: TipoCursor) RETURN TipoElemento; -- PRE: 'c' es un cursor válido -- POST: devuelve el elemento asociado a 'c' -- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido PROCEDURE Insertar(lista: IN OUT TipoLista; c: IN TipoCursor; ele: IN TipoElemento; detras: IN Boolean := True); -- PRE: Queda suficiente espacio en el heap -- POST: inserta un nodo con elemento 'ele' inmediatamente detrás -- (si el parámetro 'detras' es cierto o no se facilita) -- o inmediatamente delante (si el parámetro 'detras' es falso) -- del nodo apuntado por el cursor 'c'. Si el cursor 'c' -- no es válido, se inserta el nuevo nodo al final de la lista. -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena PROCEDURE Reemplazar(lista: IN OUT TipoLista; c: IN TipoCursor; ele: IN TipoElemento); -- PRE: 'c' es un cursor válido -- POST: asigna 'ele' al nodo apuntado por 'c' -- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido PROCEDURE Eliminar(lista: IN OUT TipoLista; c: IN OUT TipoCursor); -- PRE: 'c' es un cursor válido -- POST: elimina el elemento apuntado por 'c' de la lista. 'c' toma -- el valor de salida "Siguiente(c)" -- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido FUNCTION PrimerCursor(lista: TipoLista) RETURN TipoCursor; -- POST: Devuelve un cursor apuntando al primer elemento de -- 'lista'. Si ésta es vacía, devuelve un cursor no válido. FUNCTION UltimoCursor(lista: TipoLista) RETURN TipoCursor; -- POST: Devuelve un cursor apuntando al último elemento de -- 'lista'. Si ésta es vacía, devuelve un cursor no válido. FUNCTION Siguiente(lista: TipoLista; c: TipoCursor) RETURN TipoCursor; -- PRE: 'c' es un cursor válido -- POST: Devuelve un cursor apuntando al siguiente de ‘c’ o un cursor -- no válido si ‘c’ no tiene siguiente. -- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido FUNCTION Anterior(lista: TipoLista; c: TipoCursor) RETURN TipoCursor; -- PRE: 'c' es un cursor válido -- POST: Devuelve un cursor apuntando al nodo anterior -- al que apunta 'c'. Si no hay ningún nodo delante de 'c', -- se devuelve el cursor no válido -- EXCEPCIONES: 'CursorNoValido' si 'c' no es válido FUNCTION EsCursorValido(lista: TipoLista; c: TipoCursor) RETURN Boolean; -- POST: Devuelve cierto si 'c' apunta a algún nodo de ‘lista’ FUNCTION EsPrimero(lista: TipoLista; c: TipoCursor) RETURN Boolean; -- POST: Devuelve cierto si 'c' apunta al primer nodo de ‘lista’ FUNCTION EsUltimo(lista: TipoLista; c: TipoCursor) RETURN Boolean; -- POST: Devuelve cierto si 'c' apunta al último nodo de ‘lista’ ... 3 Pilas.ads GENERIC -- Parámetro del TAD TYPE TipoElemento IS PRIVATE; PACKAGE Pilas IS -- definición privada y limitada del tipo de datos TYPE TipoPila IS LIMITED PRIVATE; -- excepciones PilaVacia : EXCEPTION; -MemoriaAgotada : EXCEPTION; -- la pila está vacía no queda espacio en memoria --Operaciones Constructoras Generadoras PROCEDURE CrearPilaVacia (pila : IN OUT TipoPila); -- POST: 'pila' se convierte en la pila vacía PROCEDURE Apilar (e : IN TipoElemento; pila : IN OUT TipoPila); -- PRE: La memoria dinámica no está llena -- POST: Inserta un nodo conteniendo 'e' en la cima de 'pila' -- EXCEPCIÓN: 'MemoriaAgotada' si la memoria dinámica está llena -- Operaciones Observadoras Selectoras FUNCTION Cima (pila : TipoPila) RETURN TipoElemento; -- PRE: 'pila' no está vacía -- POST: Devuelve el elemento que está en la cima de 'pila' -- EXCEPCIÓN: 'PilaVacia' si 'pila' está vacía -- Operaciones Observadoras no Selectoras FUNCTION EsPilaVacia (pila : TipoPila) RETURN Boolean; -- POST: Devuelve cierto si 'pila' está vacía -- Operaciones Constructoras no Generadoras PROCEDURE Desapilar (pila : IN OUT TipoPila); -- PRE: 'pila' no está vacía -- POST: elimina la cima de 'pila' -- EXCEPCIÓN: 'PilaVacia' si 'pila' está vacía -- Otras operaciones PROCEDURE Copiar (destino: IN OUT TipoPila; origen: IN TipoPila); -- PRE: La memoria dinámica no está llena -- POST: Devuelve en 'destino' una copia completa de 'origen'. -- EXCEPCIONES: 'MemoriaAgotada' si la memoria dinámica está llena FUNCTION "=" (pila1, pila2: TipoPila) RETURN Boolean; -- POST: devuelve cierto si 'pila1' y 'pila2' son iguales PROCEDURE Destruir (pila: IN OUT TipoPila); -- POST: Elimina todos los nodos de 'pila' de la memoria PRIVATE ... END Pilas; 4