In [1]:
from relaciones import *
Para definir una relación, podemos o bien dar un conjunto de parejas, o bien un conjunto de parejas y el universo donde están los elementos de los pares. En caso de no proporcionar el universo, se tomará como universo el conjunto de todos los valores que aparecen en las parejas.
Por ejemplo, definamos en el conjunto $\{0,1,\ldots,11\}$ la relación de ser congruentes módulo 5
In [2]:
u =set(range(12))
rl = set((a,b) for a in u for b in u if (a-b)%5 ==0)
In [3]:
r =relacion(rl,u)
Sabemos que esta relación es de equivalencia
In [4]:
r.es_equivalencia()
Out[4]:
Y podemos calcular sus clases de equivalencia (hemos congelado las clases para poder crear un conjunto de conjuntos)
In [5]:
r.clases_equivalencia()
Out[5]:
El universo es un atributo de la clase, y se puede acceder a él de la siguiente forma
In [6]:
r.universo
Out[6]:
También podemos determinar si dos elementos están relacionados, bien usando el método rel
o llamando a la relación con los dos elementos
In [7]:
r.rel(1,1)
Out[7]:
In [8]:
r(1,6)
Out[8]:
In [9]:
(1,1) in r.rels
Out[9]:
Si dibujamos las relaciones entre los elementos, aparecerán claramente las clases de equivalencia
In [10]:
r.pinta()
Out[10]:
Esta relación no es de orden
In [11]:
r.es_orden()
Out[11]:
Pues no es antisimétrica
In [12]:
r.es_antisimetrica()
Out[12]:
Veamos ahora como ejemplo el conjunto de los divisores de 12 con la relación de divisibilidad
In [13]:
d = set(a for a in range(1,13) if 12%a ==0)
In [14]:
rd =relacion(set((a,b) for a in d for b in d if b%a ==0))
Podemos dibujar el diagrama de Hasse como sigue
In [15]:
rd.hasse()
Out[15]:
O bien pintar todas las relaciones
In [16]:
rd.pinta()
Out[16]:
Claramente esta relación es de orden, y no es un orden total
In [17]:
rd.es_orden()
Out[17]:
In [18]:
rd.es_orden_total()
Out[18]:
Los elementos notables se calculan con los métodos que tienen nombres acordes a ellos
In [19]:
rd.maximales(set({2,3,6}))
Out[19]:
In [20]:
rd.maximales(set({2,3}))
Out[20]:
O incluso podemos destacar esos elementos en el dibujo de relaciones
In [21]:
rd.pinta(rd.mayorantes(set({2,3})))
Out[21]:
In [22]:
rd.minimales(set({2,3}))
Out[22]:
In [23]:
rd.minimo(set({2,4}))
Out[23]:
Continuamos con los divisores de 12
In [24]:
rd.es_reticulo_inferior()
Out[24]:
In [25]:
rd.es_reticulo_superior()
Out[25]:
In [26]:
rd.complemento(4)
Out[26]:
In [27]:
rd.cero
Out[27]:
In [28]:
rd.uno
Out[28]:
In [29]:
rd.es_complementado()
Out[29]:
Veamos qué elementos no tienen complemento
In [30]:
[a for a in rd.universo if rd.complemento(a)==None]
Out[30]:
Ahora damos un ejemplo que sí es complementado, de hecho un álgebra de Boole
In [31]:
u = set(a for a in range(1,31) if 30%a==0)
In [32]:
u
Out[32]:
In [33]:
p = set((a,b) for a in u for b in u if b%a ==0)
In [34]:
r = relacion(p)
In [35]:
r.es_distributivo()
Out[35]:
In [36]:
r.atomos()
Out[36]:
In [37]:
r.es_algebra_Boole()
Out[37]:
In [38]:
r.pinta(r.atomos())
Out[38]:
Podemos definir retículos con los divisores de un entero o bien dar un conjunto ordenado por la relación de divisibilidad. Para ellos utilizaremos divisores
In [39]:
r = divisores(24)
In [40]:
r.hasse()
Out[40]:
In [41]:
_.rels
Out[41]:
In [42]:
r = divisores({0,1,2,3,5})
In [43]:
r.pinta()
Out[43]:
In [44]:
r.hasse()
Out[44]:
In [45]:
r.es_orden()
Out[45]:
In [46]:
r.es_orden_total()
Out[46]:
In [47]:
r.es_reticulo()
Out[47]:
In [48]:
r.es_subreticulo({0,1,2,3})
Out[48]:
In [49]:
r.es_distributivo()
Out[49]:
In [50]:
r.es_complementado()
Out[50]:
In [51]:
r = divisores({1,0,2,4,3})
In [52]:
r.hasse()
Out[52]:
In [53]:
r.es_distributivo()
Out[53]:
In [54]:
r.es_complementado()
Out[54]:
Retículo que no es distributivo ni complementado
In [55]:
r=divisores({1,0,2,18,9,3})
In [56]:
r.hasse()
Out[56]:
In [57]:
r.es_complementado()
Out[57]:
In [58]:
r.es_distributivo()
Out[58]:
In [59]:
[s for s in r.universo if r.complemento(s)==None]
Out[59]:
In [60]:
r.es_reticulo()
Out[60]:
Retículo distributivo, no complementado
In [61]:
r = divisores({1,2,4})
In [62]:
r.hasse()
Out[62]:
In [63]:
r.es_distributivo()
Out[63]:
In [64]:
r.es_complementado()
Out[64]:
In [65]:
r=divisores({0,1,2,3,4,6})
In [66]:
r.hasse()
Out[66]:
In [67]:
r.es_distributivo()
Out[67]:
In [68]:
r.es_complementado()
Out[68]: