Relaciones reflexivas
Usando el tipo de las relaciones binarias, definir la función
| 1 |    reflexiva :: Eq a => Rel a -> Bool | 
tal que reflexiva r se verifica si la relación r es reflexiva. Por ejemplo,
| 1 2 |    reflexiva (R ([1,3],[(1,1),(1,3),(3,3)]))    ==  True    reflexiva (R ([1,2,3],[(1,1),(1,3),(3,3)]))  ==  False | 
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 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | module Relaciones_reflexivas where import Relaciones_binarias (Rel(R)) import Test.QuickCheck -- 1ª solución -- =========== reflexiva :: Eq a => Rel a -> Bool reflexiva (R ([], _))   = True reflexiva (R (x:xs, ps)) = (x, x) `elem` ps && reflexiva  (R (xs, ps)) -- 2ª solución -- =========== reflexiva2 :: Eq a => Rel a -> Bool reflexiva2 (R (us,ps)) = and [(x,x) `elem` ps | x <- us] -- 3ª solución -- =========== reflexiva3 :: Eq a => Rel a -> Bool reflexiva3 (R (us,ps)) = all (`elem` ps) [(x,x) | x <- us] -- 4ª solución -- =========== reflexiva4 :: Eq a => Rel a -> Bool reflexiva4 (R (us,ps)) = all (\x -> (x,x) `elem` ps) us -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_reflexiva :: Rel Int -> Bool prop_reflexiva r =   all (== reflexiva r)       [reflexiva2 r,        reflexiva3 r,        reflexiva4 r] -- La comprobación es --    λ> quickCheck prop_reflexiva --    +++ 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | from random import choice, randint, sample from typing import TypeVar from hypothesis import given from hypothesis import strategies as st from src.Relaciones_binarias import Rel, relacionArbitraria A = TypeVar('A') # 1ª solución # =========== def reflexiva(r: Rel[A]) -> bool:     (us, ps) = r     if not us:         return True     return (us[0], us[0]) in ps and reflexiva((us[1:], ps)) # 2ª solución # =========== def reflexiva2(r: Rel[A]) -> bool:     (us, ps) = r     return all(((x,x) in ps for x in us)) # 3ª solución # =========== def reflexiva3(r: Rel[A]) -> bool:     (us, ps) = r     for x in us:         if (x, x) not in ps:             return False     return True # Comprobación de equivalencia # ============================ # La propiedad es @given(st.integers(min_value=0, max_value=10)) def test_reflexiva(n: int) -> None:     r = relacionArbitraria(n)     res = reflexiva(r)     assert reflexiva2(r) == res     assert reflexiva3(r) == res # La comprobación es #    > poetry run pytest -q Relaciones_reflexivas.py #    1 passed in 0.41s |