Um conjunto é uma coleção de objetos distintos. Esses objetos são membros ou elementos de um conjunto. O conjunto pode conter elementos bastante distintos entre si e os objetos podem ser bastante abstratos.
Conjuntos podem ser grandes, infinitos, conter um único membro ou mesmo serem vazios. Um conjunto pode conter outros conjuntos, de forma que um conjunto também pode ser membro de outros conjuntos.
Um conjunto pode ser bem definido mesmo que não conheçamos todos os seus membros. Por exemplo, o conjunto dos habitantes de Salvador. O interessante da Teoria dos Conjuntos, aliás, é explorar o que podemos fazer com conjuntos independentemente de quais são seus membros.
Por convenção matemática, os conjuntos recebem letras maiúsculas como nomes: conjunto \(A\) de autores da literatura portuguesa; conjunto \(F\) de fonemas do francês, etc.
Além disso, quando queremos especificar os membros de um conjunto temos três opções:
Voltaremos às regras recursivas mais tarde, após aprendermos um pouco sobre lógica.
É importante mencionar que, para conjuntos, apenas consideramos os membros distintos. Dessa forma, \(\{1,1,2,3,4,4\} = \{1,2,3,4\}\). Aliás, se dois conjuntos \(A\) e \(B\) possuem exatamente os mesmos membros, dizemos que eles são conjuntos idênticos, \(A=B\)
O número de membros que pertencem a um dado conjunto \(A\) é a cardinalidade de \(A\), representada por \(|A|\). Dessa forma, se \(A = \{a,e,i,o,u\}\), \(|A| = 5\).
Quando todo membro de um conjunto \(A\) é também membro de \(B\) dizemos que \(A\) é um subconjunto de \(B\), ou \(A \subseteq B\). Perceba que se todo membro de \(A\) é membro de \(B\) é possível que \(A = B\). Ou seja, \(A\) pode ser subconjunto dele próprio. A notação \(A \subseteq B\) dá conta disso. Porém, se quisermos deixar claro que estamos falando de um subconjunto \(A\) que não possui todos os elementos de \(B\), utilizamos a notação \(A \subset B\), e dizemos que \(A\) é um subconjunto próprio de \(B\).
Exemplos:
Quando \(A\) não é um subconjunto de \(B\), utilizamos as notações \(A \not\subset B\) ou \(A \not\subseteq B\) conforme o caso.
Para pensar: Considerando que membros de conjuntos são diferentes de conjuntos, mas que conjuntos podem ser membros de outros conjuntos, as afirmações abaixo são verdadeiras se \(A = \{c,\{d\}\}\):
Portanto, embora conjuntos podem ter outros conjuntos como membros, um subconjunto \(A\) de um conjunto \(B\) é diferente de um conjunto \(A\) que seja membro de um conjunto \(B\).
Um conjunto potência (power set) \(p(A)\) é o conjunto contendo todos os subconjuntos de \(A\). Ele possui a cardinalidade \(2^n\), em que \(n\) é o número de membros de A.
Considerando que \(A = \{a,b\}\), seus subconjuntos são:
Logo, \(p(A) = \{\{a,b\},\{a\},\{b\},\emptyset\}\) e \(|p(A)| = 2^2 = 4\).
Com a noção de subconjuntos conseguimos derivar outros conjuntos a partir de um único conjunto. Com as noções de união e intersecção conseguimos formar novos conjuntos a partir de dois conjuntos.
A união de dois conjuntos \(A\) e \(B\) corresponde a um conjunto com todos os membros de \(A\) e todos os membros de \(B\). A notação é \(A \cup B\). Dessa forma, se \(A = \{a,e,k\}\) e \(B = \{m,t,u\}\), \(A \cup B = \{a,e,k,m,t,u\}\).
A intersecção de dois conjuntos \(A\) e \(B\) corresponde a um conjunt com apenas os membros em comum entre \(A\) e \(B\). A notação é \(A \cap B\). Dessa forma, se \(A = \{i,j,k\}\) e \(B = \{k,l,m\}\), \(A \cap B = \{k\}\).
Importante: união e intersecção são operações que geram conjuntos, não membros de conjuntos. Dessa forma, seguindo acima \(A \cap B = \{k\}\) e \(A \cap B \neq k\)
Podemos definir logicamente união e intersecção da seguinte forma:
Além das operações de união e intersecção, temos a operação de subtração, veja a definição lógica:
\(A-B = \{x | x \in A\) e \(x \not\in B\}\)
Isso significa todos os membros do conjunto \(A\) que não pertencem ao conjunto \(B\). \(A-B\) também é conhecido como o complemento relativo de \(A\) e \(B\). Quando queremos um conjunto que inclui todo o universo menos o conjunto \(A\) queremos o complemento de \(A\), que é notado por \(A'\):
\(A' = \{x | x \not\in A\} = U - A\)
R possui algumas funções que nos permitem lidar com conjuntos. Concretamente temos:
union(A,B)
- retorna (como vetor) o conjunto \(A \cup B\)intersect(A,B)
- retorna (como vetor) o conjunto \(A \cap B\)setequal(A,B)
- retorna TRUE
se \(A=B\)setdiff(A,B)
- retorna o conjunto \(A - B\)is.element(x, A)
ou x %in% A
- retorna TRUE
se \(x \in A\)Vamos ver alguns exemplos:
# Vamos criar os conjuntos caes.A e caes.B que serão conjuntos de cães
caes.A <- c("Totó", "Julieta", "Brutus", "Luna")
caes.B <- c("Lulu", "Julieta", "Átila")
# Vejamos a união de caes.A e caes.B
union(caes.A,caes.B)
## [1] "Totó" "Julieta" "Brutus" "Luna" "Lulu" "Átila"
# Agora, a intersecção de A e B:
intersect(caes.A, caes.B)
## [1] "Julieta"
# Vamos ver se Luna pertence ao conjunto caes.B:
"Luna" %in% caes.B
## [1] FALSE
# E no caes.A?
"Luna" %in% caes.A
## [1] TRUE
# Vamos ver caes.B - caes.A:
setdiff(caes.B,caes.A)
## [1] "Lulu" "Átila"
Um conceito paralelo ao de conjuntos é o de par ordenado. Ao passo que conjuntos não possuem ordem e os elementos são únicos, pares ordenados permitem elementos repetidos e possuem ordenamento.
\(<a,b>\) é um par ordenado em que o primeiro elemento é \(a\) e o segundo é \(b\).
Além de pares ordenados, podemos ter tuplas (3 elementos), quádruplas, etc.
Se temos dois conjuntos \(A\) e \(B\), podemos formar pares ordenados a partir de seus membros a partir do produto cartesiano:
\(A \times B = \{<a,b>|a \in A\) e \(b \in B\}\)
Vamos supor que \(A = \{a,b\}\) e \(B = \{1,2,3\}\), dessa forma, \(A \times B = \{<a,1>,<a,2>,<a,3>,<b,1>,<b,2>,<b,3>\}\)
Em R podemos criar tabelas (data.frame) com produtos cartesianos da seguinte forma:
# Criar os conjuntos A e B
A <- c("a","b")
B <- c(1,2,3)
# Criar o data.frame com os pares ordenados a partir do produto cartesiano entre A e B:
expand.grid(A,B)
## Var1 Var2
## 1 a 1
## 2 b 1
## 3 a 2
## 4 b 2
## 5 a 3
## 6 b 3
Uma relação é um subconjunto do produto cartesiano de dois conjuntos, logo \(R \subseteq A \times B\). Podemos representar uma relação entre membros de \(A\) e de \(B\) como \(aRb\) ou \(Rab\).
Uma função é um tipo especial de relação. Uma função é uma relação do tipo \(aRb\) em que:
Em outras palavras, nunca teremos mais de um par com um elemento de \(A\), mas podemos ter mais de um par com o mesmo elemento de \(B\). Além disso, todo elemento do conjunto \(A\) precisa estar pareado com \(B\), mas nem todo elemento de \(B\) precisa estar pareado com \(A\).
Considerando \(A = \{a,b\}\) e \(B = \{1,2,3\}\), temos que:
Representamos funções de várias formas:
Em R podemos criar funções:
# função que retorna o dobro de um número x fornecido
f <- function(x) 2 * x
# chamando a função para o número 4
f(4)
## [1] 8
# podemos aplicar a função a todo um vetor:
f(c(1,2,3,4,5))
## [1] 2 4 6 8 10
# podemos criar uma tabela com todos os valores de y para x sendo um número de 1 a 10:
x <- 1:10
y <- f(x)
data.frame(cbind(x,y))
## x y
## 1 1 2
## 2 2 4
## 3 3 6
## 4 4 8
## 5 5 10
## 6 6 12
## 7 7 14
## 8 8 16
## 9 9 18
## 10 10 20
O conjunto de valores retornados por uma função (os valores de b em \(<a,b>\)) é denominado imagem. Dessa foram, podemos definir conjuntos a partir de funções.
Como aprendemos funções apenas com números na escola não pensamos que o conceito de função pode se aplicar a quaisquer coisas. Quando mudamos de canal na televisão, por exemplo, temos uma função que liga um número N a um canal C \(F: N \rightarrow C\). Mais de um número pode resultar no mesmo canal (acontecia em alguns serviços de tv a cabo antigos, por exemplo), mas nunca um mesmo número resulta em dois canais.
Em nossa pesquisa é muito saudável tentar traduzir os problemas para essa linguagem matemática de funções, conjuntos, pares e relações. Isso nos revelará uma série de possibilidades sobre como trabalhar com o que temos.