Relações
Como já apresentamos no começa da disciplina uma relação R cria associações entre dois elementos. Uma relação nos inteiros poderia definir associações tais como:
1 R 3 , 4 R 6 , 12 R 15 e 7 R 5
Porém, numa visão formal mais profunda, essas associações são tratadas meramente como pares ordenados. Assim, a relação R que apresentamos teria os pares:
(1,3) , (4,6) , (12,15) e (7,5)
Neste exemplo, usamos pares (2-tuplas), mas, de forma mais geral, as relações matemá-ticas podem conter n-tuplas quaisquer, como destacamos na definição a seguir:
Uma relação (n-ária) é um conjunto de n-tuplas obtidas de um mesmo produto
car-tesiano A1 A2 ... An.
Alternativa: uma relação é um subconjunto de um produto cartesiano. Por isso, pode-mos representar o tipo de uma relação assim: R A1 A2 ... An .
A quantidade de conjuntos envolvidos no produto cartesiano pode ser usado para dar classificações mais específicas às relações:
Se forem dois, chamamo-la de relação binária Se forem três, chamamo-la de relação ternária Para n qualquer, chamamo-la de relação n-ária
1. Relações Binárias
Uma relação binária de A em B é todo conjunto R tal que R A B. Neste caso, tal como nas funções, chamamos:
A de domínio da relação, e B de contradomínio da relação.
Exemplos: Relações binárias de A em B, considerando A = { a, b, c, d, e } e B = { 1, 2, 3, 4 }:
R1 = { (a,1), (a,2), (d,3) } R2 = { }
R3 = { (b,4) }
R4 = { (a,1), (b,1), (b,2), (c,3), (c,4), (d,2), (e,1), (e,4) }
Também podemos representar uma relação com diagramas similares ao que usamos nas funções. Como exemplo, vamos representar a relação R4 anterior:
As relações, no entanto, são mais gerais do que as funções. Quer dizer, toda função de A em B pode ser vista como uma relação de A em B, mas o contrário não é verdade.
Por outro lado, uma relação R de A em B (R A B) é uma função de A em B (R : A B) sse ela obedecer a restrição adicional de que cada elemento de A tem que estar associado a um único elemento de B.
o Não pode ter elemento de A desassociado
o Não pode ter elemento de A associado a mais de um elemento de B
Exemplo: Seja a função f : {1,2,3,4} {1,2,...,10}, onde f(x)=x+2. Esta função pode ser vista simplesmente como a relação abaixo:
f = {(1,3), (2,4), (3,5), (4,6)}.
Muitas vezes representamos relações binárias especificando um “teste” ou, mais preci-samente, um critério que precisa ser satisfeito para que um par (2-upla) pertença à rela-ção. Podemos usar uma notação de compreensão de conjuntos nesse caso.
Exemplo:
Sejam A = {1, 2, 5} e B = {3, 4}. São relações de A em B:
R5 = { (x,y) | x < y }
= { (1,3), (1,4), (2,3), (2,4) }
Essa é a relação que possui pares em que o primeiro elemento (vindo de A) é menor do que o segundo elemento (vindo de B)
R6 = { (x,y) | x é divisor de y }
= { (1,3), (1,4), (2,4) }
Essa é a relação que registra os números de A que são divisores de números de B
R7 = { (x,y) | |x–y|=1 } = { (2,3), (5,4) }
2. Relações em um Conjunto
Uma relação em um conjunto A é uma relação binária de A em A (ou seja, é um con-junto R tal que R A A).
Exemplos: Seja A = { 1, 2, 3, 4 }, as relações abaixo são relações em A:
R1 = { (1,1), (2,4), (4,3) } R2 = { (x,y) | x < y }
= { (1,2), (1,3), (1,4), (2,3), (2,4), (3,4) } R3 = { (x,y) | x é divisor de y }
= { (1,1), (1,2), (1,3), (1,4), (2,2), (2,4), (3,3), (4,4) }
Podemos representar esse tipo de relação com um grafo direcionado (digrafo) em que: Os elementos de A são os vértices (nós) do grafo
Um arco (aresta) sai de x para y se e somente se existe o par (x,y) na relação
Exemplos:
Relação R1 (dada antes) representada como um grafo:
Relação R2 representada como um grafo:
3. Tipos Especiais de Relações em um Conjunto
Vamos começar classificando em quatro tipos mais simples:
1) Uma relação R em A é reflexiva sse, para todo x A, temos que (x,x) R No grafo: todo vértice tem um loop
Exemplo: relação reflexiva no conjunto {1, 2, 3}: Rr = { (1,1), (1,2), (2,2), (3,2), (3,3) }
2) Uma relação R em A é simétrica sse, para todos x, y A, temos que: se (x,y) R, então (y,x) R
No grafo: para cada arco, existe outro na direção oposta
Exemplo: relação simétrica no conjunto {1, 2, 3, 4}: Rs = { (1,2), (2,1), (2,3), (3,2), (2,2),
(3,1), (1,3), (2,4), (4,2) }
3) Uma relação R em A é anti-simétrica sse, para todos x, y A, temos: se x y e se (x,y) R, então (y,x) R
No grafo: se existe um arco entre vértices distintos, en-tão não pode haver outro na direção oposta (veja que loops podem existir).
Exemplo: relação anti-simétrica no conjunto {1, 2, 3, 4}:
Ra = { (1,2), (2,3), (2,4), (2,2), (3,3), (1,3), (4,1) }
4) Uma relação R em A é transitiva sse, para todos x,y,z A, temos: se (x,y) R e (y,z) R, então (x,z) R
No grafo: Sempre que existe um caminho de um vértice x para outro vértice y, e depois de y para z, existe também um arco direto de x
para z (como se fosse um atalho).
Exemplo: relação transitiva no conjunto {1, 2, 3, 4}: Rt = { (1,1), (1,2), (2,3), (1,3),
(3,4), (1,4), (2,4), (4,4) }
Um detalhe importante sobre os tipos de relações acima é que, em tese, eles são inde-pendentes entre si. Por exemplo, pode haver uma relação que não é anti-simétrica nem simétrica (dê um exemplo), e outra que é de ambos os tipos (tente descobrir – este é um caso especial). Por isso, você vai ser cobrado a julgar uma dada relação com relação aos quatro tipos (dizendo a relação é ou não de cada um deles) separadamente.
Tal como no caso das funções, que vamos cobrar para provar se é ou não injetiva, so-brejetiva e bijetiva, também podemos cobrar para provar se uma dada relação pertence a cada um dos quatros tipos acima.
Essas quatro são os tipos mais básicos. Porém, a partir delas, definimos dois outros tipos importantes de relações, que veremos nas próximas subseções.
3.1. Relações de Equivalência
Informalmente, são relações que têm propriedades similares às da igualdade (=). Esta relação é a “inspiração” para as relações de equivalência, digamos assim.
Formalmente, uma relação R em um conjunto A é chamada de relação de equivalência sse R for classificada como:
Exemplo: relação de equivalência no conjunto {a, b, c, d, e}
Req = { (a,a), (a,e), (e,a), (e,e), (b,b), (b,c), (c,b), (c,c), (c,d), (d,c), (d,d), (b,d), (d,b) }
Representada como um grafo, uma relação de equivalência tem loops em todos os vérti-ces (porque é reflexiva). Além disso, os vértivérti-ces se agrupam em “ilhas”, compostas de vértices interligados com todas as arestas possíveis, em todas as direções (consequência da transitividade e da simetria). Os vértices em cada uma dessas “ilhas” formam o que chamamos de classe de equivalência da relação. Vamos começar definindo a classe de equivalência (“ilha”) de um dado elemento (vértice):
Dada uma relação R no conjunto A, a classe de equivalência de um elemento x de A, representada como [x], é o conjunto de elementos associados a x na relação R:
[x] = { a | (x,a) R }
No grafo, é o conjunto de nós para os quais x “aponta”
Exemplos: classes de equivalência da relação Req do exemplo anterior o [a] = {a,e}
o [b] = {b,c,d} o [c] = {b,c,d} o [d] = {b,c,d} o [e] = {a,e}
Veja que vários elementos têm classes de equivalência são iguais.
Agora, vamos definir o conjunto das classes de equivalência de uma relação R em A como o conjunto das classes de equivalências de todos os elementos de A:
Como estamos definindo um conjunto de classes, apenas as classes distintas en-tre si são consideradas. Repetições são desprezadas.
Exemplo: O conjunto das classes de equivalências da relação Req dada antes: { {a,e}, {b,c,d} }
Seguem alguns exemplos relações de equivalências que vimos nesta disciplina: Igualdade, entre números inteiros
Igualdade, entre conjuntos
Equivalência lógica, no conjunto das fórmulas proposicionais A relação “tem igual cardinalidade”, entre conjuntos
Relação de congruência módulo 3 (ou com algum outro módulo fixo), entre nú-meros inteiros.
3.2. Relações de Ordem
Informalmente, são relações que têm propriedades similares às do menor ou igual () entre números inteiros.
Uma relação R em um conjunto A é chamada de relação de ordem (ou, simplesmente, una ordem parcial) sse R for classificada como:
o reflexiva, o anti-simétrica e o transitiva.
É difícil explicar como identificar uma ordem parcial olhando apenas para o grafo. Recomenda-se testar cada uma das três propriedades da forma explicada na seção anterior. Se satisfi-zer as três propriedades, será uma relação de ordem.
Rord = { (x,y) | x y }
= { (1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4), (4,4) } (comparar com figura na página anterior)
Algumas relações de ordem que vimos nesta disciplina: Menor ou igual, entre números inteiros
Conseqüência lógica (a relação que existe entre premissas e conclusão de uma regra de inferência), entre fórmulas proposicionais
Relação “é subconjunto de”, entre conjuntos Relação “divide”, entre números inteiros
Uma relação de ordem importante, que é definida entre pares ordenados de um conjunto A é a chamada ordem lexicográfica, inspirada na ordem alfabética. Vamos exemplifi-car com pares de inteiros. Representando a relação de ordem lexicográfica entre pares de inteiros com o símbolo lexi, definimos que:
(a,b)lexi(c,d)se e somente se (a < c) ou (a=c e b d)
Exemplos:
(1,2) lexi (3,4), porque 1 < 3 (1,2) lexi (1,3), porque 1=1 e 2 3 (1,2) lexi (1,2), porque 1=1 e 2 2
Uma ordem lexicográfica também pode ser definida para pares de elementos não-inteiros de um conjunto A. Para isso, na definição acima, considere “a<c” como “ab e ab” e use qualquer relação de ordem sobre A no lugar da relação (menor ou igual).
4. Relações N-árias (Extra)
Nesta seção, falamos superficialmente, das relações n-árias, que são relações envolven-do n conjuntos. Formalmente, uma relação n-ária é qualquer conjunto de n-tuplas obti-das de um dado produto cartesiano entre n conjuntos.
Este tipo de relação tem importância na Computação, pois elas são o fundamento teóri-co para os bancos de dados relacionais (que são, de longe, os mais usados hoje).
Uma explicação alternativa para quem sabe Python. Imagine que você queira criar um sistema de cadastro dos clientes de uma loja para guardar nome, data de nascimento e o endereço. Qual estrutura de dados você usaria para armazenar cada entrada nesse cadas-tro? Segue uma idéia:
As informações de cada cliente poderiam ser dadas por uma 5-tupla de Python (a, b, c, d, e)
onde cada posição tem uma “propriedade” ou “atributo” do cliente: o a seria uma string com o nome do cliente
o b seria um inteiro com a data (dia do mês) do nascimento
o c seria o mês de nascimento
o d seria o ano de nascimento
o e seria a string com o endereço
Então, conceitualmente, o objetivo do seu programa é manter um conjunto des-sas 5-uplas. Você poderia, inclusive, usar o tipo de dado set (“conjunto”) de Python.
Desta forma, você teria o cadastro de clientes modelado exatamente como uma relação 5-ária matemática.
Em um banco de dados (BD) relacional a idéia é a mesma: do ponto de vista conceitual, ele guarda relações n-árias (conjuntos de n-tuplas). Porém, há uma nomenclatura um pouco diferente:
A figura abaixo ilustra a idéia:
Assim, a estrutura que representamos antes como conjuntos de tuplas de Python poderia ser representada meramente como uma tabela de um BD relacional com estes atributos:
nome_cliente: este seria o atributo para guardar o nome do cliente dia_nascimento: um inteiro com a data (dia do mês) do nascimento mes_nascimento: inteiro com o mês do nascimento
ano_nascimento: inteiro com o ano de nascimento endereço: seria a string com o endereço
“Deixe o ímpio o seu caminho, e o homem maligno os seus pensamentos,
e se converta ao SENHOR, que se compadecerá dele;
torne para o nosso Deus, porque grandioso é em perdoar.”