SlideShare una empresa de Scribd logo
1 de 55
Descargar para leer sin conexión
Tema 21: El TAD de los polinomios
           Informática (2011–12)


           José A. Alonso Jiménez

         Grupo de Lógica Computacional
 Departamento de Ciencias de la Computación e I.A.
              Universidad de Sevilla
IM Tema 21: El TAD de los polinomios




Tema 21: El TAD de los polinomios
 1. Especificación del TAD de los polinomios
       Signatura del TAD de los polinomios
       Propiedades del TAD de los polinomios
 2. Implementación del TAD de los polinomios
       Los polinomios como tipo de dato algebraico
       Los polinomios como listas dispersas
       Los polinomios como listas densas
 3. Comprobación de las implementaciones con QuickCheck
       Librerías auxiliares
       Generador de polinomios
       Especificación de las propiedades de los polinomios
       Comprobación de las propiedades
 4. Operaciones con polinomios
       Operaciones con polinomios
                                                            2 / 55
IM Tema 21: El TAD de los polinomios
  Especificación del TAD de los polinomios
     Signatura del TAD de los polinomios



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios
       Signatura del TAD de los polinomios
       Propiedades del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios




                                                          3 / 55
IM Tema 21: El TAD de los polinomios
  Especificación del TAD de los polinomios
     Signatura del TAD de los polinomios



Signatura del TAD de los polinomios
 Signatura:
  polCero :: Polinomio a
  esPolCero :: Num a => Polinomio a -> Bool
  consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a
  grado       :: Polinomio a -> Int
  coefLider :: Num a => Polinomio a -> a
  restoPol :: Polinomio a -> Polinomio a
 Descripción de las operaciones:
     polCero es el polinomio cero.
     (esPolCero p) se verifica si p es el polinomio cero.
     (consPol n b p) es el polinomio bx n + p.
     (grado p) es el grado del polinomio p.
     (coefLider p) es el coeficiente líder del polinomio p.
     (restoPol p) es el resto del polinomio p.
                                                          4 / 55
IM Tema 21: El TAD de los polinomios
  Especificación del TAD de los polinomios
     Signatura del TAD de los polinomios



Ejemplos de polinomios
 Ejemplos de polinomios que se usarán en lo sucesivo.
         Definición:

         ejPol1, ejPol2, ejPol3, ejTerm:: Polinomio Int
         ejPol1 = consPol 4 3 (consPol 2 (-5) (consPol 0 3 polCero)
         ejPol2 = consPol 5 1 (consPol 2 5 (consPol 1 4 polCero))
         ejPol3 = consPol 4 6 (consPol 1 2 polCero)
         ejTerm = consPol 1 4 polCero

         Evaluación:
          ejPol1                   3*x^4 + -5*x^2 + 3
          ejPol2                   x^5 + 5*x^2 + 4*x
          ejPol3                   6*x^4 + 2*x
          ejTerm                   4*x
                                                               5 / 55
IM Tema 21: El TAD de los polinomios
  Especificación del TAD de los polinomios
     Propiedades del TAD de los polinomios



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios
       Signatura del TAD de los polinomios
       Propiedades del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios




                                                          6 / 55
IM Tema 21: El TAD de los polinomios
  Especificación del TAD de los polinomios
     Propiedades del TAD de los polinomios



Propiedades del TAD de los polinomios
    1. esPolCero polCero
    2. n > grado p && b /= 0 ==>
       not (esPolCero (consPol n b p))
    3. consPol (grado p) (coefLider p) (restoPol p) == p
    4. n > grado p && b /= 0 ==>
       grado (consPol n b p) == n
    5. n > grado p && b /= 0 ==>
       coefLider (consPol n b p) == b
    6. n > grado p && b /= 0 ==>
       restoPol (consPol n b p) == p




                                                           7 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios
       Los polinomios como tipo de dato algebraico
       Los polinomios como listas dispersas
       Los polinomios como listas densas

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios



                                                          8 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
 Cabecera del módulo:

 module PolRepTDA
   ( Polinomio,
     polCero, --                       Polinomio a
     esPolCero, --                     Num a => Polinomio a -> Bool
     consPol, --                       (Num a) => Int -> a -> Polinomio a
                --                                 -> Polinomio a
     grado,     --                     Polinomio a -> Int
     coefLider, --                     Num a => Polinomio a -> a
     restoPol --                       Polinomio a -> Polinomio a
   ) where



                                                                            9 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
         Representamos un polinomio mediante los constructores ConsPol
         y PolCero.
         Por ejemplo, el polinomio
          6x^4 -5x^2 + 4x -7
         se representa por
          ConsPol 4 6
             (ConsPol 2 (-5)
                 (ConsPol 1 4
                     (ConsPol 0 (-7) PolCero)))
         El tipo de los polinomios.

         data Polinomio a = PolCero
                          | ConsPol Int a (Polinomio a)
                          deriving Eq
                                                                         10 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
 Procedimiento de escritura de los polinomios.

 instance       Num a =>      Show (Polinomio a) where
     show       PolCero                    = "0"
     show       (ConsPol      0 b PolCero) = show b
     show       (ConsPol      0 b p)       = concat [show b," + ",show p]
     show       (ConsPol      1 b PolCero) = concat [show b,"*x"]
     show       (ConsPol      1 b p)       = concat [show b,"*x + ",show p]
     show       (ConsPol      n 1 PolCero) = concat ["x^",show n]
     show       (ConsPol      n b PolCero) = concat [show b,"*x^",show n]
     show       (ConsPol      n 1 p)       = concat ["x^",show n," + ",show p]
     show       (ConsPol      n b p)       = concat [show b,"*x^",show n," + ",show p]




                                                                                    11 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
         polCero es el polinomio cero. Por ejemplo,
          ghci> polCero
          0

         polCero :: Polinomio a
         polCero = PolCero

         (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo,
          esPolCero polCero         True
          esPolCero ejPol1          False

         esPolCero :: Polinomio a -> Bool
         esPolCero PolCero = True
         esPolCero _       = False
                                                                            12 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
        (consPol       n b p) es el polinomio bx n + p. Por   ejemplo,
         ejPol2                            x^5 + 5*x^2 +      4*x
         consPol       3 0 ejPol2          x^5 + 5*x^2 +      4*x
         consPol       3 2 polCero         2*x^3
         consPol       6 7 ejPol2          7*x^6 + x^5 +      5*x^2 + 4*x
         consPol       4 7 ejPol2          x^5 + 7*x^4 +      5*x^2 + 4*x
         consPol       5 7 ejPol2          8*x^5 + 5*x^2      + 4*x

        consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a
        consPol _ 0 p = p
        consPol n b PolCero = ConsPol n b PolCero
        consPol n b (ConsPol m c p)
            | n > m       = ConsPol n b (ConsPol m c p)
            | n < m       = ConsPol m c (consPol n b p)
            | b+c == 0 = p
            | otherwise = ConsPol n (b+c) p

                                                                            13 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
         (grado p) es el grado del polinomio p. Por ejemplo,
          ejPol3              6*x^4 + 2*x
          grado ejPol3        4

         grado:: Polinomio a -> Int
         grado PolCero         = 0
         grado (ConsPol n _ _) = n
         (coefLider p) es el coeficiente líder del polinomio p. Por
         ejemplo,
          coefLider ejPol3        6

         coefLider:: Num t => Polinomio t -> t
         coefLider PolCero         = 0
         coefLider (ConsPol _ b _) = b
                                                                     14 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como tipo de dato algebraico



Los polinomios como tipo de dato algebraico
         (restoPol p) es el resto del polinomio p. Por ejemplo,
          ejPol3                  6*x^4 + 2*x
          restoPol ejPol3         2*x
          ejPol2                  x^5 + 5*x^2 + 4*x
          restoPol ejPol2         5*x^2 + 4*x

         restoPol :: Polinomio t -> Polinomio t
         restoPol PolCero         = PolCero
         restoPol (ConsPol _ _ p) = p




                                                                  15 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios
       Los polinomios como tipo de dato algebraico
       Los polinomios como listas dispersas
       Los polinomios como listas densas

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios



                                                          16 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como listas dispersas
 Cabecera del módulo

 module PolRepDispersa
   ( Polinomio,
     polCero, -- Polinomio a
     esPolCero, -- Num a => Polinomio a -> Bool
     consPol, -- (Num a) => Int -> a -> Polinomio a
                --            -> Polinomio a
     grado,     -- Polinomio a -> Int
     coefLider, -- Num a => Polinomio a -> a
     restoPol -- Polinomio a -> Polinomio a
   ) where



                                                      17 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como tipo listas dispersas
         Representaremos un polinomio por la lista de sus coeficientes
         ordenados en orden decreciente según el grado.
         Por ejemplo, el polinomio
          6x^4 -5x^2 + 4x -7
         se representa por la lista
          [6,0,-2,4,-7]
         Los polinomios como listas dispersas.

         data Polinomio a = Pol [a]
                            deriving Eq




                                                                        18 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como listas dispersas
 Procedimiento de escritura de los polinomios.

 instance Num t => Show (Polinomio t) where
   show pol
       | esPolCero pol         = "0"
       | n == 0 && esPolCero p = show a
       | n == 0                = concat [show a," + ",show p]
       | n == 1 && esPolCero p = concat [show a,"*x"]
       | n == 1                = concat [show a,"*x + ",show p]
       | a == 1 && esPolCero p = concat ["x^",show n]
       | esPolCero p           = concat [show a,"*x^",show n]
       | a == 1                = concat ["x^",show n," + ",show p]
       | otherwise             = concat [show a,"*x^",show n," + ",show p]
      where n = grado pol
            a = coefLider pol
            p = restoPol pol


                                                                         19 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como tipo listas dispersas
         polCero es el polinomio cero. Por ejemplo,
          ghci> polCero
          0

         polCero :: Polinomio a
         polCero = Pol []

         (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo,
          esPolCero polCero         True
          esPolCero ejPol1          False

         esPolCero :: Polinomio a -> Bool
         esPolCero (Pol []) = True
         esPolCero _        = False
                                                                            20 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como tipo listas dispersas
       (consPol     n b p) es el polinomio bx n + p. Por   ejemplo,
        ejPol2                          x^5 + 5*x^2 +      4*x
        consPol     3 0 ejPol2          x^5 + 5*x^2 +      4*x
        consPol     3 2 polCero         2*x^3
        consPol     6 7 ejPol2          7*x^6 + x^5 +      5*x^2 + 4*x
        consPol     4 7 ejPol2          x^5 + 7*x^4 +      5*x^2 + 4*x
        consPol     5 7 ejPol2          8*x^5 + 5*x^2      + 4*x

       consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a
       consPol _ 0 p = p
       consPol n b p@(Pol xs)
           | esPolCero p = Pol (b:replicate n 0)
           | n > m       = Pol (b:(replicate (n-m-1) 0)++xs)
           | n < m       = consPol m c (consPol n b (restoPol p))
           | b+c == 0    = Pol (dropWhile (==0) (tail xs))
           | otherwise   = Pol ((b+c):tail xs)
           where
             c = coefLider p
             m = grado p

                                                                         21 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como tipo listas dispersas
         (grado p) es el grado del polinomio p. Por ejemplo,
          ejPol3              6*x^4 + 2*x
          grado ejPol3        4

         grado:: Polinomio a -> Int
         grado (Pol []) = 0
         grado (Pol xs) = length xs - 1
         (coefLider p) es el coeficiente líder del polinomio p. Por
         ejemplo,
          coefLider ejPol3        6

         coefLider:: Num t => Polinomio t -> t
         coefLider (Pol [])    = 0
         coefLider (Pol (a:_)) = a
                                                                     22 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas dispersas



Los polinomios como tipo listas dispersas
         (restoPol p) es el resto del polinomio p. Por ejemplo,
          ejPol3                  6*x^4 + 2*x
          restoPol ejPol3         2*x
          ejPol2                  x^5 + 5*x^2 + 4*x
          restoPol ejPol2         5*x^2 + 4*x

         restoPol :: Num t => Polinomio t -> Polinomio t
         restoPol (Pol [])     = polCero
         restoPol (Pol [_])    = polCero
         restoPol (Pol (_:b:as))
             | b == 0    = Pol (dropWhile (==0) as)
             | otherwise = Pol (b:as)


                                                                  23 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios
       Los polinomios como tipo de dato algebraico
       Los polinomios como listas dispersas
       Los polinomios como listas densas

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios



                                                          24 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
 Cabecera del módulo.

 module PolRepDensa
   ( Polinomio,
     polCero, -- Polinomio a
     esPolCero, -- Num a => Polinomio a -> Bool
     consPol, -- Num a => Int -> a -> Polinomio a
                --          -> Polinomio a
     grado,     -- Polinomio a -> Int
     coefLider, -- Num a => Polinomio a -> a
     restoPol -- Polinomio a -> Polinomio a
   ) where



                                                    25 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
         Representaremos un polinomio mediante una lista de pares
         (grado,coef), ordenados en orden decreciente según el grado. Por
         ejemplo, el polinomio
          6x^4 -5x^2 + 4x -7
         se representa por la lista de pares
          [(4,6),(2,-5),(1,4),(0,-7)].
         Los polinomios como listas densas.

         data Polinomio a = Pol [(Int,a)]
                            deriving Eq




                                                                            26 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
 Procedimiento de escritura de polinomios

 instance Num t => Show (Polinomio t) where
   show pol
       | esPolCero pol         = "0"
       | n == 0 && esPolCero p = show a
       | n == 0                = concat [show a," + ",show p]
       | n == 1 && esPolCero p = concat [show a,"*x"]
       | n == 1                = concat [show a,"*x + ",show p]
       | a == 1 && esPolCero p = concat ["x^",show n]
       | esPolCero p           = concat [show a,"*x^",show n]
       | a == 1                = concat ["x^",show n," + ",show p]
       | otherwise             = concat [show a,"*x^",show n," + ",show p]
      where n = grado pol
            a = coefLider pol
            p = restoPol pol

                                                                       27 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
         polCero es el polinomio cero. Por ejemplo,
          ghci> polCero
          0

         polCero :: Num a => Polinomio a
         polCero = Pol []

         (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo,
          esPolCero polCero         True
          esPolCero ejPol1          False

         esPolCero :: Num a => Polinomio a -> Bool
         esPolCero (Pol []) = True
         esPolCero _        = False
                                                                            28 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
       (consPol     n b p) es el polinomio bx n + p. Por   ejemplo,
        ejPol2                          x^5 + 5*x^2 +      4*x
        consPol     3 0 ejPol2          x^5 + 5*x^2 +      4*x
        consPol     3 2 polCero         2*x^3
        consPol     6 7 ejPol2          7*x^6 + x^5 +      5*x^2 + 4*x
        consPol     4 7 ejPol2          x^5 + 7*x^4 +      5*x^2 + 4*x
        consPol     5 7 ejPol2          8*x^5 + 5*x^2      + 4*x

       consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a
       consPol _ 0 p = p
       consPol n b p@(Pol xs)
           | esPolCero p = Pol [(n,b)]
           | n > m       = Pol ((n,b):xs)
           | n < m       = consPol m c (consPol n b (Pol (tail xs)))
           | b+c == 0    = Pol (tail xs)
           | otherwise   = Pol ((n,b+c):(tail xs))
           where
             c = coefLider p
             m = grado p

                                                                         29 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
         (grado p) es el grado del polinomio p. Por ejemplo,
          ejPol3              6*x^4 + 2*x
          grado ejPol3        4

         grado:: Polinomio a -> Int
         grado (Pol [])        = 0
         grado (Pol ((n,_):_)) = n
         (coefLider p) es el coeficiente líder del polinomio p. Por
         ejemplo,
          coefLider ejPol3        6

         coefLider:: Num t => Polinomio t -> t
         coefLider (Pol [])        = 0
         coefLider (Pol ((_,b):_)) = b
                                                                     30 / 55
IM Tema 21: El TAD de los polinomios
  Implementación del TAD de los polinomios
     Los polinomios como listas densas



Los polinomios como tipo listas densas
         (restoPol p) es el resto del polinomio p. Por ejemplo,
          ejPol3                  6*x^4 + 2*x
          restoPol ejPol3         2*x
          ejPol2                  x^5 + 5*x^2 + 4*x
          restoPol ejPol2         5*x^2 + 4*x

         restoPol          :: Num t => Polinomio t -> Polinomio t
         restoPol          (Pol [])     = polCero
         restoPol          (Pol [_])    = polCero
         restoPol          (Pol (_:xs)) = Pol xs




                                                                    31 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Librerías auxiliares



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck
      Librerías auxiliares
      Generador de polinomios
      Especificación de las propiedades de los polinomios
      Comprobación de las propiedades

 4. Operaciones con polinomios


                                                           32 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Librerías auxiliares



Comprobación de las propiedades del TAD de los
polinomios
         Importación de la implementación a verificar.

         import PolRepTDA
         -- import PolRepDispersa
         -- import PolRepDensa

         Librerías auxiliares.

         import Test.QuickCheck
         import Test.Framework
         import Test.Framework.Providers.QuickCheck2



                                                        33 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Generador de polinomios



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck
      Librerías auxiliares
      Generador de polinomios
      Especificación de las propiedades de los polinomios
      Comprobación de las propiedades

 4. Operaciones con polinomios


                                                           34 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Generador de polinomios



Generador de polinomios
         (genPol n) es un generador de polinomios. Por ejemplo,
          ghci> sample (genPol 1)
          7*x^9 + 9*x^8 + 10*x^7 + -14*x^5 + -15*x^2 + -10
          -4*x^8 + 2*x

         genPol :: Int -> Gen (Polinomio Int)
         genPol 0 = return polCero
         genPol n = do n <- choose (0,10)
                       b <- choose (-10,10)
                       p <- genPol (div n 2)
                       return (consPol n b p)

         instance Arbitrary (Polinomio Int) where
             arbitrary = sized genPol
                                                                  35 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de los polinomios



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck
      Librerías auxiliares
      Generador de polinomios
      Especificación de las propiedades de los polinomios
      Comprobación de las propiedades

 4. Operaciones con polinomios


                                                           36 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de los polinomios



Especificación de las propiedades de los polinomios
         polCero es el polinomio cero.

         prop_polCero_es_cero :: Bool
         prop_polCero_es_cero =
             esPolCero polCero

         Si n es mayor que el grado de p y b no es cero, entonces
         (consPol n b p) es un polinomio distinto del cero.

         prop_consPol_no_cero :: Int -> Int -> Polinomio Int
                                 -> Property
         prop_consPol_no_cero n b p =
             n > grado p && b /= 0 ==>
               not (esPolCero (consPol n b p))

                                                                    37 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de los polinomios



Especificación de las propiedades de los polinomios
         (consPol (grado p) (coefLider p) (restoPol p)) es
         igual a p.

         prop_consPol :: Polinomio Int -> Bool
         prop_consPol p =
             consPol (grado p) (coefLider p) (restoPol p) == p

         Si n es mayor que el grado de p y b no es cero, entonces el grado
         de (consPol n b p) es n.

         prop_grado :: Int -> Int -> Polinomio Int -> Property
         prop_grado n b p =
             n > grado p && b /= 0 ==>
               grado (consPol n b p) == n

                                                                             38 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Especificación de las propiedades de los polinomios



Especificación de las propiedades de los polinomios
         Si n es mayor que el grado de p y b no es cero, entonces el
         coeficiente líder de (consPol n b p) es b.

         prop_coefLider :: Int -> Int -> Polinomio Int -> Property
         prop_coefLider n b p =
             n > grado p && b /= 0 ==>
               coefLider (consPol n b p) == b
         Si n es mayor que el grado de p y b no es cero, entonces el resto
         de (consPol n b p) es p.

         prop_restoPol :: Int -> Int -> Polinomio Int -> Property
         prop_restoPol n b p =
             n > grado p && b /= 0 ==>
               restoPol (consPol n b p) == p
                                                                             39 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Comprobación de las propiedades



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck
      Librerías auxiliares
      Generador de polinomios
      Especificación de las propiedades de los polinomios
      Comprobación de las propiedades

 4. Operaciones con polinomios


                                                           40 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Comprobación de las propiedades



Procedimiento de comprobación
         compruebaPropiedades comprueba todas las propiedades con la
         plataforma de verificación. Por ejemplo,

         compruebaPropiedades =
             defaultMain
                 [testGroup "Propiedades del TAD polinomio:"
                   [testProperty "P1" prop_polCero_es_cero,
                    testProperty "P2" prop_consPol_no_cero,
                    testProperty "P3" prop_consPol,
                    testProperty "P4" prop_grado,
                    testProperty "P5" prop_coefLider,
                    testProperty "P6" prop_restoPol]]



                                                                       41 / 55
IM Tema 21: El TAD de los polinomios
  Comprobación de las implementaciones con QuickCheck
     Comprobación de las propiedades



Comprobación de las propiedades de los polinomios
   ghci> compruebaPropiedades
   Propiedades del TAD polinomio::
     P1: [OK, passed 100 tests]
     P2: [OK, passed 100 tests]
     P3: [OK, passed 100 tests]
     P4: [OK, passed 100 tests]
     P5: [OK, passed 100 tests]
     P6: [OK, passed 100 tests]

            Properties                     Total
     Passed 6                              6
     Failed 0                              0
     Total 6                               6

                                                        42 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Tema 21: El TAD de los polinomios

 1. Especificación del TAD de los polinomios

 2. Implementación del TAD de los polinomios

 3. Comprobación de las implementaciones con QuickCheck

 4. Operaciones con polinomios
      Operaciones con polinomios




                                                          43 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Operaciones con polinomios
         Importación de la implementación a utilizar.

         import PolRepTDA
         -- import PolRepDispersa
         -- import PolRepDensa

         Importación de librerías auxiliares.

         import Test.QuickCheck
         import Test.Framework
         import Test.Framework.Providers.QuickCheck2




                                                        44 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Funciones sobre términos
         (creaTermino n a) es el término ax n . Por ejemplo,
          creaTermino 2 5       5*x^2

         creaTermino:: Num t => Int -> t -> Polinomio t
         creaTermino n a = consPol n a polCero

         (termLider p) es el término líder del polinomio p. Por ejemplo,
          ejPol2                  x^5 + 5*x^2 + 4*x
          termLider ejPol2        x^5

         termLider:: Num t => Polinomio t -> Polinomio t
         termLider p = creaTermino (grado p) (coefLider p)


                                                                           45 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Suma de polinomios
       (sumaPol p q) es la suma de los polinomios p y q. Por ejemplo,
        ejPol1                        3*x^4 + -5*x^2 + 3
        ejPol2                        x^5 + 5*x^2 + 4*x
        sumaPol ejPol1 ejPol2         x^5 + 3*x^4 + 4*x + 3

       sumaPol:: Num a => Polinomio     a -> Polinomio a -> Polinomio a
       sumaPol p q
           | esPolCero p = q
           | esPolCero q = p
           | n1 > n2      = consPol     n1   a1 (sumaPol r1 q)
           | n1 < n2      = consPol     n2   a2 (sumaPol p r2)
           | a1+a2 /= 0 = consPol       n1   (a1+a2) (sumaPol r1 r2)
           | otherwise    = sumaPol     r1   r2
           where n1 = grado p
                 a1 = coefLider p
                 r1 = restoPol p
                 n2 = grado q
                 a2 = coefLider q
                 r2 = restoPol q

                                                                          46 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Propiedades de la suma de polinomios
         El polinomio cero es el elemento neutro de la suma.

         prop_neutroSumaPol :: Polinomio Int -> Bool
         prop_neutroSumaPol p =
             sumaPol polCero p == p

         La suma es conmutativa.

         prop_conmutativaSuma :: Polinomio Int -> Polinomio Int
                                 -> Bool
         prop_conmutativaSuma p q =
             sumaPol p q == sumaPol q p



                                                                  47 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Producto de polinomios
        (multPorTerm t p) es el producto del término t por el polinomio
        p. Por ejemplo,
         ejTerm                            4*x
         ejPol2                            x^5 + 5*x^2 + 4*x
         multPorTerm ejTerm ejPol2         4*x^6 + 20*x^3 + 16*x^2

        multPorTerm :: Num t => Polinomio t -> Polinomio t -> Polinomio t
        multPorTerm term pol
            | esPolCero pol = polCero
            | otherwise     = consPol (n+m) (a*b) (multPorTerm term r)
            where n = grado term
                  a = coefLider term
                  m = grado pol
                  b = coefLider pol
                  r = restoPol pol
                                                                          48 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Producto de polinomios
        (multPol p q) es el producto de los polinomios p y q. Por ejemplo,
         ghci> ejPol1
         3*x^4 + -5*x^2 + 3
         ghci> ejPol2
         x^5 + 5*x^2 + 4*x
         ghci> multPol ejPol1 ejPol2
         3*x^9 + -5*x^7 + 15*x^6 + 15*x^5 + -25*x^4 + -20*x^3
               + 15*x^2 + 12*x

        multPol :: Num a => Polinomio a -> Polinomio a -> Polinomio a
        multPol p q
            | esPolCero p = polCero
            | otherwise   = sumaPol (multPorTerm (termLider p) q)
                                    (multPol (restoPol p) q)


                                                                             49 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Propiedades del producto polinomios
         El producto de polinomios es conmutativo.

         prop_conmutativaProducto :: Polinomio Int
                                     -> Polinomio Int -> Bool
         prop_conmutativaProducto p q =
             multPol p q == multPol q p

         El producto es distributivo respecto de la suma.

         prop_distributiva :: Polinomio Int -> Polinomio Int
                              -> Polinomio Int -> Bool
         prop_distributiva p q r =
             multPol p (sumaPol q r) ==
             sumaPol (multPol p q) (multPol p r)

                                                                50 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Polinomio unidad
         polUnidad es el polinomio unidad. Por ejemplo,
          ghci> polUnidad
          1

         polUnidad:: Num t => Polinomio t
         polUnidad = consPol 0 1 polCero

         El polinomio unidad es el elemento neutro del producto.

         prop_polUnidad :: Polinomio Int -> Bool
         prop_polUnidad p =
             multPol p polUnidad == p


                                                                   51 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Valor de un polinomio en un punto
         (valor p c) es el valor del polinomio p al sustituir su variable
         por c. Por ejemplo,
          ejPol1                     3*x^4 + -5*x^2 + 3
          valor ejPol1 0             3
          valor ejPol1 1             1
          valor ejPol1 (-2)          31

         valor:: Num a => Polinomio a -> a -> a
         valor p c
             | esPolCero p = 0
             | otherwise   = b*c^n + valor r c
             where n = grado p
                   b = coefLider p
                   r = restoPol p
                                                                            52 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Verificación de raices de polinomios
         (esRaiz c p) se verifica       si c es una raiz del polinomio p. por
         ejemplo,
          ejPol3                       6*x^4 + 2*x
          esRaiz 1 ejPol3              False
          esRaiz 0 ejPol3              True

         esRaiz:: Num a => a -> Polinomio a -> Bool
         esRaiz c p = valor p c == 0




                                                                               53 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Derivación de polinomios
         (derivada p) es la derivada del polinomio p. Por ejemplo,
          ejPol2                  x^5 + 5*x^2 + 4*x
          derivada ejPol2         5*x^4 + 10*x + 4

         derivada :: Polinomio Int -> Polinomio Int
         derivada p
             | n == 0     = polCero
             | otherwise = consPol (n-1) (n*b) (derivada r)
             where n = grado p
                   b = coefLider p
                   r = restoPol p



                                                                     54 / 55
IM Tema 21: El TAD de los polinomios
  Operaciones con polinomios
     Operaciones con polinomios



Propiedades de las derivadas de polinomios
         La derivada de la suma es la suma de las derivadas.

         prop_derivada :: Polinomio Int -> Polinomio Int -> Bool
         prop_derivada p q =
             derivada (sumaPol p q) ==
             sumaPol (derivada p) (derivada q)




                                                               55 / 55

Más contenido relacionado

La actualidad más candente

Sesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en PythonSesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en Pythonmaluacsa
 
Unidad i juan carlos
Unidad i juan carlosUnidad i juan carlos
Unidad i juan carlosASIGNACIONUFT
 
Instrucciones lenguaje assembler
Instrucciones lenguaje assemblerInstrucciones lenguaje assembler
Instrucciones lenguaje assemblerANDREA
 
Manipulacion de la pila!!
Manipulacion de la pila!!Manipulacion de la pila!!
Manipulacion de la pila!!romo91
 
Evidencias de sesión 4 Curso Python
Evidencias de  sesión 4 Curso PythonEvidencias de  sesión 4 Curso Python
Evidencias de sesión 4 Curso Pythonmaluacsa
 
Tipos de datos numéricos en Python
Tipos de datos numéricos en PythonTipos de datos numéricos en Python
Tipos de datos numéricos en Pythonmaluacsa
 
Sistemas digitales combinacionales - ejercicios
Sistemas digitales combinacionales - ejerciciosSistemas digitales combinacionales - ejercicios
Sistemas digitales combinacionales - ejerciciosFrancesc Perez
 
Evidencia Sesión 5: Python
Evidencia Sesión 5: PythonEvidencia Sesión 5: Python
Evidencia Sesión 5: Pythonmaluacsa
 
Evidencias de la tercera sesión: Programación en Python
Evidencias de la tercera sesión: Programación en PythonEvidencias de la tercera sesión: Programación en Python
Evidencias de la tercera sesión: Programación en Pythonmaluacsa
 
Tema 4 - Tipos datos avanzados (II)
Tema 4 - Tipos datos avanzados (II)Tema 4 - Tipos datos avanzados (II)
Tema 4 - Tipos datos avanzados (II)Pablo Haya
 
A3 u1-16230227
A3 u1-16230227A3 u1-16230227
A3 u1-16230227erikalejo
 
Tema 4 - Tipos datos avanzados (III)
Tema 4 - Tipos datos avanzados (III)Tema 4 - Tipos datos avanzados (III)
Tema 4 - Tipos datos avanzados (III)Pablo Haya
 
Arranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con AssemblerArranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con AssemblerPedro Contreras Flores
 
Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.Mauricio Velasquez
 

La actualidad más candente (20)

Sesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en PythonSesión 2: Ejemplos y prácticas en Python
Sesión 2: Ejemplos y prácticas en Python
 
Matematicos
MatematicosMatematicos
Matematicos
 
Unidad i juan carlos
Unidad i juan carlosUnidad i juan carlos
Unidad i juan carlos
 
Lenguaje C++
Lenguaje C++Lenguaje C++
Lenguaje C++
 
Instrucciones lenguaje assembler
Instrucciones lenguaje assemblerInstrucciones lenguaje assembler
Instrucciones lenguaje assembler
 
Manipulacion de la pila!!
Manipulacion de la pila!!Manipulacion de la pila!!
Manipulacion de la pila!!
 
Evidencias de sesión 4 Curso Python
Evidencias de  sesión 4 Curso PythonEvidencias de  sesión 4 Curso Python
Evidencias de sesión 4 Curso Python
 
Tipos de datos numéricos en Python
Tipos de datos numéricos en PythonTipos de datos numéricos en Python
Tipos de datos numéricos en Python
 
Sistemas digitales combinacionales - ejercicios
Sistemas digitales combinacionales - ejerciciosSistemas digitales combinacionales - ejercicios
Sistemas digitales combinacionales - ejercicios
 
Evidencia Sesión 5: Python
Evidencia Sesión 5: PythonEvidencia Sesión 5: Python
Evidencia Sesión 5: Python
 
Presnetación Go
Presnetación GoPresnetación Go
Presnetación Go
 
Evidencias de la tercera sesión: Programación en Python
Evidencias de la tercera sesión: Programación en PythonEvidencias de la tercera sesión: Programación en Python
Evidencias de la tercera sesión: Programación en Python
 
Tema 4 - Tipos datos avanzados (II)
Tema 4 - Tipos datos avanzados (II)Tema 4 - Tipos datos avanzados (II)
Tema 4 - Tipos datos avanzados (II)
 
A3 u1-16230227
A3 u1-16230227A3 u1-16230227
A3 u1-16230227
 
Tema 4 - Tipos datos avanzados (III)
Tema 4 - Tipos datos avanzados (III)Tema 4 - Tipos datos avanzados (III)
Tema 4 - Tipos datos avanzados (III)
 
Python workshop
Python workshopPython workshop
Python workshop
 
Arranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con AssemblerArranque de Sistema Operativo con Assembler
Arranque de Sistema Operativo con Assembler
 
Pract met de la program templa
Pract met de la program templaPract met de la program templa
Pract met de la program templa
 
Curso c++
Curso c++Curso c++
Curso c++
 
Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.Mis preguntas del blog y las ultimas .l.
Mis preguntas del blog y las ultimas .l.
 

Destacado

I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.José A. Alonso
 
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellI1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellJosé A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalJosé A. Alonso
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorJosé A. Alonso
 
DAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoDAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoJosé A. Alonso
 
I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell José A. Alonso
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosJosé A. Alonso
 
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellI1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellJosé A. Alonso
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaJosé A. Alonso
 
I1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellI1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellJosé A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologJosé A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellJosé A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automáticoJosé A. Alonso
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.José A. Alonso
 
I1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellI1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellJosé A. Alonso
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosJosé A. Alonso
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellJosé A. Alonso
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalJosé A. Alonso
 

Destacado (20)

I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.I1M2010-T23: Técnicas de diseño descendente de algoritmos.
I1M2010-T23: Técnicas de diseño descendente de algoritmos.
 
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellI1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
I1M2010-T14: El tipo abstracto de datos de las pilas en Haskell
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenador
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
DAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automáticoDAO2011-T0: Presentación de sistemas de razonamiento automático
DAO2011-T0: Presentación de sistemas de razonamiento automático
 
I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell I1M2010-T20: El tipo abstracto de los montículos en Haskell
I1M2010-T20: El tipo abstracto de los montículos en Haskell
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntos
 
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellI1M2010-T15: El tipo abstracto de datos de las colas en Haskell
I1M2010-T15: El tipo abstracto de datos de las colas en Haskell
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
I1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en HaskellI1M2010-T18: El TAD de las tablas en Haskell
I1M2010-T18: El TAD de las tablas en Haskell
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
Tema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con HaskellTema 2: Introducción a la programación con Haskell
Tema 2: Introducción a la programación con Haskell
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
I1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en HaskellI1M2010-T22: Algoritmos sobre grafos en Haskell
I1M2010-T22: Algoritmos sobre grafos en Haskell
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en Haskell
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 

Similar a I1M-T21: El TAD de los polinomios en Haskell

Similar a I1M-T21: El TAD de los polinomios en Haskell (7)

Unidad 4 operaciones_con_polinomios
Unidad 4 operaciones_con_polinomiosUnidad 4 operaciones_con_polinomios
Unidad 4 operaciones_con_polinomios
 
Polinomios Especiales
Polinomios EspecialesPolinomios Especiales
Polinomios Especiales
 
Presentación4
Presentación4Presentación4
Presentación4
 
polinomios
 polinomios polinomios
polinomios
 
5 polinomios
5 polinomios5 polinomios
5 polinomios
 
Tema VII (Polinomios)
Tema VII (Polinomios)Tema VII (Polinomios)
Tema VII (Polinomios)
 
Polinomio.pptx
Polinomio.pptxPolinomio.pptx
Polinomio.pptx
 

Más de José A. Alonso

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalJosé A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosJosé A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalJosé A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenJosé A. Alonso
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesJosé A. Alonso
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicionalJosé A. Alonso
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellJosé A. Alonso
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasJosé A. Alonso
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenJosé A. Alonso
 
LIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasLIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasJosé A. Alonso
 
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
 
LI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesLI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesJosé A. Alonso
 

Más de José A. Alonso (14)

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 
LI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer ordenLI2011-T11: Resolución en lógica de primer orden
LI2011-T11: Resolución en lógica de primer orden
 
LI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulasLI2011-T9: Formas normales de Skolem y cláusulas
LI2011-T9: Formas normales de Skolem y cláusulas
 
LI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer ordenLI2011-T7: Deducción natural en lógica de primer orden
LI2011-T7: Deducción natural en lógica de primer orden
 
LIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasLIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivas
 
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
 
LI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesLI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionales
 

Último

Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoFundación YOD YOD
 
cortes de luz abril 2024 en la provincia de tungurahua
cortes de luz abril 2024 en la provincia de tungurahuacortes de luz abril 2024 en la provincia de tungurahua
cortes de luz abril 2024 en la provincia de tungurahuaDANNYISAACCARVAJALGA
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Carlos Muñoz
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosCesarFernandez937857
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PCCesarFernandez937857
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadAlejandrino Halire Ccahuana
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxAna Fernandez
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSjlorentemartos
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.amayarogel
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dstEphaniiie
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMarjorie Burga
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Lourdes Feria
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónLourdes Feria
 
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...JAVIER SOLIS NOYOLA
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 

Último (20)

Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativo
 
Medición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptxMedición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptx
 
Sesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdfSesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdf
 
cortes de luz abril 2024 en la provincia de tungurahua
cortes de luz abril 2024 en la provincia de tungurahuacortes de luz abril 2024 en la provincia de tungurahua
cortes de luz abril 2024 en la provincia de tungurahua
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos Básicos
 
Fe contra todo pronóstico. La fe es confianza.
Fe contra todo pronóstico. La fe es confianza.Fe contra todo pronóstico. La fe es confianza.
Fe contra todo pronóstico. La fe es confianza.
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PC
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdad
 
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdfTema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
 
Power Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptxPower Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptx
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docx
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes d
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grande
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcción
 
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...
ACERTIJO DE LA BANDERA OLÍMPICA CON ECUACIONES DE LA CIRCUNFERENCIA. Por JAVI...
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
 

I1M-T21: El TAD de los polinomios en Haskell

  • 1. Tema 21: El TAD de los polinomios Informática (2011–12) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 21: El TAD de los polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios Signatura del TAD de los polinomios Propiedades del TAD de los polinomios 2. Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como listas dispersas Los polinomios como listas densas 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de polinomios Especificación de las propiedades de los polinomios Comprobación de las propiedades 4. Operaciones con polinomios Operaciones con polinomios 2 / 55
  • 3. IM Tema 21: El TAD de los polinomios Especificación del TAD de los polinomios Signatura del TAD de los polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios Signatura del TAD de los polinomios Propiedades del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios 3 / 55
  • 4. IM Tema 21: El TAD de los polinomios Especificación del TAD de los polinomios Signatura del TAD de los polinomios Signatura del TAD de los polinomios Signatura: polCero :: Polinomio a esPolCero :: Num a => Polinomio a -> Bool consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a grado :: Polinomio a -> Int coefLider :: Num a => Polinomio a -> a restoPol :: Polinomio a -> Polinomio a Descripción de las operaciones: polCero es el polinomio cero. (esPolCero p) se verifica si p es el polinomio cero. (consPol n b p) es el polinomio bx n + p. (grado p) es el grado del polinomio p. (coefLider p) es el coeficiente líder del polinomio p. (restoPol p) es el resto del polinomio p. 4 / 55
  • 5. IM Tema 21: El TAD de los polinomios Especificación del TAD de los polinomios Signatura del TAD de los polinomios Ejemplos de polinomios Ejemplos de polinomios que se usarán en lo sucesivo. Definición: ejPol1, ejPol2, ejPol3, ejTerm:: Polinomio Int ejPol1 = consPol 4 3 (consPol 2 (-5) (consPol 0 3 polCero) ejPol2 = consPol 5 1 (consPol 2 5 (consPol 1 4 polCero)) ejPol3 = consPol 4 6 (consPol 1 2 polCero) ejTerm = consPol 1 4 polCero Evaluación: ejPol1 3*x^4 + -5*x^2 + 3 ejPol2 x^5 + 5*x^2 + 4*x ejPol3 6*x^4 + 2*x ejTerm 4*x 5 / 55
  • 6. IM Tema 21: El TAD de los polinomios Especificación del TAD de los polinomios Propiedades del TAD de los polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios Signatura del TAD de los polinomios Propiedades del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios 6 / 55
  • 7. IM Tema 21: El TAD de los polinomios Especificación del TAD de los polinomios Propiedades del TAD de los polinomios Propiedades del TAD de los polinomios 1. esPolCero polCero 2. n > grado p && b /= 0 ==> not (esPolCero (consPol n b p)) 3. consPol (grado p) (coefLider p) (restoPol p) == p 4. n > grado p && b /= 0 ==> grado (consPol n b p) == n 5. n > grado p && b /= 0 ==> coefLider (consPol n b p) == b 6. n > grado p && b /= 0 ==> restoPol (consPol n b p) == p 7 / 55
  • 8. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como listas dispersas Los polinomios como listas densas 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios 8 / 55
  • 9. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico Cabecera del módulo: module PolRepTDA ( Polinomio, polCero, -- Polinomio a esPolCero, -- Num a => Polinomio a -> Bool consPol, -- (Num a) => Int -> a -> Polinomio a -- -> Polinomio a grado, -- Polinomio a -> Int coefLider, -- Num a => Polinomio a -> a restoPol -- Polinomio a -> Polinomio a ) where 9 / 55
  • 10. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico Representamos un polinomio mediante los constructores ConsPol y PolCero. Por ejemplo, el polinomio 6x^4 -5x^2 + 4x -7 se representa por ConsPol 4 6 (ConsPol 2 (-5) (ConsPol 1 4 (ConsPol 0 (-7) PolCero))) El tipo de los polinomios. data Polinomio a = PolCero | ConsPol Int a (Polinomio a) deriving Eq 10 / 55
  • 11. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico Procedimiento de escritura de los polinomios. instance Num a => Show (Polinomio a) where show PolCero = "0" show (ConsPol 0 b PolCero) = show b show (ConsPol 0 b p) = concat [show b," + ",show p] show (ConsPol 1 b PolCero) = concat [show b,"*x"] show (ConsPol 1 b p) = concat [show b,"*x + ",show p] show (ConsPol n 1 PolCero) = concat ["x^",show n] show (ConsPol n b PolCero) = concat [show b,"*x^",show n] show (ConsPol n 1 p) = concat ["x^",show n," + ",show p] show (ConsPol n b p) = concat [show b,"*x^",show n," + ",show p] 11 / 55
  • 12. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico polCero es el polinomio cero. Por ejemplo, ghci> polCero 0 polCero :: Polinomio a polCero = PolCero (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo, esPolCero polCero True esPolCero ejPol1 False esPolCero :: Polinomio a -> Bool esPolCero PolCero = True esPolCero _ = False 12 / 55
  • 13. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico (consPol n b p) es el polinomio bx n + p. Por ejemplo, ejPol2 x^5 + 5*x^2 + 4*x consPol 3 0 ejPol2 x^5 + 5*x^2 + 4*x consPol 3 2 polCero 2*x^3 consPol 6 7 ejPol2 7*x^6 + x^5 + 5*x^2 + 4*x consPol 4 7 ejPol2 x^5 + 7*x^4 + 5*x^2 + 4*x consPol 5 7 ejPol2 8*x^5 + 5*x^2 + 4*x consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a consPol _ 0 p = p consPol n b PolCero = ConsPol n b PolCero consPol n b (ConsPol m c p) | n > m = ConsPol n b (ConsPol m c p) | n < m = ConsPol m c (consPol n b p) | b+c == 0 = p | otherwise = ConsPol n (b+c) p 13 / 55
  • 14. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico (grado p) es el grado del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x grado ejPol3 4 grado:: Polinomio a -> Int grado PolCero = 0 grado (ConsPol n _ _) = n (coefLider p) es el coeficiente líder del polinomio p. Por ejemplo, coefLider ejPol3 6 coefLider:: Num t => Polinomio t -> t coefLider PolCero = 0 coefLider (ConsPol _ b _) = b 14 / 55
  • 15. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como tipo de dato algebraico (restoPol p) es el resto del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x restoPol ejPol3 2*x ejPol2 x^5 + 5*x^2 + 4*x restoPol ejPol2 5*x^2 + 4*x restoPol :: Polinomio t -> Polinomio t restoPol PolCero = PolCero restoPol (ConsPol _ _ p) = p 15 / 55
  • 16. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como listas dispersas Los polinomios como listas densas 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios 16 / 55
  • 17. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como listas dispersas Cabecera del módulo module PolRepDispersa ( Polinomio, polCero, -- Polinomio a esPolCero, -- Num a => Polinomio a -> Bool consPol, -- (Num a) => Int -> a -> Polinomio a -- -> Polinomio a grado, -- Polinomio a -> Int coefLider, -- Num a => Polinomio a -> a restoPol -- Polinomio a -> Polinomio a ) where 17 / 55
  • 18. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como tipo listas dispersas Representaremos un polinomio por la lista de sus coeficientes ordenados en orden decreciente según el grado. Por ejemplo, el polinomio 6x^4 -5x^2 + 4x -7 se representa por la lista [6,0,-2,4,-7] Los polinomios como listas dispersas. data Polinomio a = Pol [a] deriving Eq 18 / 55
  • 19. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como listas dispersas Procedimiento de escritura de los polinomios. instance Num t => Show (Polinomio t) where show pol | esPolCero pol = "0" | n == 0 && esPolCero p = show a | n == 0 = concat [show a," + ",show p] | n == 1 && esPolCero p = concat [show a,"*x"] | n == 1 = concat [show a,"*x + ",show p] | a == 1 && esPolCero p = concat ["x^",show n] | esPolCero p = concat [show a,"*x^",show n] | a == 1 = concat ["x^",show n," + ",show p] | otherwise = concat [show a,"*x^",show n," + ",show p] where n = grado pol a = coefLider pol p = restoPol pol 19 / 55
  • 20. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como tipo listas dispersas polCero es el polinomio cero. Por ejemplo, ghci> polCero 0 polCero :: Polinomio a polCero = Pol [] (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo, esPolCero polCero True esPolCero ejPol1 False esPolCero :: Polinomio a -> Bool esPolCero (Pol []) = True esPolCero _ = False 20 / 55
  • 21. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como tipo listas dispersas (consPol n b p) es el polinomio bx n + p. Por ejemplo, ejPol2 x^5 + 5*x^2 + 4*x consPol 3 0 ejPol2 x^5 + 5*x^2 + 4*x consPol 3 2 polCero 2*x^3 consPol 6 7 ejPol2 7*x^6 + x^5 + 5*x^2 + 4*x consPol 4 7 ejPol2 x^5 + 7*x^4 + 5*x^2 + 4*x consPol 5 7 ejPol2 8*x^5 + 5*x^2 + 4*x consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a consPol _ 0 p = p consPol n b p@(Pol xs) | esPolCero p = Pol (b:replicate n 0) | n > m = Pol (b:(replicate (n-m-1) 0)++xs) | n < m = consPol m c (consPol n b (restoPol p)) | b+c == 0 = Pol (dropWhile (==0) (tail xs)) | otherwise = Pol ((b+c):tail xs) where c = coefLider p m = grado p 21 / 55
  • 22. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como tipo listas dispersas (grado p) es el grado del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x grado ejPol3 4 grado:: Polinomio a -> Int grado (Pol []) = 0 grado (Pol xs) = length xs - 1 (coefLider p) es el coeficiente líder del polinomio p. Por ejemplo, coefLider ejPol3 6 coefLider:: Num t => Polinomio t -> t coefLider (Pol []) = 0 coefLider (Pol (a:_)) = a 22 / 55
  • 23. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas dispersas Los polinomios como tipo listas dispersas (restoPol p) es el resto del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x restoPol ejPol3 2*x ejPol2 x^5 + 5*x^2 + 4*x restoPol ejPol2 5*x^2 + 4*x restoPol :: Num t => Polinomio t -> Polinomio t restoPol (Pol []) = polCero restoPol (Pol [_]) = polCero restoPol (Pol (_:b:as)) | b == 0 = Pol (dropWhile (==0) as) | otherwise = Pol (b:as) 23 / 55
  • 24. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios Los polinomios como tipo de dato algebraico Los polinomios como listas dispersas Los polinomios como listas densas 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios 24 / 55
  • 25. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas Cabecera del módulo. module PolRepDensa ( Polinomio, polCero, -- Polinomio a esPolCero, -- Num a => Polinomio a -> Bool consPol, -- Num a => Int -> a -> Polinomio a -- -> Polinomio a grado, -- Polinomio a -> Int coefLider, -- Num a => Polinomio a -> a restoPol -- Polinomio a -> Polinomio a ) where 25 / 55
  • 26. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas Representaremos un polinomio mediante una lista de pares (grado,coef), ordenados en orden decreciente según el grado. Por ejemplo, el polinomio 6x^4 -5x^2 + 4x -7 se representa por la lista de pares [(4,6),(2,-5),(1,4),(0,-7)]. Los polinomios como listas densas. data Polinomio a = Pol [(Int,a)] deriving Eq 26 / 55
  • 27. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas Procedimiento de escritura de polinomios instance Num t => Show (Polinomio t) where show pol | esPolCero pol = "0" | n == 0 && esPolCero p = show a | n == 0 = concat [show a," + ",show p] | n == 1 && esPolCero p = concat [show a,"*x"] | n == 1 = concat [show a,"*x + ",show p] | a == 1 && esPolCero p = concat ["x^",show n] | esPolCero p = concat [show a,"*x^",show n] | a == 1 = concat ["x^",show n," + ",show p] | otherwise = concat [show a,"*x^",show n," + ",show p] where n = grado pol a = coefLider pol p = restoPol pol 27 / 55
  • 28. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas polCero es el polinomio cero. Por ejemplo, ghci> polCero 0 polCero :: Num a => Polinomio a polCero = Pol [] (esPolCero p) se verifica si p es el polinomio cero. Por ejemplo, esPolCero polCero True esPolCero ejPol1 False esPolCero :: Num a => Polinomio a -> Bool esPolCero (Pol []) = True esPolCero _ = False 28 / 55
  • 29. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas (consPol n b p) es el polinomio bx n + p. Por ejemplo, ejPol2 x^5 + 5*x^2 + 4*x consPol 3 0 ejPol2 x^5 + 5*x^2 + 4*x consPol 3 2 polCero 2*x^3 consPol 6 7 ejPol2 7*x^6 + x^5 + 5*x^2 + 4*x consPol 4 7 ejPol2 x^5 + 7*x^4 + 5*x^2 + 4*x consPol 5 7 ejPol2 8*x^5 + 5*x^2 + 4*x consPol :: Num a => Int -> a -> Polinomio a -> Polinomio a consPol _ 0 p = p consPol n b p@(Pol xs) | esPolCero p = Pol [(n,b)] | n > m = Pol ((n,b):xs) | n < m = consPol m c (consPol n b (Pol (tail xs))) | b+c == 0 = Pol (tail xs) | otherwise = Pol ((n,b+c):(tail xs)) where c = coefLider p m = grado p 29 / 55
  • 30. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas (grado p) es el grado del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x grado ejPol3 4 grado:: Polinomio a -> Int grado (Pol []) = 0 grado (Pol ((n,_):_)) = n (coefLider p) es el coeficiente líder del polinomio p. Por ejemplo, coefLider ejPol3 6 coefLider:: Num t => Polinomio t -> t coefLider (Pol []) = 0 coefLider (Pol ((_,b):_)) = b 30 / 55
  • 31. IM Tema 21: El TAD de los polinomios Implementación del TAD de los polinomios Los polinomios como listas densas Los polinomios como tipo listas densas (restoPol p) es el resto del polinomio p. Por ejemplo, ejPol3 6*x^4 + 2*x restoPol ejPol3 2*x ejPol2 x^5 + 5*x^2 + 4*x restoPol ejPol2 5*x^2 + 4*x restoPol :: Num t => Polinomio t -> Polinomio t restoPol (Pol []) = polCero restoPol (Pol [_]) = polCero restoPol (Pol (_:xs)) = Pol xs 31 / 55
  • 32. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Librerías auxiliares Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de polinomios Especificación de las propiedades de los polinomios Comprobación de las propiedades 4. Operaciones con polinomios 32 / 55
  • 33. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Librerías auxiliares Comprobación de las propiedades del TAD de los polinomios Importación de la implementación a verificar. import PolRepTDA -- import PolRepDispersa -- import PolRepDensa Librerías auxiliares. import Test.QuickCheck import Test.Framework import Test.Framework.Providers.QuickCheck2 33 / 55
  • 34. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Generador de polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de polinomios Especificación de las propiedades de los polinomios Comprobación de las propiedades 4. Operaciones con polinomios 34 / 55
  • 35. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Generador de polinomios Generador de polinomios (genPol n) es un generador de polinomios. Por ejemplo, ghci> sample (genPol 1) 7*x^9 + 9*x^8 + 10*x^7 + -14*x^5 + -15*x^2 + -10 -4*x^8 + 2*x genPol :: Int -> Gen (Polinomio Int) genPol 0 = return polCero genPol n = do n <- choose (0,10) b <- choose (-10,10) p <- genPol (div n 2) return (consPol n b p) instance Arbitrary (Polinomio Int) where arbitrary = sized genPol 35 / 55
  • 36. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de los polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de polinomios Especificación de las propiedades de los polinomios Comprobación de las propiedades 4. Operaciones con polinomios 36 / 55
  • 37. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de los polinomios Especificación de las propiedades de los polinomios polCero es el polinomio cero. prop_polCero_es_cero :: Bool prop_polCero_es_cero = esPolCero polCero Si n es mayor que el grado de p y b no es cero, entonces (consPol n b p) es un polinomio distinto del cero. prop_consPol_no_cero :: Int -> Int -> Polinomio Int -> Property prop_consPol_no_cero n b p = n > grado p && b /= 0 ==> not (esPolCero (consPol n b p)) 37 / 55
  • 38. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de los polinomios Especificación de las propiedades de los polinomios (consPol (grado p) (coefLider p) (restoPol p)) es igual a p. prop_consPol :: Polinomio Int -> Bool prop_consPol p = consPol (grado p) (coefLider p) (restoPol p) == p Si n es mayor que el grado de p y b no es cero, entonces el grado de (consPol n b p) es n. prop_grado :: Int -> Int -> Polinomio Int -> Property prop_grado n b p = n > grado p && b /= 0 ==> grado (consPol n b p) == n 38 / 55
  • 39. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Especificación de las propiedades de los polinomios Especificación de las propiedades de los polinomios Si n es mayor que el grado de p y b no es cero, entonces el coeficiente líder de (consPol n b p) es b. prop_coefLider :: Int -> Int -> Polinomio Int -> Property prop_coefLider n b p = n > grado p && b /= 0 ==> coefLider (consPol n b p) == b Si n es mayor que el grado de p y b no es cero, entonces el resto de (consPol n b p) es p. prop_restoPol :: Int -> Int -> Polinomio Int -> Property prop_restoPol n b p = n > grado p && b /= 0 ==> restoPol (consPol n b p) == p 39 / 55
  • 40. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Comprobación de las propiedades Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck Librerías auxiliares Generador de polinomios Especificación de las propiedades de los polinomios Comprobación de las propiedades 4. Operaciones con polinomios 40 / 55
  • 41. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Comprobación de las propiedades Procedimiento de comprobación compruebaPropiedades comprueba todas las propiedades con la plataforma de verificación. Por ejemplo, compruebaPropiedades = defaultMain [testGroup "Propiedades del TAD polinomio:" [testProperty "P1" prop_polCero_es_cero, testProperty "P2" prop_consPol_no_cero, testProperty "P3" prop_consPol, testProperty "P4" prop_grado, testProperty "P5" prop_coefLider, testProperty "P6" prop_restoPol]] 41 / 55
  • 42. IM Tema 21: El TAD de los polinomios Comprobación de las implementaciones con QuickCheck Comprobación de las propiedades Comprobación de las propiedades de los polinomios ghci> compruebaPropiedades Propiedades del TAD polinomio:: P1: [OK, passed 100 tests] P2: [OK, passed 100 tests] P3: [OK, passed 100 tests] P4: [OK, passed 100 tests] P5: [OK, passed 100 tests] P6: [OK, passed 100 tests] Properties Total Passed 6 6 Failed 0 0 Total 6 6 42 / 55
  • 43. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Tema 21: El TAD de los polinomios 1. Especificación del TAD de los polinomios 2. Implementación del TAD de los polinomios 3. Comprobación de las implementaciones con QuickCheck 4. Operaciones con polinomios Operaciones con polinomios 43 / 55
  • 44. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Operaciones con polinomios Importación de la implementación a utilizar. import PolRepTDA -- import PolRepDispersa -- import PolRepDensa Importación de librerías auxiliares. import Test.QuickCheck import Test.Framework import Test.Framework.Providers.QuickCheck2 44 / 55
  • 45. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Funciones sobre términos (creaTermino n a) es el término ax n . Por ejemplo, creaTermino 2 5 5*x^2 creaTermino:: Num t => Int -> t -> Polinomio t creaTermino n a = consPol n a polCero (termLider p) es el término líder del polinomio p. Por ejemplo, ejPol2 x^5 + 5*x^2 + 4*x termLider ejPol2 x^5 termLider:: Num t => Polinomio t -> Polinomio t termLider p = creaTermino (grado p) (coefLider p) 45 / 55
  • 46. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Suma de polinomios (sumaPol p q) es la suma de los polinomios p y q. Por ejemplo, ejPol1 3*x^4 + -5*x^2 + 3 ejPol2 x^5 + 5*x^2 + 4*x sumaPol ejPol1 ejPol2 x^5 + 3*x^4 + 4*x + 3 sumaPol:: Num a => Polinomio a -> Polinomio a -> Polinomio a sumaPol p q | esPolCero p = q | esPolCero q = p | n1 > n2 = consPol n1 a1 (sumaPol r1 q) | n1 < n2 = consPol n2 a2 (sumaPol p r2) | a1+a2 /= 0 = consPol n1 (a1+a2) (sumaPol r1 r2) | otherwise = sumaPol r1 r2 where n1 = grado p a1 = coefLider p r1 = restoPol p n2 = grado q a2 = coefLider q r2 = restoPol q 46 / 55
  • 47. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Propiedades de la suma de polinomios El polinomio cero es el elemento neutro de la suma. prop_neutroSumaPol :: Polinomio Int -> Bool prop_neutroSumaPol p = sumaPol polCero p == p La suma es conmutativa. prop_conmutativaSuma :: Polinomio Int -> Polinomio Int -> Bool prop_conmutativaSuma p q = sumaPol p q == sumaPol q p 47 / 55
  • 48. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Producto de polinomios (multPorTerm t p) es el producto del término t por el polinomio p. Por ejemplo, ejTerm 4*x ejPol2 x^5 + 5*x^2 + 4*x multPorTerm ejTerm ejPol2 4*x^6 + 20*x^3 + 16*x^2 multPorTerm :: Num t => Polinomio t -> Polinomio t -> Polinomio t multPorTerm term pol | esPolCero pol = polCero | otherwise = consPol (n+m) (a*b) (multPorTerm term r) where n = grado term a = coefLider term m = grado pol b = coefLider pol r = restoPol pol 48 / 55
  • 49. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Producto de polinomios (multPol p q) es el producto de los polinomios p y q. Por ejemplo, ghci> ejPol1 3*x^4 + -5*x^2 + 3 ghci> ejPol2 x^5 + 5*x^2 + 4*x ghci> multPol ejPol1 ejPol2 3*x^9 + -5*x^7 + 15*x^6 + 15*x^5 + -25*x^4 + -20*x^3 + 15*x^2 + 12*x multPol :: Num a => Polinomio a -> Polinomio a -> Polinomio a multPol p q | esPolCero p = polCero | otherwise = sumaPol (multPorTerm (termLider p) q) (multPol (restoPol p) q) 49 / 55
  • 50. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Propiedades del producto polinomios El producto de polinomios es conmutativo. prop_conmutativaProducto :: Polinomio Int -> Polinomio Int -> Bool prop_conmutativaProducto p q = multPol p q == multPol q p El producto es distributivo respecto de la suma. prop_distributiva :: Polinomio Int -> Polinomio Int -> Polinomio Int -> Bool prop_distributiva p q r = multPol p (sumaPol q r) == sumaPol (multPol p q) (multPol p r) 50 / 55
  • 51. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Polinomio unidad polUnidad es el polinomio unidad. Por ejemplo, ghci> polUnidad 1 polUnidad:: Num t => Polinomio t polUnidad = consPol 0 1 polCero El polinomio unidad es el elemento neutro del producto. prop_polUnidad :: Polinomio Int -> Bool prop_polUnidad p = multPol p polUnidad == p 51 / 55
  • 52. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Valor de un polinomio en un punto (valor p c) es el valor del polinomio p al sustituir su variable por c. Por ejemplo, ejPol1 3*x^4 + -5*x^2 + 3 valor ejPol1 0 3 valor ejPol1 1 1 valor ejPol1 (-2) 31 valor:: Num a => Polinomio a -> a -> a valor p c | esPolCero p = 0 | otherwise = b*c^n + valor r c where n = grado p b = coefLider p r = restoPol p 52 / 55
  • 53. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Verificación de raices de polinomios (esRaiz c p) se verifica si c es una raiz del polinomio p. por ejemplo, ejPol3 6*x^4 + 2*x esRaiz 1 ejPol3 False esRaiz 0 ejPol3 True esRaiz:: Num a => a -> Polinomio a -> Bool esRaiz c p = valor p c == 0 53 / 55
  • 54. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Derivación de polinomios (derivada p) es la derivada del polinomio p. Por ejemplo, ejPol2 x^5 + 5*x^2 + 4*x derivada ejPol2 5*x^4 + 10*x + 4 derivada :: Polinomio Int -> Polinomio Int derivada p | n == 0 = polCero | otherwise = consPol (n-1) (n*b) (derivada r) where n = grado p b = coefLider p r = restoPol p 54 / 55
  • 55. IM Tema 21: El TAD de los polinomios Operaciones con polinomios Operaciones con polinomios Propiedades de las derivadas de polinomios La derivada de la suma es la suma de las derivadas. prop_derivada :: Polinomio Int -> Polinomio Int -> Bool prop_derivada p q = derivada (sumaPol p q) == sumaPol (derivada p) (derivada q) 55 / 55