Clausura simétrica
Usando el tipo de las relaciones binarias, definir la función
| 1 |    clausuraSimetrica :: Eq a => Rel a -> Rel a | 
tal que clausuraSimetrica r es la clausura simétrica de r; es decir, la menor relación simétrica que contiene a r. Por ejemplo,
| 1 2 |    λ> clausuraSimetrica (R ([1,3,5],[(1,1),(3,1),(1,5)]))    R ([1,3,5],[(1,1),(3,1),(1,5),(1,3),(5,1)]) | 
Comprobar con QuickCheck que clausuraSimetrica es simétrica.
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import Relaciones_binarias (Rel(R)) import Data.List (union) import Relaciones_simetricas (simetrica) import Test.QuickCheck clausuraSimetrica :: Eq a => Rel a -> Rel a clausuraSimetrica (R (u,g)) =   R (u, g `union` [(y,x) | (x,y) <- g]) -- La propiedad es prop_ClausuraSimetrica :: Rel Int -> Bool prop_ClausuraSimetrica r =   simetrica (clausuraSimetrica r) -- La función simetrica está definida en el ejercicio -- "Relaciones simétricas" que se encuentra en -- https://bit.ly/3zlO2rH -- La comprobación es --    λ> quickCheck prop_ClausuraSimetrica --    +++ OK, passed 100 tests. | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | from typing import TypeVar from hypothesis import given from hypothesis import strategies as st from src.Relaciones_binarias import Rel, relacionArbitraria from src.Relaciones_simetricas import simetrica A = TypeVar('A') def clausuraSimetrica(r: Rel[A]) -> Rel[A]:     (u, g) = r     return (u, list(set(g) | {(y, x) for (x,y) in g})) # Comprobación de equivalencia # ============================ # La propiedad es @given(st.integers(min_value=0, max_value=10)) def test_irreflexiva(n: int) -> None:     r = relacionArbitraria(n)     assert simetrica(clausuraSimetrica(r)) # La función simetrica está definida en el ejercicio # "Relaciones simétricas" que se encuentra en # https://bit.ly/3zlO2rH # La comprobación es #    > poetry run pytest -q Clausura_simetrica.py #    1 passed in 0.12s |