Acciones

Diferencia entre revisiones de «Relación 1»

De Demostración asistida por ordenador (2012-13)

 
(No se muestra una edición intermedia del mismo usuario)
Línea 1: Línea 1:
 
<source lang="isar">
 
<source lang="isar">
header {* Definición de funciones *}
+
header {* Relación 1: Programación funcional en Isabelle *}
 
+
theory Definicion_de_funciones
+
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 nat" where
+
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 × 'b 'b × 'a" where
+
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 'a list" where
+
fun inversa :: "'a list => 'a list" where
 
   "inversa [] = []"
 
   "inversa [] = []"
  |"inversa (x#xs) = conc (inversa xs) [x]
+
  |"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 'a 'a list" where
+
fun repite :: "nat => 'a => 'a list" where
    "repite 0 x = []"
+
  "repite 0 x = []"
  |"repite (Suc n) x = conc [x] (repite n 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)"
  
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 'a list 'a list" where
+
fun coge :: "nat => 'a list => 'a list" where
 
   "coge 0 xs = []"
 
   "coge 0 xs = []"
  |"coge _ [] = []"
+
  |"coge n [] = []"
  |"coge (Suc n) (x#xd) = conc [x] (coge n xs)
+
  |"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 'a list 'a list" where
+
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
Línea 111: Línea 113:
 
     esVacia [1] = False
 
     esVacia [1] = False
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
 
+
fun esVacia :: "'a list bool" where
+
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 'a list 'a list" where
+
fun inversaAcAux :: "'a list => 'a list => 'a list" where
   "inversaAcAux xs [] = xs"
+
   "inversaAcAux [] ys = ys"
  |"inversaAcAux xs (y#ys) = inversaAcAux (y#xs) ys"
+
  |"inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)"
 
+
 
fun inversaAc :: "'a list 'a list" where
+
fun inversaAc :: "'a list => 'a list" where
   "inversaAc xs = inversaAcAux [] xs"
+
   "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 nat" where
+
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 'b) 'a list 'b list" where
+
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