Disyunción excluyente
La disyunción excluyente de dos fórmulas se verifica si una es verdadera y la otra es falsa. Su tabla de verdad es
1 2 3 4 5 6 |
x | y | xor x y ------+-------+--------- True | True | False True | False | True False | True | True False | False | False |
Definir la función
1 |
xor :: Bool -> Bool -> Bool |
tal que (xor x y)
es la disyunción excluyente de x
e y
. Por ejemplo,
1 2 3 4 |
xor True True == False xor True False == True xor False True == True xor False False == 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 |
import Test.QuickCheck -- 1ª solución xor1 :: Bool -> Bool -> Bool xor1 True True = False xor1 True False = True xor1 False True = True xor1 False False = False -- 2ª solución xor2 :: Bool -> Bool -> Bool xor2 True y = not y xor2 False y = y -- 3ª solución: xor3 :: Bool -> Bool -> Bool xor3 x y = (x || y) && not (x && y) -- 4ª solución: xor4 :: Bool -> Bool -> Bool xor4 x y = (x && not y) || (y && not x) -- 5ª solución: xor5 :: Bool -> Bool -> Bool xor5 x y = x /= y -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_xor :: Bool -> Bool -> Bool prop_xor x y = all (== xor1 x y) [xor2 x y, xor3 x y, xor4 x y, xor5 x y] -- La comprobación es -- λ> quickCheck prop_xor -- +++ OK, passed 100 tests. |
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 |
from hypothesis import given, strategies as st # 1ª solución def xor1(x, y): match x, y: case True, True: return False case True, False: return True case False, True: return True case False, False: return False # 2ª solución def xor2(x: bool, y: bool) -> bool: if x: return not y return y # 3ª solución def xor3(x: bool, y: bool) -> bool: return (x or y) and not(x and y) # 4ª solución def xor4(x: bool, y: bool) -> bool: return (x and not y) or (y and not x) # 5ª solución def xor5(x: bool, y: bool) -> bool: return x != y # La propiedad de equivalencia es @given(st.booleans(), st.booleans()) def test_equiv_xor(x, y): assert xor1(x, y) == xor2(x, y) == xor3(x, y) == xor4(x, y) == xor5(x, y) # La comprobación es # src> poetry run pytest -q disyuncion_excluyente.py # 1 passed in 0.11s |
El código se encuentra en GitHub.
Comentarios
- La negación de
x
se escribe igual en Haskell y Python;not x
-
La disyunción de
x
ey
se escribe- en Haskell, como
x || y
y - en Python, como
x or y
.
- en Haskell, como