Acciones

Discusión

Diferencia entre revisiones de «Relación 2»

De Razonamiento automático (2016-17)

Línea 45: Línea 45:
 
     sumaImpares n = n*n
 
     sumaImpares n = n*n
 
   ------------------------------------------------------------------- *}
 
   ------------------------------------------------------------------- *}
 
+
text {* ---------------------------------------------------------------
'''Texto en negrita'''Por que no funciona demostrar con el siguiente algoritmo y se tiene  
+
  Por que no funciona demostrar con el siguiente algoritmo y se tiene  
 
       que hacer una demostracion detallada ???  
 
       que hacer una demostracion detallada ???  
 +
  ------------------------------------------------------------------- *}
 
   
 
   
 
lemma "summaImpares1 n = n*n"
 
lemma "summaImpares1 n = n*n"

Revisión del 10:06 4 nov 2016

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

theory R2
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
  ------------------------------------------------------------------ *}
   
(*Notar: Por la propiedad de Gauss se puede deducir que:
         la suma de los n numeros impares es igual a la suma de los 
         n y n-1 numeros 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 "sumaImpares1 3  = 9 "

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


text {* --------------------------------------------------------------- 
  Ejercicio 1.2. Demostrar que 
     sumaImpares n = n*n
  ------------------------------------------------------------------- *}
text {* --------------------------------------------------------------- 
  Por que no funciona demostrar con el siguiente algoritmo y se tiene 
      que hacer una demostracion detallada ??? 
  ------------------------------------------------------------------- *}
 
lemma "summaImpares1 n = n*n"
apply (induct n)
apply auto  (*Error*)

  
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

end