<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Random Bits</title>
    <description>The latest articles on DEV Community by Random Bits (@compdepressivo1).</description>
    <link>https://dev.to/compdepressivo1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1446719%2Feb57a6b2-59e6-4062-a3cf-53fbf16e2305.png</url>
      <title>DEV Community: Random Bits</title>
      <link>https://dev.to/compdepressivo1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/compdepressivo1"/>
    <language>en</language>
    <item>
      <title>Como andam as suas Relações?</title>
      <dc:creator>Random Bits</dc:creator>
      <pubDate>Wed, 24 Apr 2024 12:41:40 +0000</pubDate>
      <link>https://dev.to/compdepressivo1/como-andam-as-suas-relacoes-2p86</link>
      <guid>https://dev.to/compdepressivo1/como-andam-as-suas-relacoes-2p86</guid>
      <description>&lt;h1&gt;
  
  
  Relações
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Definição de Oxford&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;relação&lt;br&gt;
substantivo feminino&lt;br&gt;
1.vinculação de alguma ordem entre pessoas, fatos ou coisas; ligação, conexão, vínculo. "uma r. entre os dois crimes"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pela definição da para se ter uma ideia, 'vinculacão de alguma ordem entre coisas'. Matematicamente falando, dentro da teoria dos conjuntos, uma &lt;strong&gt;relação binária em um conjunto A pode ser descrita como R(x,y) que pode ser verdadeira ou falsa para cada par ordenado (x,y) de elementos de A.&lt;/strong&gt; Não se preocupe pois vamos destrinchar essa afirmacão acima.&lt;br&gt;
Vamos entender através de um exemplo. Pense na relacão R, &lt;em&gt;x divide y&lt;/em&gt;, ou seja, y é múltiplo de x. Agora pense num conjunto &lt;code&gt;A = {2, 3, 4, 5, 6}&lt;/code&gt;, a relação R, &lt;em&gt;x divide y&lt;/em&gt;, só é verdade para alguns pares ordenados desse conjunto A. Vejamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o par (2,3) pertence à relacao R ? Falso, pois 2 não divide 3&lt;/li&gt;
&lt;li&gt;o par (2,4) pertence. Pois 2 divide 4&lt;/li&gt;
&lt;li&gt;o par (2,5) não pertence.&lt;/li&gt;
&lt;li&gt;o par (3,6) pertence, pois 6 é múltiplo de 3.&lt;/li&gt;
&lt;li&gt;o par (2,6) também pertence pelo mesmo motivo acima.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja, apenas os pares: &lt;code&gt;{(2,4), (2,6), (3,6)}&lt;/code&gt; pertencem à relação R, &lt;em&gt;x divide y&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Disclaimer: estou usando uma versão naive de teoria dos conjuntos. Os exemplos aqui demonstrados são todos finitos.&lt;/p&gt;

