Acciones

Discusión

Diferencia entre revisiones de «Relación 2»

De Razonamiento automático (2016-17)

(Pregunta de Wilmorort)
 
Línea 51: Línea 51:
 
   y se tiene que hacer una demostración detallada ???  
 
   y se tiene que hacer una demostración detallada ???  
 
   ------------------------------------------------------------------- *}
 
   ------------------------------------------------------------------- *}
 +
 +
(* Respuesta de Manmorjim1
 +
  ======================= *)
  
 
text {* ---------------------------------------------------------------  
 
text {* ---------------------------------------------------------------  
 
   Creo que no funcionaba porque al usar una funcion auxiliar en tu definicion
 
   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
+
   de sumaImpares te queda por demostrar la propiedad de esa funcion. Es decir,
  induccion en "n+1" te quedaría por demostrar:
+
  si aplicas induccion en "n+1" te quedaría por demostrar:
  (n+1)+(suma n)+(suma n) = (n+1)(n+1)
+
    (n+1)+(suma n)+(suma n) = (n+1)(n+1)
  (suma n) + (suma n) = n*n + n
+
    (suma n) + (suma n) = n*n + n
   Asi que lo he demostrado anteriormente y he usado ese teorema en la demostracion
+
   Asi que lo he demostrado anteriormente y he usado ese teorema en la
 
+
  demostracion  
~~~~
 
 
   ------------------------------------------------------------------- *}
 
   ------------------------------------------------------------------- *}
  
(* ~~~~ *)
 
 
lemma sumAux: "(suma n) + (suma n) = n + n * n"
 
lemma sumAux: "(suma n) + (suma n) = n + n * n"
 
apply (induct n)
 
apply (induct 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