Relación 2
De Razonamiento automático (2016-17)
Revisión del 10:04 4 nov 2016 de Wilmorort (discusión | contribuciones)
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
------------------------------------------------------------------- *}
'''Texto en negrita'''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