Conjuntos/Bolsas
Un conjunto es una estructura de datos de acceso inmediato
- Sin repeticiones (en la bolsa si puede)
- No ordenado
Estos son representados en un lenguaje como los indices de un array, y el dato es el valor de dicho índice
La diferencia entre los conjuntos y las bolsas que que los conjuntos toman valores booleanos mientras que las bolsas pueden toman como valor un tipo de dato numérico que representa el valor/cardinalidad/multiplicidad de dicho elemento en la bolsa
Operaciones
- Pertenece
- Añadir/Sacar
- Intersección, Unión o Diferencia
Especificación
Tipos externos
TElemento
Tipos propios
TConjunto
TBolsa
OperacionesConstructoras generadoras
crearConjuntoVacio→TConjunto
anadir: TConjunto X TElemento→TConjuntoObservadoras selectoras
(parcial)consulta: TConjunto→TElementoObservadoras no selectoras
esConjuntoVacio: TConjunto→Boolean
pertenece: TConjunto X TElemento→Boolean
esSubconjunto: TConjunto X TConjunto→Boolean
cardinal: TConjunto→Integer
multiplicidad: TBolsa→IntegerConstructora no generadora
quitar: TConjunto X TElemento→TConjunto
union: TConjunto X TConjunto→TConjunto
interseccion: TConjunto X TConjunto→TConjunto
diferencia: TConjunto X TConjunto→TConjunto
Ecuaciones de definitud
- DEF (
consulta(Poner(c, i)))
Variables
c,c<N>,conjunto→TConjunto
i,j,e,e<N>→TElemento
EcuacionesObservadoras no selectoras
esConjuntoVacio
esConjuntoVacio(crearConjuntoVacio)=True
esConjuntovacio(Poner(conjunto, i))=False
pertenece
pertenece(crearConjuntoVacio, i)=False
pertenece(poner(cº, i), j)=(i = j)||pertenece(c, j)
esSubconjunto
esSubconjunto(crearConjuntoVacio, c2)=True
esSubconjunto(poner(c, i), c2)=pertenece(c2, i)&&esSubconjunto(c, c2)
cardinal
cardinal(crearConjuntoVacio)=0
cardinal(poner(c, i))= SIpertenece(c, i)→ (cardinal(c)) || (1 + cardinal(c))Constructoras no generadoras
quitar
quitar(crearConjuntoVacio, j)=crearConjuntoVacio
quitar(poner(c, i), j)= SI (i = j) → (quitar(c, j)) || (poner(quitar(c, j), i))
union
union(crearConjuntoVacio, c2)=c2
union(poner(c1, i), c2)=poner(union(c1, c2), i)
interseccion
interseccion(crearConjuntoVacio, c2)=crearConjuntoVacio
interseccion(poner(c1, i), c2)= SIpertenece(c2, i)→ (poner(interseccion(c1, c2), i)) || (interseccion(c1, c2))
diferencia
diferencia(c, crearConjuntoVacio)=c
diferencia(c1, poner(c2, i))=diferencia(quitar(c1, i), c2)
Unidad Conjuntos
unit uConjunto;
    
interface
    
    uses uElemento
    type
        TConjunto = array[TElemento] of boolean;
implementation
    
    procedure crearVacio(var c:TConjunto); 
    var i:TElemento;
    begin
        for i:=INI to FIN do c[i] := False;
    end;
    procedure poner(var c:TConjunto; e:TElemento); begin
        c[e] := True;
    end;
    procedure quitar(var c:TConjunto; e:TElemento); begin
        c[e] := False;
    end;
    function pertenece(var c:TConjunto; e:TElemento):boolean; begin
        pertenece := c[e];
    end;
    procedure union(var u:TConjunto; var c1, c2:TConjunto);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := c1[i] or c2[i];
    end;
    procedure interseccion(var u:TConjunto; var c1, c2:TConjunto);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := c1[i] and c2[i];
    end;
    procedure diferencia(var u:TConjunto; var c1, c2:TConjunto);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := c1[i] and (not c2[i]);
    end;
end.unit uElemento;
    
interface
    
    const
        INI = 1;
        FIN = 10;
    type
        TElemento = INI..FIN;
    
implementation
    
end.Unidad Bolsas
unit uBolsa;
    
interface
    uses uElemento
    type
        TBolsa = array[TElemento] of integer;
implementation
    
    procedure crearVacio(var b:TBolsa); 
    var i:TElemento;
    begin
        for i:=INI to FIN do b[i] := 0;
    end;
    procedure poner(var b:TBolsa; e:TElemento); begin
        b[e] := b[e]+1;
    end;
    procedure quitar(var b:TBolsa; e:TElemento); begin
        b[e] := b[e]-1;
    end;
    function pertenece(var b:TBolsa; e:TElemento):boolean; begin
        pertenece := b[e] > 0;
    end;
    function multiplicidad(var b:TBolsa; e:TElemento):integer; begin
        pertenece := b[e];
    end;
    procedure union(var u:TBolsa; var b1, b2:TBolsa);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := b1[i] + b2[i];
    end;
    procedure interseccion(var u:TBolsa; var b1, b2:TBolsa);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := min(b1[i] and b2[i]);  // Definir min()
    end;
    procedure diferencia(var u:TBolsa; var b1, b2:TBolsa);
    var i:TElemento;
    begin
        for i:=INI to FIN do u[i] := b1[i] - b2[i];
    end;
end.unit uElemento;
    
interface
    const
        INI = 1;
        FIN = 10;
    type
        TElemento = INI..FIN;
implementation
    
end.