Acciones

Discusión

Diferencia entre revisiones de «Relación 2»

De Razonamiento automático (2016-17)

(Pregunta de Wilmorort)
 
(No se muestran 5 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
 +
== Pregunta de Wilmorort ==
 +
 
<source lang="isar">
 
<source lang="isar">
 
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}
 
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}
Línea 44: Línea 46:
 
   Ejercicio 1.2. Demostrar que  
 
   Ejercicio 1.2. Demostrar que  
 
     sumaImpares n = n*n
 
     sumaImpares n = n*n
 +
  ------------------------------------------------------------------- *}
 +
text {* ---------------------------------------------------------------
 +
  Por que no funciona demostrar con el siguiente algoritmo by(induct n) auto
 +
  y se tiene que hacer una demostración detallada ???
 +
  ------------------------------------------------------------------- *}
 +
 +
(* Respuesta de Manmorjim1
 +
  ======================= *)
 +
 +
text {* ---------------------------------------------------------------
 +
  Creo que no funcionaba porque al usar una funcion auxiliar en tu definicion
 +
  de sumaImpares te queda por demostrar la propiedad de esa funcion. Es decir,
 +
  si aplicas induccion en "n+1" te quedaría por demostrar:
 +
    (n+1)+(suma n)+(suma n) = (n+1)(n+1)
 +
    (suma n) + (suma n) = n*n + n
 +
  Asi que lo he demostrado anteriormente y he usado ese teorema en la
 +
  demostracion
 
   ------------------------------------------------------------------- *}
 
   ------------------------------------------------------------------- *}
  
'''Texto en negrita'''Por que no funciona demostrar con el siguiente algoritmo y se tiene
+
lemma sumAux: "(suma n) + (suma n) = n + n * n"
      que hacer una demostracion detallada ???
 
 
lemma "summaImpares1 n = n*n"
 
 
apply (induct n)
 
apply (induct n)
apply auto (*Error*)
+
apply auto
 +
done
  
 +
(*----------------------ERROR ----------------------------------------*)
 +
lemma "sumaImpares1 n = n*n"
 +
apply (induct n)
 +
apply auto
 +
apply (simp add: sumAux) (* ~~~~ *)
 +
done
 +
(*--------------------------------------------------------------------*)
 
    
 
    
 
lemma "sumaImpares1 n = n*n"
 
lemma "sumaImpares1 n = n*n"

Revisión actual del 09:08 6 nov 2016

Pregunta de Wilmorort

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 by(induct n) auto
  y se tiene que hacer una demostración detallada ??? 
  ------------------------------------------------------------------- *}

(* Respuesta de Manmorjim1
   ======================= *)

text {* --------------------------------------------------------------- 
  Creo que no funcionaba porque al usar una funcion auxiliar en tu definicion
  de sumaImpares te queda por demostrar la propiedad de esa funcion. Es decir,
  si aplicas induccion en "n+1" te quedaría por demostrar:
     (n+1)+(suma n)+(suma n) = (n+1)(n+1)
     (suma n) + (suma n) = n*n + n
  Asi que lo he demostrado anteriormente y he usado ese teorema en la
  demostracion 
  ------------------------------------------------------------------- *}

lemma sumAux: "(suma n) + (suma n) = n + n * n"
apply (induct n)
apply auto
done

(*----------------------ERROR ----------------------------------------*) 
lemma "sumaImpares1 n = n*n"
apply (induct n)
apply auto
apply (simp add: sumAux) (* ~~~~ *)
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

end