Diferencia entre revisiones de «Relación 1»
De Demostración asistida por ordenador (2012-13)
Línea 1: | Línea 1: | ||
<source lang="isar"> | <source lang="isar"> | ||
− | header {* | + | header {* Relación 1: Programación funcional en Isabelle *} |
− | + | ||
− | theory | + | theory Programacion_funcional_en_Isabelle |
imports Main | imports Main | ||
begin | begin | ||
Línea 12: | Línea 12: | ||
longitud [4,2,5] = 3 | longitud [4,2,5] = 3 | ||
------------------------------------------------------------------- *} | ------------------------------------------------------------------- *} | ||
− | + | ||
− | fun longitud :: "'a list | + | fun longitud:: "'a list => nat" where |
"longitud [] = 0" | "longitud [] = 0" | ||
− | |"longitud (x#xs)= 1 + (longitud xs)" | + | |"longitud (x#xs) = 1+ (longitud xs)" |
− | + | ||
value "longitud [4,2,5]" -- "= 3" | value "longitud [4,2,5]" -- "= 3" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 2. Definir la función | Ejercicio 2. Definir la función | ||
− | intercambia :: 'a × 'b ⇒ 'b × 'a | + | fun intercambia :: 'a × 'b ⇒ 'b × 'a |
tal que (intercambia p) es el par obtenido intercambiando las | tal que (intercambia p) es el par obtenido intercambiando las | ||
componentes del par p. Por ejemplo, | componentes del par p. Por ejemplo, | ||
intercambia (u,v) = (v,u) | intercambia (u,v) = (v,u) | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun intercambia :: "'a | + | fun intercambia :: "'a * 'b => 'b * 'a" where |
"intercambia (x,y) = (y,x)" | "intercambia (x,y) = (y,x)" | ||
− | + | ||
value "intercambia (u,v)" -- "= (v,u)" | value "intercambia (u,v)" -- "= (v,u)" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 3. Definir, por recursión, la función | Ejercicio 3. Definir, por recursión, la función | ||
Línea 39: | Línea 39: | ||
inversa [a,d,c] = [c,d,a] | inversa [a,d,c] = [c,d,a] | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun inversa :: "'a list | + | fun inversa :: "'a list => 'a list" where |
"inversa [] = []" | "inversa [] = []" | ||
− | |"inversa (x#xs) = | + | |"inversa (x#xs) = (inversa xs)@ [x]" |
+ | |||
value "inversa [a,d,c]" -- "= [c,d,a]" | value "inversa [a,d,c]" -- "= [c,d,a]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 4. Definir la función | Ejercicio 4. Definir la función | ||
Línea 53: | Línea 54: | ||
repite 3 a = [a,a,a] | repite 3 a = [a,a,a] | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun repite :: "nat | + | fun repite :: "nat => 'a => 'a list" where |
− | + | "repite 0 x = []" | |
− | + | |"repite (Suc n) x = [x]@(repite n x)" | |
value "repite 3 a" -- "= [a,a,a]" | value "repite 3 a" -- "= [a,a,a]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 5. Definir la función | Ejercicio 5. Definir la función | ||
Línea 67: | Línea 68: | ||
conc [a,d] [b,d,a,c] = [a,d,b,d,a,c] | conc [a,d] [b,d,a,c] = [a,d,b,d,a,c] | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
+ | |||
+ | fun conc :: "'a list => 'a list => 'a list" where | ||
+ | "conc [] ys = ys" | ||
+ | |"conc xs [] = xs" | ||
+ | |"conc (x#xs) ys = x# (conc xs ys)" | ||
− | |||
− | |||
− | |||
− | |||
value "conc [a,d] [b,d,a,c]" -- "= [a,d,b,d,a,c]" | value "conc [a,d] [b,d,a,c]" -- "= [a,d,b,d,a,c]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 6. Definir la función | Ejercicio 6. Definir la función | ||
Línea 82: | Línea 84: | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | fun coge :: "nat | + | fun coge :: "nat => 'a list => 'a list" where |
"coge 0 xs = []" | "coge 0 xs = []" | ||
− | |"coge | + | |"coge n [] = []" |
− | |"coge (Suc n) (x# | + | |"coge (Suc n) (x#xs) = conc [x] (coge n xs)" |
− | + | ||
value "coge 2 [a,c,d,b,e]" -- "= [a,c]" | value "coge 2 [a,c,d,b,e]" -- "= [a,c]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 7. Definir la función | Ejercicio 7. Definir la función | ||
Línea 96: | Línea 98: | ||
elimina 2 [a,c,d,b,e] = [d,b,e] | elimina 2 [a,c,d,b,e] = [d,b,e] | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun elimina :: "nat | + | fun elimina :: "nat => 'a list => 'a list" where |
"elimina 0 xs = xs" | "elimina 0 xs = xs" | ||
− | |"elimina | + | |"elimina n [] = []" |
|"elimina (Suc n) (x#xs) = elimina n xs" | |"elimina (Suc n) (x#xs) = elimina n xs" | ||
− | + | ||
value "elimina 2 [a,c,d,b,e]" -- "= [d,b,e]" | value "elimina 2 [a,c,d,b,e]" -- "= [d,b,e]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 8. Definir la función | Ejercicio 8. Definir la función | ||
esVacia :: 'a list ⇒ bool | esVacia :: 'a list ⇒ bool | ||
tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, | tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo, | ||
− | + | esVacia [] = True | |
− | + | esVacia [1] = False | |
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun esVacia :: "'a list | + | fun esVacia :: "'a list => bool" where |
"esVacia [] = True" | "esVacia [] = True" | ||
|"esVacia (x#xs) = False" | |"esVacia (x#xs) = False" | ||
− | + | ||
value "esVacia []" -- "= True" | value "esVacia []" -- "= True" | ||
value "esVacia [1]" -- "= False" | value "esVacia [1]" -- "= False" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 9. Definir la función | Ejercicio 9. Definir la función | ||
Línea 127: | Línea 129: | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | fun inversaAcAux :: "'a list | + | fun inversaAcAux :: "'a list => 'a list => 'a list" where |
− | "inversaAcAux | + | "inversaAcAux [] ys = ys" |
− | |"inversaAcAux | + | |"inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)" |
− | + | ||
− | fun inversaAc :: "'a list | + | fun inversaAc :: "'a list => 'a list" where |
− | "inversaAc xs = inversaAcAux [] | + | "inversaAc xs = inversaAcAux xs []" |
− | + | ||
value "inversaAc [a,c,b,e]" -- "= [e,b,c,a]" | value "inversaAc [a,c,b,e]" -- "= [e,b,c,a]" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 10. Definir la función | Ejercicio 10. Definir la función | ||
Línea 142: | Línea 144: | ||
sum [3,2,5] = 10 | sum [3,2,5] = 10 | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | + | ||
− | fun sum :: "nat list | + | fun sum :: "nat list => nat" where |
"sum [] = 0" | "sum [] = 0" | ||
− | |"sum (x#xs) = x + (sum xs)" | + | |"sum (x#xs) = x+ (sum xs)" |
− | + | ||
value "sum [3,2,5]" -- "= 10" | value "sum [3,2,5]" -- "= 10" | ||
− | + | ||
text {* --------------------------------------------------------------- | text {* --------------------------------------------------------------- | ||
Ejercicio 11. Definir la función | Ejercicio 11. Definir la función | ||
Línea 157: | Línea 159: | ||
------------------------------------------------------------------ *} | ------------------------------------------------------------------ *} | ||
− | fun map :: "('a | + | fun map :: "('a => 'b) => 'a list => 'b list" where |
"map f [] = []" | "map f [] = []" | ||
− | |"map f (x#xs)= conc [f x] (map f xs)" | + | |"map f (x#xs) = conc [f x] (map f xs)" |
+ | |||
+ | text {*value "map (λx. 2*x) [3::nat,2,5]" -- "= [6,4,10]" *} | ||
+ | |||
value "map (λx. 2*x) [3::nat,2,5]" -- "= [6,4,10]" | value "map (λx. 2*x) [3::nat,2,5]" -- "= [6,4,10]" |
Revisión actual del 17:23 19 feb 2013
header {* Relación 1: Programación funcional en Isabelle *}
theory Programacion_funcional_en_Isabelle
imports Main
begin
text {* ----------------------------------------------------------------
Ejercicio 1. Definir, por recursión, la función
longitud :: 'a list ⇒ nat
tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,
longitud [4,2,5] = 3
------------------------------------------------------------------- *}
fun longitud:: "'a list => nat" where
"longitud [] = 0"
|"longitud (x#xs) = 1+ (longitud xs)"
value "longitud [4,2,5]" -- "= 3"
text {* ---------------------------------------------------------------
Ejercicio 2. Definir la función
fun intercambia :: 'a × 'b ⇒ 'b × 'a
tal que (intercambia p) es el par obtenido intercambiando las
componentes del par p. Por ejemplo,
intercambia (u,v) = (v,u)
------------------------------------------------------------------ *}
fun intercambia :: "'a * 'b => 'b * 'a" where
"intercambia (x,y) = (y,x)"
value "intercambia (u,v)" -- "= (v,u)"
text {* ---------------------------------------------------------------
Ejercicio 3. Definir, por recursión, la función
inversa :: 'a list ⇒ 'a list
tal que (inversa xs) es la lista obtenida invirtiendo el orden de los
elementos de xs. Por ejemplo,
inversa [a,d,c] = [c,d,a]
------------------------------------------------------------------ *}
fun inversa :: "'a list => 'a list" where
"inversa [] = []"
|"inversa (x#xs) = (inversa xs)@ [x]"
value "inversa [a,d,c]" -- "= [c,d,a]"
text {* ---------------------------------------------------------------
Ejercicio 4. Definir la función
repite :: nat ⇒ 'a ⇒ 'a list
tal que (repite n x) es la lista formada por n copias del elemento
x. Por ejemplo,
repite 3 a = [a,a,a]
------------------------------------------------------------------ *}
fun repite :: "nat => 'a => 'a list" where
"repite 0 x = []"
|"repite (Suc n) x = [x]@(repite n x)"
value "repite 3 a" -- "= [a,a,a]"
text {* ---------------------------------------------------------------
Ejercicio 5. Definir la función
conc :: 'a list ⇒ 'a list ⇒ 'a list
tal que (conc xs ys) es la concatención de las listas xs e ys. Por
ejemplo,
conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]
------------------------------------------------------------------ *}
fun conc :: "'a list => 'a list => 'a list" where
"conc [] ys = ys"
|"conc xs [] = xs"
|"conc (x#xs) ys = x# (conc xs ys)"
value "conc [a,d] [b,d,a,c]" -- "= [a,d,b,d,a,c]"
text {* ---------------------------------------------------------------
Ejercicio 6. Definir la función
coge :: nat ⇒ 'a list ⇒ 'a list
tal que (coge n xs) es la lista de los n primeros elementos de xs. Por
ejemplo,
coge 2 [a,c,d,b,e] = [a,c]
------------------------------------------------------------------ *}
fun coge :: "nat => 'a list => 'a list" where
"coge 0 xs = []"
|"coge n [] = []"
|"coge (Suc n) (x#xs) = conc [x] (coge n xs)"
value "coge 2 [a,c,d,b,e]" -- "= [a,c]"
text {* ---------------------------------------------------------------
Ejercicio 7. Definir la función
elimina :: nat ⇒ 'a list ⇒ 'a list
tal que (elimina n xs) es la lista obtenida eliminando los n primeros
elementos de xs. Por ejemplo,
elimina 2 [a,c,d,b,e] = [d,b,e]
------------------------------------------------------------------ *}
fun elimina :: "nat => 'a list => 'a list" where
"elimina 0 xs = xs"
|"elimina n [] = []"
|"elimina (Suc n) (x#xs) = elimina n xs"
value "elimina 2 [a,c,d,b,e]" -- "= [d,b,e]"
text {* ---------------------------------------------------------------
Ejercicio 8. Definir la función
esVacia :: 'a list ⇒ bool
tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,
esVacia [] = True
esVacia [1] = False
------------------------------------------------------------------ *}
fun esVacia :: "'a list => bool" where
"esVacia [] = True"
|"esVacia (x#xs) = False"
value "esVacia []" -- "= True"
value "esVacia [1]" -- "= False"
text {* ---------------------------------------------------------------
Ejercicio 9. Definir la función
inversaAc :: 'a list ⇒ 'a list
tal que (inversaAc xs) es a inversa de xs calculada usando
acumuladores. Por ejemplo,
inversaAc [a,c,b,e] = [e,b,c,a]
------------------------------------------------------------------ *}
fun inversaAcAux :: "'a list => 'a list => 'a list" where
"inversaAcAux [] ys = ys"
|"inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)"
fun inversaAc :: "'a list => 'a list" where
"inversaAc xs = inversaAcAux xs []"
value "inversaAc [a,c,b,e]" -- "= [e,b,c,a]"
text {* ---------------------------------------------------------------
Ejercicio 10. Definir la función
sum :: nat list ⇒ nat
tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,
sum [3,2,5] = 10
------------------------------------------------------------------ *}
fun sum :: "nat list => nat" where
"sum [] = 0"
|"sum (x#xs) = x+ (sum xs)"
value "sum [3,2,5]" -- "= 10"
text {* ---------------------------------------------------------------
Ejercicio 11. Definir la función
map :: ('a ⇒ 'b) ⇒ 'a list ⇒ 'b list
tal que (map f xs) es la lista obtenida aplicando la función f a los
elementos de xs. Por ejemplo,
map (λx. 2*x) [3,2,5] = [6,4,10]
------------------------------------------------------------------ *}
fun map :: "('a => 'b) => 'a list => 'b list" where
"map f [] = []"
|"map f (x#xs) = conc [f x] (map f xs)"
text {*value "map (λx. 2*x) [3::nat,2,5]" -- "= [6,4,10]" *}
value "map (λx. 2*x) [3::nat,2,5]" -- "= [6,4,10]"
end