Se presenta cómo demostrar propiedades de funciones definidas eh Haskell usando inducción sobre los números naturales, o sobre las listas.
Este es el 8º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
Haskell es un lenguaje funcional puro que ha encontrado una pequeña pero creciente y leal cantidad de usuarios en la industria y academia. Calificándolo como "El más avanzado de los lenguajes obsoletos", Gerlad J. Sussman (creador de Scheme) señala tanto al poder de Haskell como a las limitaciones de todos los lenguajes de programación existentes. ¿Qué lo hace especial o atractivo? ¿Vale la pena invertir nuestro tiempo en aprenderlo? En esta plática exploraremos las características más distintivas de Haskell, y como ejemplo exploraremos algunos escenarios de uso donde difícilmente tiene comparación.
El análisis de sistemas orientado a objetos es un enfoque de la ingeniería de software que plantea una nueva forma de pensar para entender el problema basado en modelos funcionales compuestos por verbos y sustantivos.
Una metodología de Desarrollo es como una receta de cocina, hay se visualizan los requerimientos, las herramientas y técnicas a utilizar para crear el platillo (software). De su buen eso depende el éxito del proyecto.
analisis sintactico en un compilador
gramaticas de libre contexto
ejemplos de gramaticas de libre contexto
como crear una gramatica de libre contexto
funciones de una analizador sintatctico
dificultades para crea una gramatica de libre contexto
Haskell es un lenguaje funcional puro que ha encontrado una pequeña pero creciente y leal cantidad de usuarios en la industria y academia. Calificándolo como "El más avanzado de los lenguajes obsoletos", Gerlad J. Sussman (creador de Scheme) señala tanto al poder de Haskell como a las limitaciones de todos los lenguajes de programación existentes. ¿Qué lo hace especial o atractivo? ¿Vale la pena invertir nuestro tiempo en aprenderlo? En esta plática exploraremos las características más distintivas de Haskell, y como ejemplo exploraremos algunos escenarios de uso donde difícilmente tiene comparación.
El análisis de sistemas orientado a objetos es un enfoque de la ingeniería de software que plantea una nueva forma de pensar para entender el problema basado en modelos funcionales compuestos por verbos y sustantivos.
Una metodología de Desarrollo es como una receta de cocina, hay se visualizan los requerimientos, las herramientas y técnicas a utilizar para crear el platillo (software). De su buen eso depende el éxito del proyecto.
analisis sintactico en un compilador
gramaticas de libre contexto
ejemplos de gramaticas de libre contexto
como crear una gramatica de libre contexto
funciones de una analizador sintatctico
dificultades para crea una gramatica de libre contexto
análisis a priori, a posteriori, costo de algoritmos, análisis iterativo, análisis recursivo, complejidad del algoritmo, orden de complejidad, notación asintótica
La Gestión del Cambio del Software, comúnmente llamada Gestión de la Configuración del Software, es una actividad protectora que se aplica a lo largo del proceso de software.
Sesión 4 del curso Metodologías Ágiles de Desarrollo de Software de la Universidad de Alicante (http://www.dccia.ua.es/dccia/inf/asignaturas/MADS/2013-14)
Variables, expresiones y ejecución de condiciones les en PSeIntCristian C
Contiene información sobre los tipos de variables , operadores aritméticos, operadores lógicos, operadores de texto, precedencia, entrada y salida por consola, ejecución condicional (Si - Entonces), ejecución alternativa (Si – Entonces – Si No), si – Entonces – Si No anidados y por ultimo algunos ejercicios.
I1M2010-T20: El tipo abstracto de los montículos en Haskell José A. Alonso
Se especifica el tipo abstracto de datos de los montículos, se presenta su implementación en Haskell mediante tipo de datos algebraico y se comprueban sus propiedades características con QuickCheck.
Este es el tema 20 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
análisis a priori, a posteriori, costo de algoritmos, análisis iterativo, análisis recursivo, complejidad del algoritmo, orden de complejidad, notación asintótica
La Gestión del Cambio del Software, comúnmente llamada Gestión de la Configuración del Software, es una actividad protectora que se aplica a lo largo del proceso de software.
Sesión 4 del curso Metodologías Ágiles de Desarrollo de Software de la Universidad de Alicante (http://www.dccia.ua.es/dccia/inf/asignaturas/MADS/2013-14)
Variables, expresiones y ejecución de condiciones les en PSeIntCristian C
Contiene información sobre los tipos de variables , operadores aritméticos, operadores lógicos, operadores de texto, precedencia, entrada y salida por consola, ejecución condicional (Si - Entonces), ejecución alternativa (Si – Entonces – Si No), si – Entonces – Si No anidados y por ultimo algunos ejercicios.
I1M2010-T20: El tipo abstracto de los montículos en Haskell José A. Alonso
Se especifica el tipo abstracto de datos de los montículos, se presenta su implementación en Haskell mediante tipo de datos algebraico y se comprueban sus propiedades características con QuickCheck.
Este es el tema 20 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
I1M2010-T14: El tipo abstracto de datos de las pilas en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las pilas, se presentan implementaciones en Haskell y se comprueban sus propiedades características con QuickCheck.
Este es el 14º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
I1M2010-T15: El tipo abstracto de datos de las colas en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las colas, se presentan implementaciones en Haskell y se comprueban sus propiedades características con QuickCheck.
Este es el 15º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
I1M2010-T23: Técnicas de diseño descendente de algoritmos.José A. Alonso
Se implementan en Haskell los patrones de divide y vencerás y de búsqueda en espacios de estados. Se aplica los patrones a la ordenación por mezcla, ordenación rápida, 8-puzzle y a los problemas de de las N reinas, de la mochila y del cambio de monedas.
Este es el tema 23 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
I1M2010-T18: El TAD de las tablas en HaskellJosé A. Alonso
Se introduce el módulo de tablas (Data.Array) de Haskell, se especifica el tipo abstracto de datos de las tablas, se presentan distintas implementaciones en Haskell y se comprueban sus propiedades características con QuickCheck.
Este es el tema 18 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
I1M-T21: El TAD de los polinomios en HaskellJosé A. Alonso
Se presenta el tipo abstracto (TAD) de los polinomios y se estudia tres implementaciones en Haskell (mediante tipos algebraicos, listas dispersas y listas densas). Además se comprueba con QUickCheck sus propiedades. Finalmente, se definen las operaciones con los polinomios mediante el TAD.
Este es el tema 21 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m/temas.html
I1M2010-T22: Algoritmos sobre grafos en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las grafos, se presentan 2 implementaciones en Haskell del TAD y se estudia los algoritmos de recorrido en profundidad y en anchura y el algoritmo de Prim.
Este es el tema 22 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
Tema 2: Introducción a la programación con HaskellJosé A. Alonso
Se introduce el uso de GHC dentro de emacs.
Este es el 2º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m/temas.html
Se presentan las estrategias de computación perezosa e impaciente y se muestra cómo Haskell usa la perezosa lo que permite trabajar con objetos infinitos. También se muestra cómo puede hacerse evaluaciones estrictas en Haskell.
Este es el 10º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
Tema 1: Introducción a la programación funcional.José A. Alonso
Se presenta un panorama de la programación funcional especialmente centrado en la programación con Haskell.
Este es el 1º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m/temas.html
Tema 11: Aplicaciones de la programación funcional con HaskellJosé A. Alonso
Se presenta tres casos de estudio de la programación funcional con Haskell: el problema del concurso "Cifras y letras", el problema de las reinas y la sucesión de Hamming.
Este es el 8º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
Tema 7: Funciones de orden superior en HaskellJosé A. Alonso
Se estudian las funciones de orden superior en Haskell, fundamentalmente map, filter y foldr.
Este es el 7º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m/temas.html
LMF-T1: Sintaxis y semántica de la lógica proposicionalJosé A. Alonso
Introducción a la sintaxis y a la semántica de la lógica proposicional.
Este es el tema 1 del curso "Lógica matemática y fundamentos" http://www.cs.us.es/~jalonso/cursos/lmf
Se presentan el algoritmo de DPLL para decir la conjuntos de cláusulas y ejemplos de planteamiento y solución de problemas lógicos con Prover9 y Mace4.
I1M2010-T24: Programación dinámica en HaskellJosé A. Alonso
Se implementan en Haskell el patrón de programación dinámica y se aplica a los siguientes problemas: producto de cadenas de matrices, árboles binarios de búsqueda optimales, caminos mínimos entre todos los pares de nodos de un grafo y problema del viajante.
Este es el tema 24 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
LI2011-T11: Resolución en lógica de primer ordenJosé A. Alonso
Se presentan los algoritmos de unificación y resolución en lógica de primer orden.
Este es el tema 11 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/tema
LI2011-T9: Formas normales de Skolem y cláusulasJosé A. Alonso
Se presentan los procedimientos de transformación de fórmulas a formas normales de Skolem y cláusulas.
Este es el tema 9 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/tema
LI2011-T7: Deducción natural en lógica de primer ordenJosé A. Alonso
Se presenta la deducción natural para la lógica de primer orden como ampliación de la presentada en el tema 2 de deducción natural proposicional.
Este es el tema 7 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/temas.html
LIT4: Formales normales conjuntivas y disyuntivasJosé A. Alonso
Se presenta las formas normales conjuntivas y disyuntivas como medio para resolver los problemas TAUT y SAT.
Este es el tema 4 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/temas.html
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
Se especifica el tipo abstracto de datos de las colas de prioridad, se presenta su implementación en Haskell mediante listas y se comprueban sus propiedades características con QuickCheck.
Este es el tema 16 del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m-10/temas.html
LI2011-T3: Tableros semánticos proposicionalesJosé A. Alonso
Se presenta los tableros semánticos como sistema deductivo de la lógica proposicional.
Este es el tema 3 del curso de "Lógica informática". Más temas en http://www.cs.us.es/~jalonso/cursos/li/temas.html
ROMPECABEZAS DE ECUACIONES DE PRIMER GRADO OLIMPIADA DE PARÍS 2024. Por JAVIE...JAVIER SOLIS NOYOLA
El Mtro. JAVIER SOLIS NOYOLA crea y desarrolla el “ROMPECABEZAS DE ECUACIONES DE 1ER. GRADO OLIMPIADA DE PARÍS 2024”. Esta actividad de aprendizaje propone retos de cálculo algebraico mediante ecuaciones de 1er. grado, y viso-espacialidad, lo cual dará la oportunidad de formar un rompecabezas. La intención didáctica de esta actividad de aprendizaje es, promover los pensamientos lógicos (convergente) y creativo (divergente o lateral), mediante modelos mentales de: atención, memoria, imaginación, percepción (Geométrica y conceptual), perspicacia, inferencia, viso-espacialidad. Esta actividad de aprendizaje es de enfoques lúdico y transversal, ya que integra diversas áreas del conocimiento, entre ellas: matemático, artístico, lenguaje, historia, y las neurociencias.
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