El tipo abstracto de datos de las colas en Haskell

En este artículo continúo la serie dedicada a los tipos de datos abstractos (TAD) en Haskell presentando el TAD de las colas.

Al igual que hice en los anteriores TAD, usaré módulos, funciones de escritura y QuickCheck para conseguir la abstracción, independencia y certificación de los resultados de las implementaciones.

Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción se realiza por un extremo (el posterior o final) y la operación de extracción por el otro (el anterior o frente). Las colas también se llaman estructuras FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. Este comportamiento es análogo a las colas del cine.

El contenido del resto del artículo es el siguiente:

  • la signatura del TAD de las colas;
  • las propiedades del TAD de las colas;
  • la implementación, en Haskell, de las colas mediante listas;
  • la implementación, en Haskell, de las colas mediante pares de listas y
  • la comprobación con QuickCheck de sus propiedades.

La signatura del TAD de las colas

Las signatura de las operaciones del TAD de las colas son las siguientes:

con el siguiente significado

  • colaVacia es la cola vacía.
  • (encolar x c) es la cola obtenida añadiendo el elemento x al final de la cola c.
  • (cabeza c) es la cabeza de la cola c.
  • (desencolar c) es la cola obtenida eliminando la cabeza de la cola c.
  • (esColaVacia c) se verifica si c es la cola vacía.
  • (valida c) se verifica si c representa una cola válida.

Propiedades del TAD de las colas

Las propiedades son las siguientes:

  1. cabeza (encolar x colaVacia) == x
  2. Si c es una cola no vacía, entonces cabeza (encolar x c) == cabeza c,
  3. desencolar (encolar x colaVacia) == colaVacia
  4. Si c es una cola no vacía, entonces desencolar (encolar x c) == encolar x (desencolar c)
  5. esColaVacia colaVacia
  6. not (esColaVacia (encolar x c))

ColaConListas.hs: Implementación de las colas mediante listas

ColaConDosListas.hs: Implementación de las colas mediante dos listas

En esta implementación, una cola c se representa mediante un par de listas (xs,ys) de modo que los elementos de c son, en ese orden, los elementos de la lista xs++(reverse ys).

Al dividir la lista en dos parte e invertir la segunda de ellas, esperamos hacer más eficiente las operaciones sobre las colas.

Impondremos también una restricción adicional sobre la representación: las colas serán representadas mediante pares (xs,ys) tales que si xs es vacía, entonces ys será también vacía. Esta restricción ha de mantenerse por los programas que crean colas.

Propiedades de las colas

El objetivo de la serie es la elaboración de los temas de TAD del curso de Informática del Grado en Matemáticas.