Bags equivalentes a conjuntos?
Vimos que em Álgebra relacional 101 o padrão é pensar em bags, não em conjuntos. Eles são construtos matemáticos distintos entre si. Mas, será que são tão distintos assim?
Bags como conjuntos?
Entrar aqui em uma pequena sidequest: provar que bags são abstrações que podem ser reduzidas a conjuntos. E existem duas maneiras de se fazer isso.
O primeiro modelo: seja uma bag , e seu conjunto equivalente . Todo elemento em é uma tupla que satisfaça a seguinte propriedade:
Onde a função conta a multiplicidade do elemento na bag , tal qual fizemos em Álgebra relacional 101. Assim, representa a quantidade de vezes que o valor aparece na bag .
O primeiro ponto é em cima da operação de adicionar um elemento a uma bag. E isso tem ainda 2 desdobramentos:
- quando já existia um elemento equivalente na bag (ie, )
- quando o elemento não existia anteriormente na bag (ie, )
Bem, vamos lá. No caso de que já tem elementos, vamos fazer uma simples manobra:
Onde iremos remover um elemento no conjunto e adicionar outro. O elemento a ser removido? Bem, se é o equivalente de , então vamos ter que , logo iremos remover esse elemento. E adicionar? Bem, como , e após a adição de na bag ele aumenta em 1 a multiplicidade, vou adicionar :
E no caso da adição de elementos que não existem? Bem, nesse caso, vamos só adicionar o novo elemento:
A operação de remoção é o inverso: se , então eu só removo do conjunto, caso contrário removo e acrescento .
Conjuntos como bags?
Ok, e agora, em relação a conjuntos, como faremos? A priori, um conjunto pode ser modelado como uma bag, uma bag muito específica! Todo elemento tem multiplicidade 1!
Mas como podemos fazer um mapeamento da adição de elementos em conjuntos na bag? Bem, vamos ver aqui…
Ao adicionar um elemento em um conjunto, temos duas opções:
- o elemento já pertence ao conjunto
- o elemento não pertence ao conjunto
Para o caso em que o elemento já pertencer ao conjunto, acontece uma particularidade muito interessante:
Ou seja, nessa situação, eu preciso manter a bag intacta. Agora, no caso de não existir? Nesse caso, o conjunto muda:
Nesse caso, uma “soma” simples na bag funciona, pois fazendo isso a multiplicidade de vai sair de 0 para 1.
Função de mapeamento
De conjuntos para bags:
De bags para conjuntos: