SlideShare una empresa de Scribd logo
Tema 8: Razonamiento sobre programas
             Informática (2010–11)


             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 8: Razonamiento sobre programas




Tema 8: Razonamiento sobre programas
 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos
 2. Razonamiento por inducción sobre los naturales
       Esquema de inducción sobre los naturales
       Ejemplo de inducción sobre los naturales
 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía
                                                       2 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional




Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior
                                                       3 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Cálculo con longitud



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior
                                                       4 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Cálculo con longitud



Cálculo con longitud
         Programa:

         longitud []     = 0                 -- longitud.1
         longitud (_:xs) = 1 + longitud xs   -- longitud.2

         Propiedad: longitud [2,3,1] = 3
         Demostración:
          longitud [2,3,1]
          = 1 + longitud [2,3]               [por   longitud.2]
          = 1 + (1 + longitud [3])           [por   longitud.2]
          = 1 + (1 + (1 + longitud []))      [por   longitud.2]
          = 1 + (1 + (1 + 0)                 [por   longitud.1]
          =3


                                                                  5 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Propiedad de intercambia



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior
                                                       6 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Propiedad de intercambia



Propiedad de intercambia
         Programa:

         intercambia :: (a,b) -> (b,a)
         intercambia (x,y) = (y,x)        -- intercambia

         Propiedad: intercambia (intercambia (x,y)) = (x,y).
         Demostración:
          intercambia (intercambia (x,y))
          = intercambia (y,x)                [por intercambia]
          = (x,y)                            [por intercambia]




                                                                 7 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Propiedad de intercambia



Propiedad de intercambia
 Comprobación con QuickCheck
         Propiedad:

         prop_intercambia :: Eq a => a -> a -> Bool
         prop_intercambia x y =
             intercambia (intercambia (x,y)) == (x,y)

         Comprobación:
          *Main> quickCheck prop_intercambia
          +++ OK, passed 100 tests.




                                                        8 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Inversa de listas unitarias



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior
                                                       9 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Inversa de listas unitarias



Inversa de listas unitarias
         Inversa de una lista:

         inversa :: [a] -> [a]
         inversa []     = []                             -- inversa.1
         inversa (x:xs) = inversa xs ++ [x]              -- inversa.2
         Prop.: inversa [x] = [x]
           inversa [x]
           = inversa (x:[])               [notación de lista]
           = (inversa []) ++ [x]          [inversa.2]
           = [] ++ [x]                    [inversa.1]
           = [x]                          [def. de ++]



                                                                        10 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Inversa de listas unitarias



Inversa de listas unitarias
 Comprobación con QuickCheck
         Propiedad:

         prop_inversa_unitaria :: (Eq a) => a -> Bool
         prop_inversa_unitaria x =
             inversa [x] == [x]
         Comprobación:
          *Main> quickCheck prop_inversa_unitaria
          +++ OK, passed 100 tests.




                                                        11 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Razonamiento ecuacional con análisis de casos



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional
       Cálculo con longitud
       Propiedad de intercambia
       Inversa de listas unitarias
       Razonamiento ecuacional con análisis de casos

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior
                                                       12 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Razonamiento ecuacional con análisis de casos



Razonamiento ecuacional con análisis de casos
         Negación lógica:
                                                       Prelude
         not :: Bool -> Bool
         not False = True
         not True = False

         Prop.: not (not x) = x
         Demostración por casos:
                 Caso 1: x = True:
                   not (not True)                    = not False   [not.2]
                                                     = True        [not.1]
                 Caso 2: x = False:
                   not (not False)                   = not True    [not.1]
                                                     = False       [not.2]

                                                                             13 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento ecuacional
     Razonamiento ecuacional con análisis de casos



Razonamiento ecuacional con análisis de casos
 Comprobación con QuickCheck
         Propiedad:

         prop_doble_negacion :: Bool -> Bool
         prop_doble_negacion x =
           not (not x) == x
         Comprobación:
          *Main> quickCheck prop_doble_negacion
          +++ OK, passed 100 tests.




                                                     14 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales




Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales
       Esquema de inducción sobre los naturales
       Ejemplo de inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior


                                                     15 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Esquema de inducción sobre los naturales



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales
       Esquema de inducción sobre los naturales
       Ejemplo de inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior


                                                     16 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Esquema de inducción sobre los naturales



Esquema de inducción sobre los números naturales
 Para demostrar que todos los números naturales tienen una propiedad
 P basta probar:
    1. Caso base n=0:
       P(0).
    2. Caso inductivo n=(m+1):
       Suponiendo P(m) demostrar P(m+1).
 En el caso inductivo, la propiedad P(n) se llama la hipótesis de
 inducción.




                                                                       17 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Ejemplo de inducción sobre los naturales



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales
       Esquema de inducción sobre los naturales
       Ejemplo de inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior


                                                     18 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Ejemplo de inducción sobre los naturales



Ejemplo de inducción sobre los naturales: Propiedad
         (replicate n x) es la lista formda por n elementos iguales a x.
         Por ejemplo,
          replicate 3 5       [5,5,5]
                                Prelude
         replicate :: Int -> a -> [a]
         replicate 0     _ = []
         replicate (n+1) x = x : replicate n x

         Prop.: length (replicate n xs) = n




                                                                           19 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Ejemplo de inducción sobre los naturales



Ejemplo de inducción sobre los naturales: Demostración
         Caso base (n=0):
           length (replicate 0 xs)
           = length []                             [por replicate.1]
           =0                                      [por def. length]
         Caso inductivo (n=m+1):
          length (replicate (m+1) xs)
          = length (x:(replicate m xs))                  [por   replicate.2]
          = 1 + length (replicate m xs)                  [por   def. length]
          =1 + m                                         [por   hip. ind.]
          =m + 1                                         [por   conmutativa de +]




                                                                                    20 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre los naturales
     Ejemplo de inducción sobre los naturales



Ejemplo de inducción sobre los naturales: Verificación
 Verificación con QuickCheck:
         Especificación de la propiedad:

         prop_length_replicate :: Int -> Int -> Bool
         prop_length_replicate n xs =
             length (replicate m xs) == m
             where m = abs n
         Comprobación de la propiedad:
          *Main> quickCheck prop_length_replicate
          OK, passed 100 tests.




                                                        21 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas




Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     22 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Esquema de inducción sobre listas



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     23 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Esquema de inducción sobre listas



Esquema de inducción sobre listas
 Para demostrar que todas las listas finitas tienen una propiedad P
 basta probar:
    1. Caso base xs=[]:
       P([]).
    2. Caso inductivo xs=(y:ys):
       Suponiendo P(ys) demostrar P(y:ys).
 En el caso inductivo, la propiedad P(ys) se llama la hipótesis de
 inducción.




                                                                     24 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Asociatividad de ++



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     25 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Asociatividad de ++



Asociatividad de ++
         Programa:
                                Prelude
         (++) :: [a] -> [a] -> [a]
         []     ++ ys = ys              -- ++.1
         (x:xs) ++ ys = x : (xs ++ ys) -- ++.2

         Propiedad: xs++(ys++zs)=(xs++ys)++zs
         Comprobación con QuickCheck:

         prop_asociativa_conc :: [Int] -> [Int] -> [Int] -> Bool
         prop_asociativa_conc xs ys zs =
             xs++(ys++zs)==(xs++ys)++zs

           Main> quickCheck prop_asociatividad_conc
           OK, passed 100 tests.
                                                               26 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Asociatividad de ++



Asociatividad de ++
         Demostración por inducción en xs:
                 Caso base xs=[]: Reduciendo el lado izquierdo
                   xs++(ys++zs)
                   = []++(ys++zs)          [por hipótesis]
                   = ys++zs                [por ++.1]
                  y reduciendo el lado derecho
                    (xs++ys)++zs
                    = ([]++ys)++zs           [por hipótesis]
                    = ys++zs                 [por ++.1]
                  Luego, xs++(ys++zs)=(xs++ys)++zs




                                                                 27 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Asociatividad de ++



Asociatividad de ++
         Demostración por inducción en xs:
                 Caso inductivo xs=a:as: Suponiendo la hipótesis de inducción
                        as++(ys++zs)=(as++ys)++zs
                 hay que demostrar que
                        (a:as)++(ys++zs)=((a:as)++ys)++zs
                   (a:as)++(ys++zs)
                   = a:(as++(ys++zs))           [por ++.2]
                   = a:((as++ys)++zs)           [por hip. ind.]
                   = (a:(as++ys))++zs           [por ++.2]
                   = ((a:as)++ys)++zs           [por ++.2]




                                                                                28 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     [] es la identidad para ++ por la derecha



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     29 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     [] es la identidad para ++ por la derecha



[] es la identidad para ++ por la derecha
         Propiedad: xs++[]=xs
         Comprobación con QuickCheck:

         prop_identidad_concatenacion :: [Int] -> Bool
         prop_identidad_concatenacion xs = xs++[] == xs

           Main> quickCheck prop_identidad_concatenacion
           OK, passed 100 tests.




                                                           30 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     [] es la identidad para ++ por la derecha



[] es la identidad para ++ por la derecha
         Demostración por inducción en xs:
                 Caso base xs=[]:
                   xs++[]
                   = []++[]
                   = []                          [por ++.1]
                 Caso inductivo xs=(a:as): Suponiendo la hipótesis de inducción
                        as++[]=as
                 hay que demostrar que
                        (a:as)++[]=(a:as)
                   (a:as)++[]
                   = a:(as++[])         [por ++.2]
                   = a:as               [por hip. ind.]




                                                                                  31 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre length y ++



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     32 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre length y ++



Relación entre length y ++
         Programas:

         length :: [a] -> Int
         length []     = 0                  -- length.1
         length (x:xs) = 1 + n_length xs    -- length.2

         (++) :: [a] -> [a] -> [a]
         []     ++ ys = ys                  -- ++.1
         (x:xs) ++ ys = x : (xs ++ ys)      -- ++.2

         Propiedad: length(xs++ys)=(length xs)+(length ys)




                                                             33 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre length y ++



Relación entre length y ++
         Comprobación con QuickCheck:

         prop_length_append :: [Int] -> [Int] -> Bool
         prop_length_append xs ys =
            length(xs++ys)==(length xs)+(length ys)

          Main> quickCheck prop_length_append
          OK, passed 100 tests.
         Demostración por inducción en xs:
                 Caso base xs=[]:
                   length([]++ys)
                   = length ys                 [por ++.1]
                   = 0+(length ys)             [por aritmética]
                   = (length [])+(length ys)   [por length.1]

                                                                  34 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre length y ++



Relación entre length y ++
         Demostración por inducción en xs:
                 Caso inductivo xs=(a:as): Suponiendo la hipótesis de inducción
                        length(as++ys) = (length as)+(length ys)
                 hay que demostrar que
                        length((a:as)++ys) = (length (a:as))+(length ys)

                   length((a:as)++ys)
                   = length(a:(as++ys))                         [por   ++.2]
                   = 1 + length(as++ys)                         [por   length.2]
                   = 1 + ((length as) + (length ys))            [por   hip. ind.]
                   = (1 + (length as)) + (length ys)            [por   aritmética]
                   = (length (a:as)) + (length ys)              [por   length.2]




                                                                                     35 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre take y drop



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     36 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre take y drop



Relación entre take y drop
         Programas:

         take      :: Int ->           [a] -> [a]
         take      0 _                 = []                  -- take.1
         take      _ []                = []                  -- take.2
         take      n (x:xs)            = x : take (n-1) xs   -- take.3

         drop      :: Int ->           [a] -> [a]
         drop      0 xs                = xs                  -- drop.1
         drop      _ []                = []                  -- drop,2
         drop      n (_:xs)            = drop (n-1) xs       -- drop.3

         (++) :: [a] -> [a] -> [a]
         []     ++ ys = ys                                   -- ++.1
         (x:xs) ++ ys = x : (xs ++ ys)                       -- ++.2
                                                                         37 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre take y drop



Relación entre take y drop
         Propiedad: take n xs ++ drop n xs = xs
         Comprobación con QuickCheck:

         prop_take_drop :: Int -> [Int] -> Property
         prop_take_drop n xs =
             n >= 0 ==> take n xs ++ drop n xs == xs

          Main> quickCheck prop_take_drop
          OK, passed 100 tests.




                                                       38 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre take y drop



Relación entre take y drop
         Demostración por inducción en n:
                 Caso base n=0:
                   take 0 xs ++ drop 0 xs
                   = [] ++ xs                         [por take.1 y drop.1]
                   = xs                               [por ++.1]
                 Caso inductivo n=m+1: Suponiendo la hipótesis de inducción 1
                        (∀xs :: [a])take m xs ++ drop m xs = xs
                 hay que demostrar que
                        (∀xs :: [a])take (m+1) xs ++ drop (m+1) xs = xs




                                                                                39 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     Relación entre take y drop



Relación entre take y drop
 Lo demostraremos por inducción en xs:
     Caso base xs=[]:

          take (m+1) [] ++ drop (m+1) []
          = [] ++ []                                 [por take.2 y drop.2]
          = []                                       [por ++.1]
         Caso inductivo xs=(a:as): Suponiendo la hip. de inducción 2
                take (m+1) as ++ drop (m+1) as = as
         hay que demostrar que
               take (m+1) (a:as) ++ drop (m+1) (a:as) = (a:as)
          take (m+1) (a:as) ++ drop (m+1) (a:as)
          = (a:(take m as)) ++ (drop m as)                [take.3 y drop.3]
          = (a:((take m as) ++ (drop m as))               [por ++.2]
          = a:as                                          [por hip. de ind. 1]
                                                                          40 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     La concatenación de listas vacías es vacía



Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas
       Esquema de inducción sobre listas
       Asociatividad de ++
       [] es la identidad para ++ por la derecha
       Relación entre length y ++
       Relación entre take y drop
       La concatenación de listas vacías es vacía

 4. Equivalencia de funciones
                                                     41 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     La concatenación de listas vacías es vacía



La concatenación de listas vacías es vacía
         Programas:
                                Prelude
         null :: [a] -> Bool
         null []           = True                 -- null.1
         null (_:_)        = False                -- null.2

         (++) :: [a] -> [a] -> [a]
         []     ++ ys      = ys                   -- (++).1
         (x:xs) ++ ys      = x : (xs ++ ys)       -- (++).2

         Propiedad: null xs = null (xs ++ xs).




                                                              42 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     La concatenación de listas vacías es vacía



La concatenación de listas vacías es vacía
         Demostración por inducción en xs:
                 Caso 1: xs = []: Reduciendo el lado izquierdo
                   null xs
                   = null []         [por hipótesis]
                   = True            [por null.1]
                   y reduciendo el lado derecho
                     null (xs ++ xs)
                     = null ([] ++ [])            [por hipótesis]
                     = null []                    [por (++).1]
                     = True                       [por null.1]
                   Luego, null xs = null (xs ++ xs).




                                                                    43 / 54
IM Tema 8: Razonamiento sobre programas
  Razonamiento por inducción sobre listas
     La concatenación de listas vacías es vacía



La concatenación de listas vacías es vacía
         Demostración por inducción en xs:
                 Caso xs = (y:ys): Reduciendo el lado izquierdo
                   null xs
                   = null (y:ys)         [por hipótesis]
                   = False               [por null.2
                   y reduciendo el lado derecho
                     null (xs ++ xs)
                     = null ((y:ys) ++ (y:ys))          [por hipótesis]
                     = null (y:(ys ++ (y:ys))           [por (++).2]
                     = False                            [por null.2
                   Luego, null xs = null (xs ++ xs).




                                                                          44 / 54
IM Tema 8: Razonamiento sobre programas
  Equivalencia de funciones




Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior




                                                     45 / 54
IM Tema 8: Razonamiento sobre programas
  Equivalencia de funciones




Equivalencia de funciones
         Programas:

         inversa1, inversa2 :: [a] -> [a]
         inversa1 []     = []
         inversa1 (x:xs) = inversa1 xs ++ [x]

         inversa2 xs = inversa2Aux xs []
             where inversa2Aux []     ys = ys
                   inversa2Aux (x:xs) ys = inversa2Aux xs (x:ys)
         Propiedad: inversa1 xs = inversa2 xs
         Comprobación con QuickCheck:

         prop_equiv_inversa :: [Int] -> Bool
         prop_equiv_inversa xs = inversa1 xs == inversa2 xs
                                                               46 / 54
IM Tema 8: Razonamiento sobre programas
  Equivalencia de funciones




Equivalencia de funciones
         Demostración: Es consecuencia del siguiente lema:
               inversa1 xs ++ ys = inversa2Aux xs ys
          En efecto,
            inversa1 xs
            = inversa1 xs ++ []            [por identidad de ++]
            = inversa2Aux xs ++ []         [por el lema]
            = inversa2 xs                  [por el inversa2.1]




                                                                   47 / 54
IM Tema 8: Razonamiento sobre programas
  Equivalencia de funciones




Equivalencia de funciones
         Demostración del lema: Por inducción en xs:
                 Caso base xs=[]:
                   inversa1 [] ++ ys
                   = [] ++ ys                     [por inversa1.1]
                   = ys                           [por ++.1]
                   = inversa2Aux [] ++ ys         [por inversa2Aux.1]
                 Caso inductivo xs=(a:as): La hipótesis de inducción es
                         (∀ys :: [a])inversa1 as ++ ys = inversa2Aux as ys
                  Por tanto,
                   inversa1 (a:as) ++ ys
                   = (inversa1 as ++ [a]) ++ ys           [por   inversa1.2]
                   = (inversa1 as) ++ ([a] ++ ys)         [por   asociativa de ++]
                   = (inversa1 as) ++ (a:ys)              [por   ley unitaria]
                   = (inversa2Aux as (a:ys)               [por   hip. de inducción]
                   = (inversa2Aux (a:as) ys               [por   inversa2Aux.2]
                                                                                 48 / 54
IM Tema 8: Razonamiento sobre programas
  Propiedades de funciones de orden superior




Tema 8: Razonamiento sobre programas

 1. Razonamiento ecuacional

 2. Razonamiento por inducción sobre los naturales

 3. Razonamiento por inducción sobre listas

 4. Equivalencia de funciones

 5. Propiedades de funciones de orden superior




                                                     49 / 54
IM Tema 8: Razonamiento sobre programas
  Propiedades de funciones de orden superior




Relación entre sum y map
         La función sum:
                                Prelude
         sum :: [Int] -> Int
         sum []     = 0
         sum (x:xs) = x + sum xs

         Propiedad: sum (map (2*) xs) = 2 * sum xs
         Comprobación con QuickCheck:

         prop_sum_map :: [Int] -> Bool
         prop_sum_map xs = sum (map (2*) xs) == 2 * sum xs

          *Main> quickCheck prop_sum_map
          +++ OK, passed 100 tests.
                                                             50 / 54
IM Tema 8: Razonamiento sobre programas
  Propiedades de funciones de orden superior




Relación entre sum y map
 Demostración de la propiedad por inducción en xs
         Caso []:
           sum (map (2*) xs)
           = sum (map (2*) [])                 [por   hipótesis]
           = sum []                            [por   map.1]
           =0                                  [por   sum.1]
           =2 * 0                              [por   aritmética]
           = 2 * sum []                        [por   sum.1]
           = 2 * sum xs                        [por   hipótesis]




                                                                    51 / 54
IM Tema 8: Razonamiento sobre programas
  Propiedades de funciones de orden superior




Relación entre sum y map
         Caso xs=(y:ys): Entonces,
          sum (map (2*) xs)
          = sum (map (2*) (y:ys))              [por   hipótesis]
          = sum (2*) y : (map (2*) ys)         [por   map.2]
          = (2*) y + (sum (map (2*) ys))       [por   sum.2]
          = (2*) y + (2 * sum ys)              [por   hip. de inducción]
          = (2 * y) + (2 * sum ys)             [por   (2*)]
          = 2 * (y + sum ys)                   [por   aritmética]
          = 2 * sum (y:ys)                     [por   sum.2]
          = 2 * sum xs                         [por   hipótesis]




                                                                     52 / 54
IM Tema 8: Razonamiento sobre programas
  Propiedades de funciones de orden superior




Comprobación de propiedades con argumentos funcionales
         La aplicación de una función a los elemntos de una lista conserva
         su longitud:

         prop_map_length (Function _ f) xs =
             length (map f xs) == length xs

         En el inicio del fichero hay que escribir

         import Test.QuickCheck.Function

         Comprobación
          *Main> quickCheck prop_map_length
          +++ OK, passed 100 tests.


                                                                             53 / 54
IM Tema 8: Razonamiento sobre programas
  Bibliografía




Bibliografía
    1. H. C. Cunningham (2007) Notes on Functional Programming
       with Haskell.
    2. J. Fokker (1996) Programación funcional.
    3. G. Hutton Programming in Haskell. Cambridge University Press,
       2007.
                 Cap. 13: Reasoning about programs.
    4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
       con Haskell. Thompson, 2004.
                 Cap. 6: Programación con listas.
    5. S. Thompson. Haskell: The Craft of Functional Programming,
       Second Edition. Addison-Wesley, 1999.
                 Cap. 8: Reasoning about programs.
    6. E.P. Wentworth (1994) Introduction to Funcional Programming.

                                                                         54 / 54

Más contenido relacionado

La actualidad más candente

Eliminar elementos de una cola
Eliminar elementos de una colaEliminar elementos de una cola
Eliminar elementos de una cola
jeffersoncenteno
 
2. requerimientos del software
2. requerimientos del software2. requerimientos del software
2. requerimientos del softwareuniv of pamplona
 
Metodología de desarrollo de software rad
 Metodología de desarrollo de software rad Metodología de desarrollo de software rad
Metodología de desarrollo de software radmarcosxm
 
6 Principios de Programación Orientada a Objetos
6 Principios de Programación Orientada a Objetos6 Principios de Programación Orientada a Objetos
6 Principios de Programación Orientada a Objetos
Jose Emilio Labra Gayo
 
Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2
angela montilla
 
Eficiencia de algoritmos - Vanessa Ramirez
Eficiencia de algoritmos - Vanessa RamirezEficiencia de algoritmos - Vanessa Ramirez
Eficiencia de algoritmos - Vanessa Ramirez
Vanessa Ramirez
 
Cuadro comparativo modelos para el desarrollo de software
Cuadro comparativo modelos para el desarrollo de softwareCuadro comparativo modelos para el desarrollo de software
Cuadro comparativo modelos para el desarrollo de software
paoaboytes
 
Unidad 2.1 DiseñO De Sistemas
Unidad 2.1 DiseñO De SistemasUnidad 2.1 DiseñO De Sistemas
Unidad 2.1 DiseñO De SistemasSergio Sanchez
 
Métodos POO
Métodos POOMétodos POO
Métodos POO
1da4
 
Gestión del Cambio del Software
Gestión del Cambio del SoftwareGestión del Cambio del Software
Gestión del Cambio del Software
Iliana Maritza Burguan Valverde
 
SQA
SQASQA
Ciclo de vida por prototipos
Ciclo de vida por prototiposCiclo de vida por prototipos
Ciclo de vida por prototiposMay Rodriguez
 
Valores y prácticas XP
Valores y prácticas XPValores y prácticas XP
Valores y prácticas XP
Domingo Gallardo
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeInt
Cristian C
 
Capas de la ingenieria de software
Capas de la ingenieria de softwareCapas de la ingenieria de software
Capas de la ingenieria de software
Eduardo Navarrete Salazar
 
naturaleza del software
naturaleza del softwarenaturaleza del software
naturaleza del software
Edwin Javier Rodriguez Guerra
 
Ingeniería inversa y reingeniería de software
Ingeniería inversa y reingeniería de softwareIngeniería inversa y reingeniería de software
Ingeniería inversa y reingeniería de software
Moises Medina
 
Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico maryr_
 

La actualidad más candente (20)

Eliminar elementos de una cola
Eliminar elementos de una colaEliminar elementos de una cola
Eliminar elementos de una cola
 
2. requerimientos del software
2. requerimientos del software2. requerimientos del software
2. requerimientos del software
 
Metodología de desarrollo de software rad
 Metodología de desarrollo de software rad Metodología de desarrollo de software rad
Metodología de desarrollo de software rad
 
6 Principios de Programación Orientada a Objetos
6 Principios de Programación Orientada a Objetos6 Principios de Programación Orientada a Objetos
6 Principios de Programación Orientada a Objetos
 
Modelo incremental
Modelo incrementalModelo incremental
Modelo incremental
 
Metodos de ordenamiento 2
Metodos de ordenamiento 2Metodos de ordenamiento 2
Metodos de ordenamiento 2
 
Eficiencia de algoritmos - Vanessa Ramirez
Eficiencia de algoritmos - Vanessa RamirezEficiencia de algoritmos - Vanessa Ramirez
Eficiencia de algoritmos - Vanessa Ramirez
 
Cuadro comparativo modelos para el desarrollo de software
Cuadro comparativo modelos para el desarrollo de softwareCuadro comparativo modelos para el desarrollo de software
Cuadro comparativo modelos para el desarrollo de software
 
Unidad 2.1 DiseñO De Sistemas
Unidad 2.1 DiseñO De SistemasUnidad 2.1 DiseñO De Sistemas
Unidad 2.1 DiseñO De Sistemas
 
Roles desarrollo del software
Roles desarrollo del softwareRoles desarrollo del software
Roles desarrollo del software
 
Métodos POO
Métodos POOMétodos POO
Métodos POO
 
Gestión del Cambio del Software
Gestión del Cambio del SoftwareGestión del Cambio del Software
Gestión del Cambio del Software
 
SQA
SQASQA
SQA
 
Ciclo de vida por prototipos
Ciclo de vida por prototiposCiclo de vida por prototipos
Ciclo de vida por prototipos
 
Valores y prácticas XP
Valores y prácticas XPValores y prácticas XP
Valores y prácticas XP
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeInt
 
Capas de la ingenieria de software
Capas de la ingenieria de softwareCapas de la ingenieria de software
Capas de la ingenieria de software
 
naturaleza del software
naturaleza del softwarenaturaleza del software
naturaleza del software
 
Ingeniería inversa y reingeniería de software
Ingeniería inversa y reingeniería de softwareIngeniería inversa y reingeniería de software
Ingeniería inversa y reingeniería de software
 
Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico Actividad 2 Analizador léxico, sintáctico y semántico
Actividad 2 Analizador léxico, sintáctico y semántico
 

Destacado

Ejercicios logica matematica
Ejercicios logica matematicaEjercicios logica matematica
Ejercicios logica matematica
Alfredo Pintado
 
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
 
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
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 Haskell
José 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 Haskell
José A. Alonso
 
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
 
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
José 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úsqueda
José 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ático
José 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 Haskell
José A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalJosé 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
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
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 Haskell
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
 
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
José 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
 
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
José A. Alonso
 

Destacado (20)

Ejercicios logica matematica
Ejercicios logica matematicaEjercicios logica matematica
Ejercicios logica matematica
 
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
 
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
 
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
 
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
 
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.
 
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
 
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
 
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
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
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
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
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
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
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
 
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.
 
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
 

Similar a Tema 8: Razonamiento sobre programas Haskell.

Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
José A. Alonso
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
José A. Alonso
 
Practica i prolog
Practica i prologPractica i prolog
Practica i prolog
KerenSnchez2
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en Haskell
José A. Alonso
 
Algoritmos y Estructura de Datos
Algoritmos y Estructura de DatosAlgoritmos y Estructura de Datos
Algoritmos y Estructura de Datos
supito01
 
Introducción Programación
Introducción ProgramaciónIntroducción Programación
Introducción Programación
RalDavidFloresSerran
 
Tema6
Tema6Tema6
Tema6.ppt
Tema6.pptTema6.ppt
fundamentos y elementos de programación básicos
fundamentos y elementos  de programación básicosfundamentos y elementos  de programación básicos
fundamentos y elementos de programación básicos
martha449484
 
Recursividad
RecursividadRecursividad
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programaciónfpcanizaresg
 
Introduccion a la programacion
Introduccion a la programacionIntroduccion a la programacion
Introduccion a la programacion
BETTYLLANOS
 

Similar a Tema 8: Razonamiento sobre programas Haskell. (16)

Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
 
tema-1.pptx
tema-1.pptxtema-1.pptx
tema-1.pptx
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
Practica i prolog
Practica i prologPractica i prolog
Practica i prolog
 
Tema6
Tema6Tema6
Tema6
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en Haskell
 
Algoritmos y Estructura de Datos
Algoritmos y Estructura de DatosAlgoritmos y Estructura de Datos
Algoritmos y Estructura de Datos
 
2 algoritmos-1
2 algoritmos-12 algoritmos-1
2 algoritmos-1
 
Introducción Programación
Introducción ProgramaciónIntroducción Programación
Introducción Programación
 
Tema6
Tema6Tema6
Tema6
 
Tema6.ppt
Tema6.pptTema6.ppt
Tema6.ppt
 
fundamentos y elementos de programación básicos
fundamentos y elementos  de programación básicosfundamentos y elementos  de programación básicos
fundamentos y elementos de programación básicos
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Recursividad
RecursividadRecursividad
Recursividad
 
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programación
 
Introduccion a la programacion
Introduccion a la programacionIntroduccion a la programacion
Introduccion a la programacion
 

Más de José 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 algoritmos
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 proposicional
José 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
 
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
José 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. Aplicaciones
José 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 Haskell
José 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 orden
José 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áusulas
José 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 orden
José A. Alonso
 
LIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivasLIT4: Formales normales conjuntivas y disyuntivas
LIT4: Formales normales conjuntivas y disyuntivas
José 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 Haskell
José A. Alonso
 
LI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionalesLI2011-T3: Tableros semánticos proposicionales
LI2011-T3: Tableros semánticos proposicionales
José A. Alonso
 

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

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
 
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
 
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
 
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

3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
rosannatasaycoyactay
 
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docxENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
SandraPiza2
 
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdfAsistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
Demetrio Ccesa Rayme
 
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdfHABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
DIANADIAZSILVA1
 
Friedrich Nietzsche. Presentación de 2 de Bachillerato.
Friedrich Nietzsche. Presentación de 2 de Bachillerato.Friedrich Nietzsche. Presentación de 2 de Bachillerato.
Friedrich Nietzsche. Presentación de 2 de Bachillerato.
pablomarin116
 
Sesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdfSesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdf
https://gramadal.wordpress.com/
 
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdfFORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
El Fortí
 
Conocemos la ermita de Ntra. Sra. del Arrabal
Conocemos la ermita de Ntra. Sra. del ArrabalConocemos la ermita de Ntra. Sra. del Arrabal
Conocemos la ermita de Ntra. Sra. del Arrabal
Profes de Relideleón Apellidos
 
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIACONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
BetzabePecheSalcedo1
 
corpus-christi-sesion-de-aprendizaje.pdf
corpus-christi-sesion-de-aprendizaje.pdfcorpus-christi-sesion-de-aprendizaje.pdf
corpus-christi-sesion-de-aprendizaje.pdf
YolandaRodriguezChin
 
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptxc3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
Martín Ramírez
 
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
JAVIER SOLIS NOYOLA
 
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
20minutos
 
Portafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPNPortafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPN
jmorales40
 
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
AracelidelRocioOrdez
 
UNIDAD DE APRENDIZAJE DEL MES Junio 2024
UNIDAD DE APRENDIZAJE DEL MES  Junio 2024UNIDAD DE APRENDIZAJE DEL MES  Junio 2024
UNIDAD DE APRENDIZAJE DEL MES Junio 2024
EdwardYumbato1
 
Mapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativaMapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativa
TatianaVanessaAltami
 
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernándezPRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
Ruben53283
 
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
Monseespinoza6
 
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIALCUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
DivinoNioJess885
 

Último (20)

3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
3° UNIDAD 3 CUIDAMOS EL AMBIENTE RECICLANDO EN FAMILIA 933623393 PROF YESSENI...
 
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docxENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
ENSAYO SOBRE LA ANSIEDAD Y LA DEPRESION.docx
 
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdfAsistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
Asistencia Tecnica Cultura Escolar Inclusiva Ccesa007.pdf
 
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdfHABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
HABILIDADES MOTRICES BASICAS Y ESPECIFICAS.pdf
 
Friedrich Nietzsche. Presentación de 2 de Bachillerato.
Friedrich Nietzsche. Presentación de 2 de Bachillerato.Friedrich Nietzsche. Presentación de 2 de Bachillerato.
Friedrich Nietzsche. Presentación de 2 de Bachillerato.
 
Sesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdfSesión: El fundamento del gobierno de Dios.pdf
Sesión: El fundamento del gobierno de Dios.pdf
 
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdfFORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
FORTI-JUNIO 2024. CIENCIA, EDUCACION, CULTURA,pdf
 
Conocemos la ermita de Ntra. Sra. del Arrabal
Conocemos la ermita de Ntra. Sra. del ArrabalConocemos la ermita de Ntra. Sra. del Arrabal
Conocemos la ermita de Ntra. Sra. del Arrabal
 
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIACONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
CONCLUSIONES-DESCRIPTIVAS NIVEL PRIMARIA
 
corpus-christi-sesion-de-aprendizaje.pdf
corpus-christi-sesion-de-aprendizaje.pdfcorpus-christi-sesion-de-aprendizaje.pdf
corpus-christi-sesion-de-aprendizaje.pdf
 
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptxc3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
c3.hu3.p3.p2.Superioridad e inferioridad en la sociedad.pptx
 
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...
 
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
Horarios y fechas de la PAU 2024 en la Comunidad Valenciana.
 
Portafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPNPortafolio de servicios Centro de Educación Continua EPN
Portafolio de servicios Centro de Educación Continua EPN
 
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
Septima-Sesion-Ordinaria-del-Consejo-Tecnico-Escolar-y-el-Taller-Intensivo-de...
 
UNIDAD DE APRENDIZAJE DEL MES Junio 2024
UNIDAD DE APRENDIZAJE DEL MES  Junio 2024UNIDAD DE APRENDIZAJE DEL MES  Junio 2024
UNIDAD DE APRENDIZAJE DEL MES Junio 2024
 
Mapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativaMapa_Conceptual de los fundamentos de la evaluación educativa
Mapa_Conceptual de los fundamentos de la evaluación educativa
 
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernándezPRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
PRÁCTICAS PEDAGOGÍA.pdf_Educación Y Sociedad_AnaFernández
 
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
Productos contestatos de la Séptima sesión ordinaria de CTE y TIFC para Docen...
 
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIALCUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
CUENTO EL TIGRILLO DESOBEDIENTE PARA INICIAL
 

Tema 8: Razonamiento sobre programas Haskell.

  • 1. Tema 8: Razonamiento sobre programas Informática (2010–11) 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 8: Razonamiento sobre programas Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Ejemplo de inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 2 / 54
  • 3. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 3 / 54
  • 4. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Cálculo con longitud Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 4 / 54
  • 5. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Cálculo con longitud Cálculo con longitud Programa: longitud [] = 0 -- longitud.1 longitud (_:xs) = 1 + longitud xs -- longitud.2 Propiedad: longitud [2,3,1] = 3 Demostración: longitud [2,3,1] = 1 + longitud [2,3] [por longitud.2] = 1 + (1 + longitud [3]) [por longitud.2] = 1 + (1 + (1 + longitud [])) [por longitud.2] = 1 + (1 + (1 + 0) [por longitud.1] =3 5 / 54
  • 6. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Propiedad de intercambia Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 6 / 54
  • 7. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Propiedad de intercambia Propiedad de intercambia Programa: intercambia :: (a,b) -> (b,a) intercambia (x,y) = (y,x) -- intercambia Propiedad: intercambia (intercambia (x,y)) = (x,y). Demostración: intercambia (intercambia (x,y)) = intercambia (y,x) [por intercambia] = (x,y) [por intercambia] 7 / 54
  • 8. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Propiedad de intercambia Propiedad de intercambia Comprobación con QuickCheck Propiedad: prop_intercambia :: Eq a => a -> a -> Bool prop_intercambia x y = intercambia (intercambia (x,y)) == (x,y) Comprobación: *Main> quickCheck prop_intercambia +++ OK, passed 100 tests. 8 / 54
  • 9. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Inversa de listas unitarias Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 9 / 54
  • 10. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Inversa de listas unitarias Inversa de listas unitarias Inversa de una lista: inversa :: [a] -> [a] inversa [] = [] -- inversa.1 inversa (x:xs) = inversa xs ++ [x] -- inversa.2 Prop.: inversa [x] = [x] inversa [x] = inversa (x:[]) [notación de lista] = (inversa []) ++ [x] [inversa.2] = [] ++ [x] [inversa.1] = [x] [def. de ++] 10 / 54
  • 11. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Inversa de listas unitarias Inversa de listas unitarias Comprobación con QuickCheck Propiedad: prop_inversa_unitaria :: (Eq a) => a -> Bool prop_inversa_unitaria x = inversa [x] == [x] Comprobación: *Main> quickCheck prop_inversa_unitaria +++ OK, passed 100 tests. 11 / 54
  • 12. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Razonamiento ecuacional con análisis de casos Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional Cálculo con longitud Propiedad de intercambia Inversa de listas unitarias Razonamiento ecuacional con análisis de casos 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 12 / 54
  • 13. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Razonamiento ecuacional con análisis de casos Razonamiento ecuacional con análisis de casos Negación lógica: Prelude not :: Bool -> Bool not False = True not True = False Prop.: not (not x) = x Demostración por casos: Caso 1: x = True: not (not True) = not False [not.2] = True [not.1] Caso 2: x = False: not (not False) = not True [not.1] = False [not.2] 13 / 54
  • 14. IM Tema 8: Razonamiento sobre programas Razonamiento ecuacional Razonamiento ecuacional con análisis de casos Razonamiento ecuacional con análisis de casos Comprobación con QuickCheck Propiedad: prop_doble_negacion :: Bool -> Bool prop_doble_negacion x = not (not x) == x Comprobación: *Main> quickCheck prop_doble_negacion +++ OK, passed 100 tests. 14 / 54
  • 15. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Ejemplo de inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 15 / 54
  • 16. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Ejemplo de inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 16 / 54
  • 17. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Esquema de inducción sobre los números naturales Para demostrar que todos los números naturales tienen una propiedad P basta probar: 1. Caso base n=0: P(0). 2. Caso inductivo n=(m+1): Suponiendo P(m) demostrar P(m+1). En el caso inductivo, la propiedad P(n) se llama la hipótesis de inducción. 17 / 54
  • 18. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Ejemplo de inducción sobre los naturales Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales Esquema de inducción sobre los naturales Ejemplo de inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 18 / 54
  • 19. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Ejemplo de inducción sobre los naturales Ejemplo de inducción sobre los naturales: Propiedad (replicate n x) es la lista formda por n elementos iguales a x. Por ejemplo, replicate 3 5 [5,5,5] Prelude replicate :: Int -> a -> [a] replicate 0 _ = [] replicate (n+1) x = x : replicate n x Prop.: length (replicate n xs) = n 19 / 54
  • 20. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Ejemplo de inducción sobre los naturales Ejemplo de inducción sobre los naturales: Demostración Caso base (n=0): length (replicate 0 xs) = length [] [por replicate.1] =0 [por def. length] Caso inductivo (n=m+1): length (replicate (m+1) xs) = length (x:(replicate m xs)) [por replicate.2] = 1 + length (replicate m xs) [por def. length] =1 + m [por hip. ind.] =m + 1 [por conmutativa de +] 20 / 54
  • 21. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre los naturales Ejemplo de inducción sobre los naturales Ejemplo de inducción sobre los naturales: Verificación Verificación con QuickCheck: Especificación de la propiedad: prop_length_replicate :: Int -> Int -> Bool prop_length_replicate n xs = length (replicate m xs) == m where m = abs n Comprobación de la propiedad: *Main> quickCheck prop_length_replicate OK, passed 100 tests. 21 / 54
  • 22. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 22 / 54
  • 23. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Esquema de inducción sobre listas Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 23 / 54
  • 24. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Esquema de inducción sobre listas Esquema de inducción sobre listas Para demostrar que todas las listas finitas tienen una propiedad P basta probar: 1. Caso base xs=[]: P([]). 2. Caso inductivo xs=(y:ys): Suponiendo P(ys) demostrar P(y:ys). En el caso inductivo, la propiedad P(ys) se llama la hipótesis de inducción. 24 / 54
  • 25. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Asociatividad de ++ Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 25 / 54
  • 26. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Asociatividad de ++ Asociatividad de ++ Programa: Prelude (++) :: [a] -> [a] -> [a] [] ++ ys = ys -- ++.1 (x:xs) ++ ys = x : (xs ++ ys) -- ++.2 Propiedad: xs++(ys++zs)=(xs++ys)++zs Comprobación con QuickCheck: prop_asociativa_conc :: [Int] -> [Int] -> [Int] -> Bool prop_asociativa_conc xs ys zs = xs++(ys++zs)==(xs++ys)++zs Main> quickCheck prop_asociatividad_conc OK, passed 100 tests. 26 / 54
  • 27. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Asociatividad de ++ Asociatividad de ++ Demostración por inducción en xs: Caso base xs=[]: Reduciendo el lado izquierdo xs++(ys++zs) = []++(ys++zs) [por hipótesis] = ys++zs [por ++.1] y reduciendo el lado derecho (xs++ys)++zs = ([]++ys)++zs [por hipótesis] = ys++zs [por ++.1] Luego, xs++(ys++zs)=(xs++ys)++zs 27 / 54
  • 28. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Asociatividad de ++ Asociatividad de ++ Demostración por inducción en xs: Caso inductivo xs=a:as: Suponiendo la hipótesis de inducción as++(ys++zs)=(as++ys)++zs hay que demostrar que (a:as)++(ys++zs)=((a:as)++ys)++zs (a:as)++(ys++zs) = a:(as++(ys++zs)) [por ++.2] = a:((as++ys)++zs) [por hip. ind.] = (a:(as++ys))++zs [por ++.2] = ((a:as)++ys)++zs [por ++.2] 28 / 54
  • 29. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas [] es la identidad para ++ por la derecha Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 29 / 54
  • 30. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas [] es la identidad para ++ por la derecha [] es la identidad para ++ por la derecha Propiedad: xs++[]=xs Comprobación con QuickCheck: prop_identidad_concatenacion :: [Int] -> Bool prop_identidad_concatenacion xs = xs++[] == xs Main> quickCheck prop_identidad_concatenacion OK, passed 100 tests. 30 / 54
  • 31. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas [] es la identidad para ++ por la derecha [] es la identidad para ++ por la derecha Demostración por inducción en xs: Caso base xs=[]: xs++[] = []++[] = [] [por ++.1] Caso inductivo xs=(a:as): Suponiendo la hipótesis de inducción as++[]=as hay que demostrar que (a:as)++[]=(a:as) (a:as)++[] = a:(as++[]) [por ++.2] = a:as [por hip. ind.] 31 / 54
  • 32. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre length y ++ Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 32 / 54
  • 33. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre length y ++ Relación entre length y ++ Programas: length :: [a] -> Int length [] = 0 -- length.1 length (x:xs) = 1 + n_length xs -- length.2 (++) :: [a] -> [a] -> [a] [] ++ ys = ys -- ++.1 (x:xs) ++ ys = x : (xs ++ ys) -- ++.2 Propiedad: length(xs++ys)=(length xs)+(length ys) 33 / 54
  • 34. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre length y ++ Relación entre length y ++ Comprobación con QuickCheck: prop_length_append :: [Int] -> [Int] -> Bool prop_length_append xs ys = length(xs++ys)==(length xs)+(length ys) Main> quickCheck prop_length_append OK, passed 100 tests. Demostración por inducción en xs: Caso base xs=[]: length([]++ys) = length ys [por ++.1] = 0+(length ys) [por aritmética] = (length [])+(length ys) [por length.1] 34 / 54
  • 35. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre length y ++ Relación entre length y ++ Demostración por inducción en xs: Caso inductivo xs=(a:as): Suponiendo la hipótesis de inducción length(as++ys) = (length as)+(length ys) hay que demostrar que length((a:as)++ys) = (length (a:as))+(length ys) length((a:as)++ys) = length(a:(as++ys)) [por ++.2] = 1 + length(as++ys) [por length.2] = 1 + ((length as) + (length ys)) [por hip. ind.] = (1 + (length as)) + (length ys) [por aritmética] = (length (a:as)) + (length ys) [por length.2] 35 / 54
  • 36. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre take y drop Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 36 / 54
  • 37. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre take y drop Relación entre take y drop Programas: take :: Int -> [a] -> [a] take 0 _ = [] -- take.1 take _ [] = [] -- take.2 take n (x:xs) = x : take (n-1) xs -- take.3 drop :: Int -> [a] -> [a] drop 0 xs = xs -- drop.1 drop _ [] = [] -- drop,2 drop n (_:xs) = drop (n-1) xs -- drop.3 (++) :: [a] -> [a] -> [a] [] ++ ys = ys -- ++.1 (x:xs) ++ ys = x : (xs ++ ys) -- ++.2 37 / 54
  • 38. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre take y drop Relación entre take y drop Propiedad: take n xs ++ drop n xs = xs Comprobación con QuickCheck: prop_take_drop :: Int -> [Int] -> Property prop_take_drop n xs = n >= 0 ==> take n xs ++ drop n xs == xs Main> quickCheck prop_take_drop OK, passed 100 tests. 38 / 54
  • 39. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre take y drop Relación entre take y drop Demostración por inducción en n: Caso base n=0: take 0 xs ++ drop 0 xs = [] ++ xs [por take.1 y drop.1] = xs [por ++.1] Caso inductivo n=m+1: Suponiendo la hipótesis de inducción 1 (∀xs :: [a])take m xs ++ drop m xs = xs hay que demostrar que (∀xs :: [a])take (m+1) xs ++ drop (m+1) xs = xs 39 / 54
  • 40. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas Relación entre take y drop Relación entre take y drop Lo demostraremos por inducción en xs: Caso base xs=[]: take (m+1) [] ++ drop (m+1) [] = [] ++ [] [por take.2 y drop.2] = [] [por ++.1] Caso inductivo xs=(a:as): Suponiendo la hip. de inducción 2 take (m+1) as ++ drop (m+1) as = as hay que demostrar que take (m+1) (a:as) ++ drop (m+1) (a:as) = (a:as) take (m+1) (a:as) ++ drop (m+1) (a:as) = (a:(take m as)) ++ (drop m as) [take.3 y drop.3] = (a:((take m as) ++ (drop m as)) [por ++.2] = a:as [por hip. de ind. 1] 40 / 54
  • 41. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas La concatenación de listas vacías es vacía Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas Esquema de inducción sobre listas Asociatividad de ++ [] es la identidad para ++ por la derecha Relación entre length y ++ Relación entre take y drop La concatenación de listas vacías es vacía 4. Equivalencia de funciones 41 / 54
  • 42. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas La concatenación de listas vacías es vacía La concatenación de listas vacías es vacía Programas: Prelude null :: [a] -> Bool null [] = True -- null.1 null (_:_) = False -- null.2 (++) :: [a] -> [a] -> [a] [] ++ ys = ys -- (++).1 (x:xs) ++ ys = x : (xs ++ ys) -- (++).2 Propiedad: null xs = null (xs ++ xs). 42 / 54
  • 43. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas La concatenación de listas vacías es vacía La concatenación de listas vacías es vacía Demostración por inducción en xs: Caso 1: xs = []: Reduciendo el lado izquierdo null xs = null [] [por hipótesis] = True [por null.1] y reduciendo el lado derecho null (xs ++ xs) = null ([] ++ []) [por hipótesis] = null [] [por (++).1] = True [por null.1] Luego, null xs = null (xs ++ xs). 43 / 54
  • 44. IM Tema 8: Razonamiento sobre programas Razonamiento por inducción sobre listas La concatenación de listas vacías es vacía La concatenación de listas vacías es vacía Demostración por inducción en xs: Caso xs = (y:ys): Reduciendo el lado izquierdo null xs = null (y:ys) [por hipótesis] = False [por null.2 y reduciendo el lado derecho null (xs ++ xs) = null ((y:ys) ++ (y:ys)) [por hipótesis] = null (y:(ys ++ (y:ys)) [por (++).2] = False [por null.2 Luego, null xs = null (xs ++ xs). 44 / 54
  • 45. IM Tema 8: Razonamiento sobre programas Equivalencia de funciones Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 45 / 54
  • 46. IM Tema 8: Razonamiento sobre programas Equivalencia de funciones Equivalencia de funciones Programas: inversa1, inversa2 :: [a] -> [a] inversa1 [] = [] inversa1 (x:xs) = inversa1 xs ++ [x] inversa2 xs = inversa2Aux xs [] where inversa2Aux [] ys = ys inversa2Aux (x:xs) ys = inversa2Aux xs (x:ys) Propiedad: inversa1 xs = inversa2 xs Comprobación con QuickCheck: prop_equiv_inversa :: [Int] -> Bool prop_equiv_inversa xs = inversa1 xs == inversa2 xs 46 / 54
  • 47. IM Tema 8: Razonamiento sobre programas Equivalencia de funciones Equivalencia de funciones Demostración: Es consecuencia del siguiente lema: inversa1 xs ++ ys = inversa2Aux xs ys En efecto, inversa1 xs = inversa1 xs ++ [] [por identidad de ++] = inversa2Aux xs ++ [] [por el lema] = inversa2 xs [por el inversa2.1] 47 / 54
  • 48. IM Tema 8: Razonamiento sobre programas Equivalencia de funciones Equivalencia de funciones Demostración del lema: Por inducción en xs: Caso base xs=[]: inversa1 [] ++ ys = [] ++ ys [por inversa1.1] = ys [por ++.1] = inversa2Aux [] ++ ys [por inversa2Aux.1] Caso inductivo xs=(a:as): La hipótesis de inducción es (∀ys :: [a])inversa1 as ++ ys = inversa2Aux as ys Por tanto, inversa1 (a:as) ++ ys = (inversa1 as ++ [a]) ++ ys [por inversa1.2] = (inversa1 as) ++ ([a] ++ ys) [por asociativa de ++] = (inversa1 as) ++ (a:ys) [por ley unitaria] = (inversa2Aux as (a:ys) [por hip. de inducción] = (inversa2Aux (a:as) ys [por inversa2Aux.2] 48 / 54
  • 49. IM Tema 8: Razonamiento sobre programas Propiedades de funciones de orden superior Tema 8: Razonamiento sobre programas 1. Razonamiento ecuacional 2. Razonamiento por inducción sobre los naturales 3. Razonamiento por inducción sobre listas 4. Equivalencia de funciones 5. Propiedades de funciones de orden superior 49 / 54
  • 50. IM Tema 8: Razonamiento sobre programas Propiedades de funciones de orden superior Relación entre sum y map La función sum: Prelude sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Propiedad: sum (map (2*) xs) = 2 * sum xs Comprobación con QuickCheck: prop_sum_map :: [Int] -> Bool prop_sum_map xs = sum (map (2*) xs) == 2 * sum xs *Main> quickCheck prop_sum_map +++ OK, passed 100 tests. 50 / 54
  • 51. IM Tema 8: Razonamiento sobre programas Propiedades de funciones de orden superior Relación entre sum y map Demostración de la propiedad por inducción en xs Caso []: sum (map (2*) xs) = sum (map (2*) []) [por hipótesis] = sum [] [por map.1] =0 [por sum.1] =2 * 0 [por aritmética] = 2 * sum [] [por sum.1] = 2 * sum xs [por hipótesis] 51 / 54
  • 52. IM Tema 8: Razonamiento sobre programas Propiedades de funciones de orden superior Relación entre sum y map Caso xs=(y:ys): Entonces, sum (map (2*) xs) = sum (map (2*) (y:ys)) [por hipótesis] = sum (2*) y : (map (2*) ys) [por map.2] = (2*) y + (sum (map (2*) ys)) [por sum.2] = (2*) y + (2 * sum ys) [por hip. de inducción] = (2 * y) + (2 * sum ys) [por (2*)] = 2 * (y + sum ys) [por aritmética] = 2 * sum (y:ys) [por sum.2] = 2 * sum xs [por hipótesis] 52 / 54
  • 53. IM Tema 8: Razonamiento sobre programas Propiedades de funciones de orden superior Comprobación de propiedades con argumentos funcionales La aplicación de una función a los elemntos de una lista conserva su longitud: prop_map_length (Function _ f) xs = length (map f xs) == length xs En el inicio del fichero hay que escribir import Test.QuickCheck.Function Comprobación *Main> quickCheck prop_map_length +++ OK, passed 100 tests. 53 / 54
  • 54. IM Tema 8: Razonamiento sobre programas Bibliografía Bibliografía 1. H. C. Cunningham (2007) Notes on Functional Programming with Haskell. 2. J. Fokker (1996) Programación funcional. 3. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 13: Reasoning about programs. 4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 6: Programación con listas. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. Addison-Wesley, 1999. Cap. 8: Reasoning about programs. 6. E.P. Wentworth (1994) Introduction to Funcional Programming. 54 / 54