Bolsa (informática)

Una bolsa es, en informática, un tipo abstracto de datos. Se trata de una colección de un número arbitrario de elementos (todos del mismo tipo) que no son necesariamente distintos, junto con una serie de procedimientos de acceso.

La especificación es muy parecida a la del TAD conjunto. La diferencia es que si hay elementos repetidos permanecen todas las ocurrencias. En los conjuntos solo queda una de las ocurrencias. Al número de veces que un elemento aparece en la bolsa se denomina multiplicidad.

Operaciones

editar
  • Crear: crea una bolsa vacía.
  • Eliminar: solo elimina una ocurrencia del elemento que se borra.
  • Cardinal: cuenta como distintas todas las repeticiones de un mismo elemento.
  • Agregar: agrega el elemento en la bolsa no importa si esta antes.

Bolsa en MAUDE

editar

A continuación mostraremos una posible especificación del tipo abstracto Bolsa para Maude con sus operaciones más usuales.

fmod BOLSA {X :: TRIV} is
pr INT .
sort Bolsa{X} .

*** generadores

op crear : -> Bolsa{X} [ctor] .
op {_} : X$Elt -> Bolsa{X} [ctor] .
op _U_ : Bolsa{X} Bolsa{X} -> Bolsa{X} [ctor comm assoc id: crear] .

*** constructores

op agregar : X$Elt Bolsa{X} -> Bolsa{X} .
op eliminar : X$Elt Bolsa{X} -> Bolsa{X} .
ops interseccion : Bolsa{X} Bolsa{X} -> Bolsa{X} [assoc comm] .
ops diferencia : Bolsa{X} Bolsa{X} -> Bolsa{X} .
*** selectores
op _perteneceA_ : X$Elt Bolsa{X} -> Bool .
op cardinal : Bolsa{X} -> Nat .
op repeticiones : X$Elt Bolsa{X} -> Nat .

*** variables

vars E E2 : X$Elt .
vars B B2 B3 : Bolsa{X} .
*** ecuaciones
eq agregar(E, B) = {E} U B .

eq eliminar(E, crear) = crear .
eq eliminar(E, {E2}) = if E == E2 then
crear
else
{E2}
fi .
eq eliminar(E, B U B2) = if E perteneceA B then
eliminar(E, B) U B2
else
B U eliminar(E, B2)
fi .

eq repeticiones(E, crear) = 0 .
eq repeticiones(E, {E2}) = if E == E2 then
1
else
0
fi .
eq repeticiones(E, B U B2) = repeticiones(E, B) + repeticiones(E, B2).

eq E perteneceA crear = false .
eq E perteneceA {E2} = E == E2 .
eq E perteneceA B U B2 = E perteneceA B or E perteneceA B2 .

eq cardinal(crear) = 0 .
eq cardinal({E}) = 1 .
eq cardinal(B U B2) = cardinal(B) + cardinal(B2) .

eq interseccion(crear, B) = crear .
eq interseccion({E}, B) = if E perteneceA B then
{E}
else
crear
fi .
eq interseccion({E} U B, B2) = if E perteneceA B2 then
{E} U interseccion(B, eliminar(E, B2))
else
interseccion(B, B2)
fi .

eq diferencia(B, crear) = B .
eq diferencia(B, {E}) = if E perteneceA B then
eliminar(E, B)
else
B
fi .
eq diferencia(B, B2 U B3) = diferencia(diferencia(B, B2), B3) .

endfm