Acciones

Diferencia entre revisiones de «Relación 2»

De Razonamiento automático (2016-17)

Línea 21: Línea 21:
 
   "sumaImpares 0 = 0"
 
   "sumaImpares 0 = 0"
 
| "sumaImpares n = 2*(n-1) + 1 + sumaImpares (n-1)"
 
| "sumaImpares n = 2*(n-1) + 1 + sumaImpares (n-1)"
 +
 +
(*wilmorort*)
 +
 +
(*Notar: Por la propiedad de Gauss se puede deducir que:
 +
        la suma de los n números impares es igual a la suma de los
 +
        n y n-1 números consecutivos*) 
 +
fun suma :: "nat ⇒ nat" where
 +
    "suma 0 = 0"|
 +
    "suma n = n + suma(n-1)"
 +
 +
fun sumaImpares1 :: "nat ⇒ nat" where
 +
  "sumaImpares1 0 = 0" |
 +
  "sumaImpares1 n = suma(n) + suma(n-1)"
  
 
value "sumaImpares 5 = 25"
 
value "sumaImpares 5 = 25"
Línea 36: Línea 49:
 
apply auto
 
apply auto
 
done
 
done
 +
 +
(*wilmorort*)
 +
(*Demostración estructurada*)
 +
 +
lemma aux1 : "suma(Suc n) + suma(n) = (n+1) + suma(n) + n + suma(n-1)"
 +
apply (induct n)
 +
apply auto
 +
done
 +
 +
lemma aux2: "(n+1) + suma(n) + n + suma(n-1) = (n+1) + n + sumaImpares1 n "
 +
apply (induct n)
 +
apply auto
 +
done
 +
 +
lemma "sumaImpares1 n = n*n"
 +
proof (induct n)
 +
show "sumaImpares1 0 = 0*0" by simp
 +
next
 +
fix n
 +
assume HI:"sumaImpares1 n = n*n"
 +
have "sumaImpares1 (Suc n) = suma(Suc n) + suma(n)" by simp
 +
have "suma(Suc n) + suma(n) = (n+1) + suma(n) + n + suma(n-1)"  using
 +
"aux1" by simp
 +
also have "... = (n+1) + n + sumaImpares1 n " using "aux2" by simp
 +
also have "... = 2*n +1 + n*n" using HI by simp
 +
also have "... = (n+1)*(n+1)" by simp
 +
finally show "sumaImpares1 (Suc n) = Suc n * Suc n" by simp
 +
qed
 +
 +
  
  

Revisión del 09:51 4 nov 2016

chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}

theory R2_Razonamiento_automatico_sobre_programas
imports Main 
begin

declare [[names_short]]

text {* --------------------------------------------------------------- 
  Ejercicio 1.1. Definir la función
     sumaImpares :: nat ⇒ nat
  tal que (sumaImpares n) es la suma de los n primeros números
  impares. Por ejemplo,
     sumaImpares 5  =  25
  ------------------------------------------------------------------ *}

(* ivamenjim wilmorort*)

fun sumaImpares :: "nat ⇒ nat" where
  "sumaImpares 0 = 0"
| "sumaImpares n = 2*(n-1) + 1 + sumaImpares (n-1)"

(*wilmorort*)

(*Notar: Por la propiedad de Gauss se puede deducir que:
         la suma de los n números impares es igual a la suma de los 
         n y n-1 números consecutivos*)   
fun suma :: "nat ⇒ nat" where
    "suma 0 = 0"|
    "suma n = n + suma(n-1)"

fun sumaImpares1 :: "nat ⇒ nat" where
   "sumaImpares1 0 = 0" |
   "sumaImpares1 n = suma(n) + suma(n-1)"

value "sumaImpares 5 = 25"


text {* --------------------------------------------------------------- 
  Ejercicio 1.2. Demostrar que 
     sumaImpares n = n*n
  ------------------------------------------------------------------- *}

(* ivamenjim wilmorort*)

lemma "sumaImpares n = n*n"
apply (induct n)
apply auto
done

(*wilmorort*)
(*Demostración estructurada*)

lemma aux1 : "suma(Suc n) + suma(n) = (n+1) + suma(n) + n + suma(n-1)"
apply (induct n)
apply auto
done

lemma aux2: "(n+1) + suma(n) + n + suma(n-1) = (n+1) + n + sumaImpares1 n "
apply (induct n)
apply auto
done