&lt;p&gt;Formalmente falando: seja A um conjunto finito, uma relacão (binária) em A é um subconjunto de &lt;code&gt;A x A&lt;/code&gt;. Ou seja, um subcojunto do &lt;em&gt;produto cartesiano&lt;/em&gt; de A com A.&lt;br&gt;
Essa operacão &lt;code&gt;produto cartesiano&lt;/code&gt; se dá da seguinte forma:&lt;br&gt;
Imagine um conjunto A = {1, 2, 3}, o produto cartesiano de A por A, &lt;code&gt;A x A&lt;/code&gt; resulta no conjunto&lt;br&gt;
&lt;code&gt;A x A = {(1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Seja &lt;code&gt;A = {1, 2} e B = {a, b, c}&lt;/code&gt;, &lt;code&gt;A x B = {(1,a),(1,b),(1,c),(2,a),(2,b),(2,c)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ora, por que uma Relação G em A está contida em &lt;code&gt;A x A&lt;/code&gt;? Bem, como &lt;code&gt;A x A&lt;/code&gt; produz &lt;em&gt;TODOS os possíveis pares ordenados&lt;/em&gt; &lt;code&gt;(x,y)&lt;/code&gt;, obviamente qualquer relacão em A vai estar contida no seu produto cartesiano.&lt;br&gt;
Os elementos individuais, por ex., (1,a) ou (2,c), são chamados de &lt;strong&gt;tupla&lt;/strong&gt;. As relações podem ter várias &lt;em&gt;cardinalidades&lt;/em&gt;, ou seja, a quantidade de elementos por tupla.&lt;br&gt;
Uma relacão binária tem tuplas de tamanho 2, ternárias 3, e assim por diante.&lt;/p&gt;

&lt;p&gt;O custo dessa operacão é O(m x n) onde m e n são os tamanhos dos conjuntos. Em outras palavras, uma operacao quadrática.&lt;/p&gt;

&lt;p&gt;Ele faz a combinação de todos os elementos de 2 ou mais conjuntos.&lt;br&gt;
Em pseudo Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;prod_cartesiano&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; 
   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Algumas definições importantes
&lt;/h3&gt;

&lt;p&gt;Seja G uma relacao binária em A, então:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;G é reflexiva&lt;/code&gt; se para todo x pertencente à A, (x,x) pertence à G. Por ex., Se G for uma relacão sobre {1, 2}, e G for reflexiva, significa que G possui (1,1) e (2,2) como elementos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;G é simétrica&lt;/code&gt; se para todo x e y pertencente a G, se (x,y) estiver em G, implica que (y,x) também estará.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;G é antissimétrica&lt;/code&gt; se, (x,y) pertence a G e (y,x) pertence a G, isso significa que x = y.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;G é transitiva&lt;/code&gt; se (x,y) pertence à G e (y,z) pertence à G, implica que (x,z) está em G.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Operacoes Clássicas
&lt;/h1&gt;

&lt;p&gt;Seja G um grafo cujos vértices &lt;code&gt;V&lt;/code&gt; são &lt;code&gt;{a, b, c, d}&lt;/code&gt; e as arestas estão representadas na relação &lt;code&gt;R&lt;/code&gt;: &lt;code&gt;{(a,b), (a,c), (b,c), (c,d)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r1o3c8fhtqhfdktsrj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r1o3c8fhtqhfdktsrj7.png" alt="Grafo como Relação" width="432" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fecho Reflexivo
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;fecho reflexivo&lt;/code&gt; visa adicionar novas tuplas na relação de forma que para todo x pertencente à V, (x,x) está em R. &lt;br&gt;
Aplicando o fecho reflexivo na relação R acima, temos que adicionar as tuplas: &lt;code&gt;{(a,a), (b,b), (c,c), (d,d)}&lt;/code&gt; na relação R.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;R(reflexivo) = {(a,a)*, (a,b), (a,c), (b,b)*, (b,c), (c,c)*, (c,d), (d,d)*}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi48p6hxfjjnj44jl58n0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi48p6hxfjjnj44jl58n0.png" alt="Fecho Reflexivo" width="567" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fecho Transitivo
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;fecho transitivo&lt;/code&gt; visa adicionar novas tuplas na relação de forma que, se (a,b) e (b,c) estiverem na relação, então precisamos adicionar (a,c) na relação, pois existe um caminho levando de a para b e de b para c.&lt;br&gt;
&lt;code&gt;R(transitivo) = {(a,b), (a,c), (b,c), (c,d), (a,d)*, (b,d)*}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explicação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;(a,d)&lt;/code&gt; entra na relação pois: &lt;code&gt;(a,c) e (c,d)&lt;/code&gt; estão na relação R&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(b,d)&lt;/code&gt; entra na relação pois: &lt;code&gt;(b,c) e (c,d)&lt;/code&gt; estão na relação R&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obs.: A implementação do fecho transitivo é a mais complicadinha e fica de exercício para o leitor =)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpjqj0mvt9sh78uq5ca8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpjqj0mvt9sh78uq5ca8.png" alt="Fecho Transitivo" width="491" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fecho Simétrico
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;fecho simétrico&lt;/code&gt; visa adicionar novas tuplas de maneira que, se (a,b) está em R, logo (b,a) também estará no fecho simétrico de R de modo que a != b.&lt;br&gt;
No nosso exemplo acima, precisaremos adicionar as seguintes tuplas na relação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;(b,a)&lt;/code&gt; entra no fecho pois: &lt;code&gt;(a,b)&lt;/code&gt; pertence à R&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(c,a)&lt;/code&gt; entra no fecho pois &lt;code&gt;(a,c)&lt;/code&gt; está em R&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(c,b)&lt;/code&gt; entra no fecho pois &lt;code&gt;(b,c)&lt;/code&gt; está em R&lt;/li&gt;
&lt;li&gt;Finalmente, &lt;code&gt;(d,c)&lt;/code&gt; está no fecho simétrico pois &lt;code&gt;(c,d)&lt;/code&gt; está em R.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sugiro vocês implementarem essas operações na linguagem de programação de vossa preferência.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08c2qcfxvnxdvs9utiro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08c2qcfxvnxdvs9utiro.png" alt="Fecho Simétrico" width="466" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções como relações
&lt;/h2&gt;

&lt;p&gt;Funções também podem ser vistas como relações, obviamente nem toda relação configura-se como função, porém &lt;strong&gt;toda função pode ser escrita como uma relação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vejamos o seguinte exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Seja a função f: f(x) = x + 1 definidas para os Naturais N = {0,1,2,3,4,5,...}&lt;/code&gt;, podemos especificar uma relação R que contem todos os pares (x,y) que correspondem à função.&lt;br&gt;
&lt;code&gt;R = {(0,1), (1,2), (2,3), (3,4), (4,5), (5,6), ... }&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bancos de dados relacionais
&lt;/h2&gt;

&lt;p&gt;No fim das contas, uma relação pode ser vista como uma tabela, tal qual os bancos de dados relacionais. Na verdade, toda a teoria matemática por trás dos bancos de dados relacionais foi baseada na teoria dos conjuntos e nas relações. O que temos é uma álgebra de relações, com operações específicas para filtrar linhas e colunas e fazer 'join' de relações ou tabelas (quando possível).&lt;br&gt;
No próximo post eu vou focar um pouco mais na &lt;strong&gt;Álgebra Relacional&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusões
&lt;/h1&gt;

&lt;p&gt;Bem, chegamos ao fim de mais um Post aqui nesse blog aleatório. Como podemos ver as relações, no contexto da teoria dos conjuntos, tem aplicações práticas em diversas áreas, inclusive na lógica relacional (Alloy). Podemos representar diversas estruturas e até mesmo bancos de dados inteiros utilizando esse tipo de abstração. Um beijo de luz. &lt;/p&gt;

</description>
      <category>math</category>
      <category>set</category>
      <category>theory</category>
      <category>graph</category>
    </item>
  </channel>
</rss>
