Beruflich Dokumente
Kultur Dokumente
hs (30 de
septiembre de 2015)
-- Definiciones con condicionales, guardas o patrones.
-- Departamento de Ciencias de la Computacin e I.A.
-- Universidad de Sevilla
-======================================
===============================
-- ---------------------------------------------------------------------- Introduccin --- ---------------------------------------------------------------------- En esta relacin se presentan ejercicios con definiciones
elementales
-- (no recursivas) de funciones que usan condicionales, guardas
o
-- patrones.
--- Estos ejercicios se corresponden con el tema 4 que se
encuentran en
-- http://www.cs.us.es/~jalonso/cursos/i1m-15/temas/tema4.html
-- ---------------------------------------------------------------------- Libreras auxiliares --- --------------------------------------------------------------------import Test.QuickCheck
-- ---------------------------------------------------------------------- Ejercicio 1. Definir la funcin
-- divisionSegura :: Double -> Double -> Double
-- tal que (divisionSegura x y) es x/y si y no es cero y 9999 en
caso
-- contrario. Por ejemplo,
-- divisionSegura 7 2 == 3.5
-- divisionSegura 7 0 == 9999.0
-- --------------------------------------------------------------------divisionSegura :: Double -> Double -> Double
divisionSegura _ 0 = 9999
divisionSegura x y = x/y
-- ---------------------------------------------------------------------- Ejercicio 2.1. La disyuncin excluyente xor de dos frmulas se
-- verifica si una es verdadera y la otra es falsa. Su tabla de
verdad
-- es
-- x | y | xor x y
-- ------+-------+---------- True | True | False
-- True | False | True
-- False | True | True
-- False | False | False
--- Definir la funcin
-- xor1 :: Bool -> Bool -> Bool
-- tal que (xor1 x y) es la disyuncin excluyente de x e y,
calculada a
prop_xor_equivalentes x y =
xor1 x y == xor2 x y &&
xor2 x y == xor3 x y &&
xor3 x y == xor4 x y
-- La comprobacin es
-- ghci> quickCheck prop_xor_equivalentes
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------- Ejercicio 3. Las dimensiones de los rectngulos puede
representarse
-- por pares; por ejemplo, (5,3) representa a un rectngulo de
base 5 y
-- altura 3.
--- Definir la funcin
-- mayorRectangulo :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a)
-- tal que (mayorRectangulo r1 r2) es el rectngulo de mayor
rea entre
-- r1 y r2. Por ejemplo,
-- mayorRectangulo (4,6) (3,7) == (4,6)
-- mayorRectangulo (4,6) (3,8) == (4,6)
-- mayorRectangulo (4,6) (3,9) == (3,9)
-- --------------------------------------------------------------------mayorRectangulo :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a)
mayorRectangulo (a,b) (c,d) | a*b >= c*d = (a,b)
| otherwise = (c,d)
-- ---------------------------------------------------------------------- Ejercicio 4.1. Definir la funcin
-- intercambia :: (a,b) -> (b,a)
-- tal que (intercambia p) es el punto obtenido intercambiando
las
-- coordenadas del punto p. Por ejemplo,
-- intercambia (2,5) == (5,2)
-- intercambia (5,2) == (2,5)
-- --------------------------------------------------------------------intercambia :: (a,b) -> (b,a)
intercambia (x,y) = (y,x)
-- ---------------------------------------------------------------------- Ejercicio 4.2. Comprobar con QuickCheck que la funcin
intercambia es
-- idempotente; es decir, si se aplica dos veces es lo mismo que
no
-- aplicarla ninguna.
-- ---------------------------------------------------------------------- La propiedad es
prop_intercambia :: (Int,Int) -> Bool
prop_intercambia p = intercambia (intercambia p) == p
-- La comprobacin es
-- ghci> quickCheck prop_intercambia
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------- Ejercicio 5.1. Definir la funcin
------