Relaciones de equivalencia
Usando el tipo de las relaciones binarias, definir las funciones
esEquivalencia :: Ord a => Rel a -> Bool
tal que esEquivalencia r
se verifica si la relación r
es de equivalencia. Por ejemplo,
λ> esEquivalencia (R ([1,3,5],[(1,1),(1,3),(3,1),(3,3),(5,5)])) True λ> esEquivalencia (R ([1,2,3,5],[(1,1),(1,3),(3,1),(3,3),(5,5)])) False λ> esEquivalencia (R ([1,3,5],[(1,1),(1,3),(3,3),(5,5)])) False
Soluciones
Se usarán las funciones
-
reflexiva
definida en el ejercicio Relaciones reflexivas, -
simetrica
definida en el ejercicio Relaciones simétricas y -
transitiva
definida en el ejercicio Relaciones transitivas.
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import Relaciones_binarias (Rel(R)) import Relaciones_reflexivas (reflexiva) import Relaciones_simetricas (simetrica) import Relaciones_transitivas (transitiva) esEquivalencia :: Ord a => Rel a -> Bool esEquivalencia r = reflexiva r && simetrica r && transitiva r
Soluciones en Python
from typing import TypeVar from src.Relaciones_binarias import Rel, relacionArbitraria from src.Relaciones_reflexivas import reflexiva from src.Relaciones_simetricas import simetrica from src.Relaciones_transitivas import transitiva A = TypeVar('A') def esEquivalencia(r: Rel[A]) -> bool: return reflexiva(r) and simetrica(r) and transitiva(r)