Números racionales
Los números racionales pueden representarse mediante pares de números enteros. Por ejemplo, el número 2/5 puede representarse mediante el par (2,5).
Definir las funciones
| 1 2 3 4 |    formaReducida    :: (Int,Int) -> (Int,Int)    sumaRacional     :: (Int,Int) -> (Int,Int) -> (Int,Int)    productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)    igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool | 
tales que
- formaReducida xes la forma reducida del número racional- x. Por ejemplo,
| 1 2 |      formaReducida (4,10)  ==  (2,5)      formaReducida (0,5)   ==  (0,1) | 
- sumaRacional x yes la suma de los números racionales- xe- y, expresada en forma reducida. Por ejemplo,
| 1 2 |      sumaRacional (2,3) (5,6)  ==  (3,2)      sumaRacional (3,5) (-3,5) ==  (0,1) | 
- productoRacional x yes el producto de los números racionales- xe- y, expresada en forma reducida. Por ejemplo,
| 1 |      productoRacional (2,3) (5,6)  ==  (5,9) | 
- igualdadRacional x yse verifica si los números racionales- xe- yson iguales. Por ejemplo,
| 1 2 3 |      igualdadRacional (6,9) (10,15)  ==  True      igualdadRacional (6,9) (11,15)  ==  False      igualdadRacional (0,2) (0,-5)   ==  True | 
Comprobar con QuickCheck la propiedad distributiva del producto racional respecto de la suma.
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 | import Test.QuickCheck formaReducida :: (Int,Int) -> (Int,Int) formaReducida (0,_) = (0,1) formaReducida (a,b) = (a `div` c, b  `div` c)     where c = gcd a b sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) sumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d) productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) productoRacional (a,b) (c,d) = formaReducida (a*c, b*d) igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool igualdadRacional (a,b) (c,d) =     a*d == b*c -- La propiedad es prop_distributiva :: (Int,Int) -> (Int,Int) -> (Int,Int) -> Property prop_distributiva x y z =   snd x /= 0 && snd y /= 0 && snd z /= 0 ==>   igualdadRacional (productoRacional x (sumaRacional y z))                    (sumaRacional (productoRacional x y)                                  (productoRacional x z)) -- La comprobación es --    λ> quickCheck prop_distributiva --    +++ OK, passed 100 tests; 21 discarded. | 
El código se encuentra en GitHub.
| 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 | from math import gcd from hypothesis import given, assume, strategies as st Racional = tuple[int, int] def formaReducida(x: Racional) -> Racional:     (a, b) = x     if a == 0:         return (0, 1)     c = gcd(a, b)     return (a // c, b // c) def sumaRacional(x: Racional,                  y: Racional) -> Racional:     (a, b) = x     (c, d) = y     return formaReducida((a*d+b*c, b*d)) def productoRacional(x: Racional,                      y: Racional) -> Racional:     (a, b) = x     (c, d) = y     return formaReducida((a*c, b*d)) def igualdadRacional(x: Racional,                      y: Racional) -> bool:     (a, b) = x     (c, d) = y     return a*d == b*c # La propiedad es @given(st.tuples(st.integers(), st.integers()),        st.tuples(st.integers(), st.integers()),        st.tuples(st.integers(), st.integers())) def test_prop_distributiva(x, y, z):     (_, x2) = x     (_, y2) = y     (_, z2) = z     assume(x2 != 0 and y2 != 0 and z2 != 0)     assert igualdadRacional(productoRacional(x, sumaRacional(y, z)),                             sumaRacional(productoRacional(x, y),                                          productoRacional(x, z))) # La comprobación es #    src> poetry run pytest -q numeros_racionales.py #    1 passed in 0.37s | 
El código se encuentra en GitHub.