TAD de las colas - Pertenencia a una cola
Utilizando el tipo abstracto de datos de las colas, definir las funciones
perteneceCola :: Eq a => a -> Cola a -> Bool
tal que perteneceCola x c
se verifica si x
es un elemento de la cola c
. Por ejemplo,
perteneceCola 2 (inserta 5 (inserta 2 (inserta 3 vacia))) == True perteneceCola 4 (inserta 5 (inserta 2 (inserta 3 vacia))) == False
Soluciones
Se usará la función colaAlista
del ejercicio Transformaciones entre colas y listas.
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import TAD.Cola (Cola, vacia, inserta, primero, resto, esVacia) import Transformaciones_colas_listas colaAlista import Test.QuickCheck -- 1ª solución -- =========== perteneceCola :: Eq a => a -> Cola a -> Bool perteneceCola x c | esVacia c = False | otherwise = x == primero(c) || perteneceCola x (resto c) -- 2ª solución -- =========== perteneceCola2 :: Eq a => a -> Cola a -> Bool perteneceCola2 x c = x `elem` colaAlista c -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_perteneceCola :: Int -> Cola Int -> Bool prop_perteneceCola x p = perteneceCola x p == perteneceCola2 x p -- La comprobación es -- λ> quickCheck prop_perteneceCola -- +++ OK, passed 100 tests.
Soluciones en Python
from copy import deepcopy from typing import TypeVar from hypothesis import given from hypothesis import strategies as st from src.TAD.cola import (Cola, vacia, inserta, primero, resto, esVacia, colaAleatoria) from src.transformaciones_colas_listas import colaAlista A = TypeVar('A') # 1ª solución # =========== def perteneceCola(x: A, c: Cola[A]) -> bool: if esVacia(c): return False return x == primero(c) or perteneceCola(x, resto(c)) # 2ª solución # =========== def perteneceCola2(x: A, c: Cola[A]) -> bool: return x in colaAlista(c) # 3ª solución # =========== def perteneceCola3Aux(x: A, c: Cola[A]) -> bool: if c.esVacia(): return False pc = c.primero() c.resto() return x == pc or perteneceCola3Aux(x, c) def perteneceCola3(x: A, c: Cola[A]) -> bool: c1 = deepcopy(c) return perteneceCola3Aux(x, c1) # 4ª solución # =========== def perteneceCola4Aux(x: A, c: Cola[A]) -> bool: while not c.esVacia(): pc = c.primero() c.resto() if x == pc: return True return False def perteneceCola4(x: A, c: Cola[A]) -> bool: c1 = deepcopy(c) return perteneceCola4Aux(x, c1) # Comprobación de equivalencia de las definiciones # ================================================ # La propiedad es @given(x=st.integers(), c=colaAleatoria()) def test_perteneceCola(x: int, c: Cola[int]) -> None: r = perteneceCola(x, c) assert perteneceCola2(x, c) == r assert perteneceCola3(x, c) == r assert perteneceCola4(x, c) == r # La comprobación es # src> poetry run pytest -q perteneceCola.py # 1 passed in 0.25s