Razonamiento Ecuacional Induccion Estructural
Razonamiento Ecuacional Induccion Estructural
Razonamiento Ecuacional Induccion Estructural
Razonamiento ecuacional
Inducción estructural
1er cuatrimestre de 2024
Departamento de Computación
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
1
Introducción
Inducción estructural
Extensionalidad
Isomorfismos de tipos
2
Motivación
Queremos demostrar que ciertas expresiones son equivalentes.
¿Para qué?
Para justificar que un algoritmo es correcto
Por ejemplo, si logramos demostrar que:
3
Hipótesis de trabajo
4
Igualdades por definición
Principio de reemplazo
Sea e1 = e2 una ecuación incluida en el programa.
Las siguientes operaciones preservan la igualdad de expresiones:
1. Reemplazar cualquier instancia de e1 por e2.
2. Reemplazar cualquier instancia de e2 por e1.
Si una igualdad se puede demostrar usando sólo el principio de
reemplazo, decimos que la igualdad vale por definición.
Ejemplo: principio de reemplazo
Le damos nombre a las ecuaciones del programa:
sucesor :: Int -> Int
{SUC} sucesor n = n + 1
6
Introducción
Inducción estructural
Extensionalidad
Isomorfismos de tipos
7
Inducción sobre booleanos
not (not x)
8
Inducción sobre booleanos
Principio de inducción sobre booleanos
Si P(True) y P(False) entonces ∀x :: Bool. P(x).
Ejemplo
{NT} not True = False
{NF} not False = True
Para probar ∀x :: Bool. not (not x) = x
basta probar:
1. not (not True) = True.
10
Inducción sobre pares
Ejemplo
{FST} fst (x, _) = x
{SND} snd (_, y) = y
{SWAP} swap (x, y) = (y, x)
Para probar ∀p :: (a, b). fst p = snd (swap p)
basta probar:
I ∀x :: a. ∀y :: b. fst (x, y) = snd (swap (x, y))
11
Inducción sobre naturales
12
Inducción sobre naturales
Ejemplo
{S0} suma Zero m = m
{S1} suma (Suc n) m = Suc (suma n) m
Para probar ∀n :: Nat. suma n Zero = n
basta probar:
1. suma Zero Zero = Zero.
Inmediato por S0.
2. suma
| Zero = n} ⇒ suma
n {z | (Suc n){zZero = Suc n}.
H.I. T.I.
13
Inducción estructural
En el caso general, tenemos un tipo de datos inductivo:
{M0} map f [] = []
{M1} map f (x : xs) = f x : map f xs
{A0} [] ++ ys = ys
{A1} (x : xs) ++ ys = x : (xs ++ ys)
Propiedad. Si f :: a -> b, xs :: [a], ys :: [a], entonces:
17
Ejemplo: inducción sobre listas
Caso base:
map f ([] ++ ys)
= map f ys por A0
= [] ++ map f ys por A0
= map f [] ++ map f ys por M0
Caso inductivo:
map f ((x : xs) ++ ys)
= map f (x : (xs ++ ys)) por A1
= f x : map f (xs ++ ys) por M1
= f x : (map f xs ++ map f ys) por H.I.
= (f x : map f xs) ++ map f ys por A1
= map f (x : xs) ++ map f ys por M1
18
Ejemplo: relación entre foldr y foldl
Propiedad. Si f :: a -> b -> b, z :: b, xs :: [a], entonces:
foldr f z xs = foldl (flip f) z (reverse xs)
| {z }
P(xs)
19
Introducción
Inducción estructural
Extensionalidad
Isomorfismos de tipos
20
Extensionalidad
21
Puntos de vista intensional vs. extensional
¿Vale la siguiente equivalencia de expresiones?
quickSort = insertionSort
Ejemplo
quickSort e insertionSort
I no son intensionalmente iguales;
I sı́ son extensionalmente iguales: computan la misma función.
22
Principio de extensionalidad funcional
Sean f, g :: a -> b.
Propiedad inmediata
Si f = g entonces (∀x :: a. f x = g x).
23
Principio de extensionalidad funcional
Ejemplo: extensionalidad funcional
{I} id x = x {C} (g . f) x = g (f x)
{S} swap (x, y) = (y, x)
Veamos que swap . swap = id :: (a, b) -> (a, b).
Por extensionalidad funcional, basta ver:
25
Corrección del razonamiento ecuacional
Supongamos que logramos demostrar que e1 = e2.
¿Qué nos asegura eso sobre e1 y e2?
quickSort = insertionSort
26
Demostración de desigualdades
¿Cómo demostramos que no vale una igualdad e1 = e2 :: A?
Ejemplo
Demostrar que no vale la igualdad:
obs id True
obs swap False
27
Introducción
Inducción estructural
Extensionalidad
Isomorfismos de tipos
28
Misma información, distinta forma
¿Qué relación hay entre los siguientes valores?
("hola", (1, True)) :: (String, (Int, Bool))
((True, "hola"), 1) :: ((Bool, String), Int)
Representan la misma información, pero escrita de distinta manera.
g . f = id f . g = id
29
Isomorfismos de tipos
Definición
Decimos que dos tipos de datos A y B son isomorfos si:
1. Hay una función f :: A -> B total.
2. Hay una función g :: B -> A total.
3. Se puede demostrar que g . f = id :: A -> A.
4. Se puede demostrar que f . g = id :: B -> B.
30
Ejemplo de isomorfismo: currificación
Ejemplo
Veamos que ((a, b) -> c) ' (a -> b -> c).
31
Ejemplo de isomorfismo: currificación
Veamos que
uncurry . curry = id :: ((a, b) -> c) -> (a, b) -> c
Por extensionalidad funcional, basta ver que si f :: (a, b) -> c:
(uncurry . curry) f = id f :: (a, b) -> c
Por extensionalidad funcional, basta ver que si p :: (a, b):
(uncurry . curry) f p = id f p :: c
Por inducción sobre pares, basta ver que si x :: a, y :: b:
(uncurry . curry) f (x, y) = id f (x, y) :: c
En efecto:
(uncurry . curry) f (x, y)
= uncurry (curry f) (x, y) (Def. (.))
= curry f x y (Def. uncurry)
= f (x, y) (Def. curry)
= id f (x, y) (Def. id)
33
¿ ¿ ¿ ¿¿ ¿¿ ¿ ¿? ? ? ? ? ? ? ? ?
34