lemma "sumaImpares1 n = n*n"
proof (induct n)
show "sumaImpares1 0 = 0*0" by simp
next 
 fix n
 assume HI:"sumaImpares1 n = n*n"
 have "sumaImpares1 (Suc n) = suma(Suc n) + suma(n)" by simp
 have "suma(Suc n) + suma(n) = (n+1) + suma(n) + n + suma(n-1)"  using
 "aux1" by simp
 also have "... = (n+1) + n + sumaImpares1 n " using "aux2" by simp
 also have "... = 2*n +1 + n*n" using HI by simp
 also have "... = (n+1)*(n+1)" by simp
 finally show "sumaImpares1 (Suc n) = Suc n * Suc n" by simp
 qed




text {* --------------------------------------------------------------- 
  Ejercicio 2.1. Definir la función
     sumaPotenciasDeDosMasUno :: nat ⇒ nat
  tal que 
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. 
  Por ejemplo, 
     sumaPotenciasDeDosMasUno 3  =  16
  ------------------------------------------------------------------ *}

(* wilmorort ivamenjim *)
  
fun sumaPotenciasDeDosMasUno :: "nat ⇒ nat" where
  "sumaPotenciasDeDosMasUno 0 = 2"|
  "sumaPotenciasDeDosMasUno n = 2^(n) + sumaPotenciasDeDosMasUno (n-1) "

value "sumaPotenciasDeDosMasUno 3 = 16"

text {* --------------------------------------------------------------- 
  Ejercicio 2.2. Demostrar que 
     sumaPotenciasDeDosMasUno n = 2^(n+1)
  ------------------------------------------------------------------- *}

(* wilmorort ivamenjim *)

lemma "sumaPotenciasDeDosMasUno n = 2^(n+1)"
apply (induct n)
apply auto
done

text {* --------------------------------------------------------------- 
  Ejercicio 3.1. Definir la función
     copia :: nat ⇒ 'a ⇒ 'a list
  tal que (copia n x) es la lista formado por n copias del elemento
  x. Por ejemplo, 
     copia 3 x = [x,x,x]
  ------------------------------------------------------------------ *}
 
(* ivamenjim wilmorort*)

fun copia :: "nat ⇒ 'a ⇒ 'a list" where
  "copia 0 x = [] " 
| "copia n x = x # (copia (n-1) x)"

(* wilmorort*)

fun copia1 :: "nat ⇒ 'a ⇒ 'a list" where
  "copia1 0 x = []" |
  "copia1 (Suc n) x = [x] @ (copia1 n x) "


value "copia 3 x = [x,x,x]"


text {* --------------------------------------------------------------- 
  Ejercicio 3.2. Definir la función
     todos :: ('a ⇒ bool) ⇒ 'a list ⇒ bool
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen
  la propiedad p. Por ejemplo,
     todos (λx. x>(1::nat)) [2,6,4] = True
     todos (λx. x>(2::nat)) [2,6,4] = False
  Nota: La conjunción se representa por ∧
  ----------------------------------------------------------------- *}

(*wilmorort*)

fun todos :: "('a ⇒ bool) ⇒ 'a list ⇒ bool" where
  "todos p [] = True"|
  "todos p (x#xs) = (p x = True ∧ todos p xs) "

value "todos (λx. x>(1::nat)) [2,6,4] = True"
value "todos (λx. x>(2::nat)) [2,6,4] = False"

text {* --------------------------------------------------------------- 
  Ejercicio 3.3. Demostrar que todos los elementos de (copia n x) son
  iguales a x. 
  ------------------------------------------------------------------- *}
(*wilmorort*)

lemma "todos (λy. y=x) (copia n x)"
apply (induct n)
apply auto
done

text {* --------------------------------------------------------------- 
  Ejercicio 4.1. Definir, recursivamente y sin usar (@), la función
     amplia :: 'a list ⇒ 'a ⇒ 'a list
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al
  final de la lista xs. Por ejemplo,
     amplia [d,a] t = [d,a,t]
  ------------------------------------------------------------------ *}

fun amplia :: "'a list ⇒ 'a ⇒ 'a list" where
  "amplia xs y = undefined"

value "amplia [d,a] t = [d,a,t]"

text {* --------------------------------------------------------------- 
  Ejercicio 4.2. Demostrar que 
     amplia xs y = xs @ [y]
  ------------------------------------------------------------------- *}

lemma "amplia xs y = xs @ [y]"
oops

end