Acciones

Diferencia entre revisiones de «Relación 1»

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

 
(No se muestran 2 ediciones intermedias 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 xs = undefined"
+
   "longitud [] = 0"
 
+
|"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) = undefined"
+
   "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 38: Línea 39:
 
     inversa [a,d,c] = [c,d,a]
 
     inversa [a,d,c] = [c,d,a]
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
 +
 +
fun inversa :: "'a list => 'a list" where
 +
  "inversa [] = []"
 +
|"inversa (x#xs) = (inversa xs)@ [x]"
  
fun inversa :: "'a list ⇒ 'a list" where
+
  "inversa xs = undefined"
 
 
 
 
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 51: 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 n x = undefined"
+
   "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 64: 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
+
fun conc :: "'a list => 'a list => 'a list" where
   "conc xs ys = undefined"
+
   "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 78: Línea 84:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
fun coge :: "nat 'a list 'a list" where
+
fun coge :: "nat => 'a list => 'a list" where
   "coge n xs = undefined"
+
   "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]"
 
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 90: 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 n xs = undefined"
+
   "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]"
 
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 103: Línea 113:
 
     esVacia [1] = False
 
     esVacia [1] = False
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
 
+
fun esVacia :: "'a list bool" where
+
fun esVacia :: "'a list => bool" where
   "esVacia xs = undefined"
+
   "esVacia [] = True"
 
+
|"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 118: Línea 129:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
fun inversaAcAux :: "'a list 'a list 'a list" where
+
fun inversaAcAux :: "'a list => 'a list => 'a list" where
   "inversaAcAux xs ys = undefined"
+
   "inversaAcAux [] ys = ys"
 
+
|"inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)"
fun inversaAc :: "'a list 'a list" where
+
 
   "inversaAc xs = undefined"
+
fun inversaAc :: "'a list => 'a list" where
 
+
   "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 132: 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 xs = undefined"
+
   "sum [] = 0"
 
+
|"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 146: Línea 159:
 
   ------------------------------------------------------------------ *}
 
   ------------------------------------------------------------------ *}
  
fun map :: "('a 'b) 'a list 'b list" where
+
fun map :: "('a => 'b) => 'a list => 'b list" where
   "map f xs = undefined"
+
   "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]"
 
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