Acciones

Diferencia entre revisiones de «Deducción natural proposicional con Isabelle/HOL»

De Lógica matemática y fundamentos (2018-19)

 
(No se muestran 2 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
<source lang="isabelle">
 
<source lang="isabelle">
−
chapter {* Tema 2a: Deducción natural proposicional con Isabelle/HOL *}
+
chapter ‹Tema 2a: Deducción natural proposicional con Isabelle/HOL›
  
 
theory T2a_Deduccion_natural_en_logica_proposicional_con_Isabelle
 
theory T2a_Deduccion_natural_en_logica_proposicional_con_Isabelle
Línea 6: Línea 6:
 
begin
 
begin
  
−
text {*
+
text ‹En este tema se presentan los ejemplos del tema de deducción  
−
  En este tema se presentan los ejemplos del tema de deducción natural
+
   natural proposicional siguiendo la presentación de Huth y Ryan en su  
−
   proposicional siguiendo la presentación de Huth y Ryan en su libro
+
   libro "Logic in Computer Science" http://goo.gl/qsVpY y, más  
−
   "Logic in Computer Science" http://goo.gl/qsVpY y, más concretamente,
+
  concretamente, a la forma como se explica en la asignatura de
−
  a la forma como se explica en el tema 2 de la asignatura.
+
  "Lógica informática" (LI) http://goo.gl/AwDiv
 
   
 
   
−
   La página al lado de cada ejemplo indica la página de las transparencias
+
   La página al lado de cada ejemplo indica la página de las  
−
   deltema 2 donde se encuentra la demostración. *}
+
   transparencias de LI donde se encuentra la demostración.›
  
−
subsection {* Reglas de la conjunción *}
+
section ‹Reglas de la conjunción›
  
−
text {*
+
text ‹  Notas sobre la lógica: Las reglas de la conjunción son
−
   Ejemplo 1 (p. 4). Demostrar que
+
   · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q
−
     p ∧ q, r ⊢ q ∧ r.
+
  · conjunct1:  P ∧ Q ⟹ P
−
   *}   
+
  · conjunct2:  P ∧ Q ⟹ Q  ›
 +
 
 +
thm conjI
 +
thm conjunct1
 +
thm conjunct2
 +
 
 +
subsection ‹Ejemplo 1›
 +
 
 +
text ‹Ejemplo 1 (p. 4). Demostrar que
 +
     p ∧ q, r ⊢ q ∧ r. ›   
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_1:
 +
   "⟦p ∧ q; r⟧ ⟹ q ∧ r"
 +
  apply (rule conjI)
 +
  apply (erule conjunct2)
 +
  apply assumption 
 +
  done
 +
 
 +
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
 +
  · "⟦ ... ⟧" para representar las hipótesis,
 +
  · ";" para separar las hipótesis y
 +
  · "⟹" para separar las hipótesis de la conclusión.›
 +
 
 +
subsubsection ‹Demostración detallada›
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_1_1:
 
lemma ejemplo_1_1:
 
   assumes 1: "p ∧ q" and
 
   assumes 1: "p ∧ q" and
Línea 32: Línea 56:
 
qed
 
qed
  
−
text {*
+
text ‹Notas sobre el lenguaje: En la demostración anterior se ha usado
−
  Notas sobre el lenguaje: En la demostración anterior se ha usado
 
 
   · "assumes" para indicar las hipótesis,
 
   · "assumes" para indicar las hipótesis,
 
   · "and" para separar las hipótesis,
 
   · "and" para separar las hipótesis,
Línea 43: Línea 66:
 
   · "using" para usar hechos en un paso,
 
   · "using" para usar hechos en un paso,
 
   · "by (rule ..)" para indicar la regla con la que se peueba un hecho,
 
   · "by (rule ..)" para indicar la regla con la que se peueba un hecho,
−
   · "show" para establecer la conclusión.
+
   · "show" para establecer la conclusión.›
  
−
  Notas sobre la lógica: Las reglas de la conjunción son
+
subsubsection ‹Demostración estructurada›
−
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q
 
−
  · conjunct1:  P ∧ Q ⟹ P
 
−
  · conjunct2:  P ∧ Q ⟹ Q 
 
−
*}
 
  
−
text {* Se pueden dejar implícitas las reglas como sigue *}
+
text ‹Se pueden dejar implícitas las reglas como sigue›
  
 
lemma ejemplo_1_2:
 
lemma ejemplo_1_2:
Línea 62: Línea 81:
 
qed
 
qed
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
+
   · ".." para indicar que se prueba por la regla correspondiente.›
−
   · ".." para indicar que se prueba por la regla correspondiente. *}
 
  
−
text {* Se pueden eliminar las etiquetas como sigue *}
+
text ‹Se pueden eliminar las etiquetas como sigue›
  
 
lemma ejemplo_1_3:
 
lemma ejemplo_1_3:
Línea 74: Línea 92:
 
proof -
 
proof -
 
   have "q" using assms(1) ..
 
   have "q" using assms(1) ..
−
   thus "q ∧ r" using assms(2) ..
+
   then show "q ∧ r" using assms(2) ..
 
qed
 
qed
  
−
text {*
+
text ‹
 
   Nota sobre el lenguaje: En la demostración anterior se ha usado
 
   Nota sobre el lenguaje: En la demostración anterior se ha usado
 
   · "assms(n)" para indicar la hipótesis n y
 
   · "assms(n)" para indicar la hipótesis n y
−
   · "thus" para demostrar la conclusión usando el hecho anterior.
+
   · "then show" para demostrar la conclusión usando el hecho anterior.
−
   Además, no es necesario usar and entre las hipótesis. *}
+
   Además, no es necesario usar and entre las hipótesis.›
 +
 
 +
subsubsection ‹Demostración automática›
  
−
text {* Se puede automatizar la demostración como sigue *}
 
−
 
 
 
lemma ejemplo_1_4:
 
lemma ejemplo_1_4:
 
   assumes "p ∧ q"  
 
   assumes "p ∧ q"  
 
           "r"  
 
           "r"  
 
   shows  "q ∧ r"     
 
   shows  "q ∧ r"     
−
using assms
+
  using assms
−
by auto
+
  by auto
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
 
 
   · "assms" para indicar las hipótesis y
 
   · "assms" para indicar las hipótesis y
−
   · "by auto" para demostrar la conclusión automáticamente. *}
+
   · "by auto" para demostrar la conclusión automáticamente.›
 +
 
 +
subsubsection ‹Demostración detallada hacia atrás›
  
−
text {* Se puede automatizar totalmente la demostración como sigue *}
+
text ‹Se puede hacer la demostración por razonamiento hacia atrás,
 +
  como sigue›
  
 
lemma ejemplo_1_5:
 
lemma ejemplo_1_5:
−
  "⟦p ∧ q; r⟧ ⟹ q ∧ r"
 
−
by auto
 
−
 
−
text {*
 
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
 
−
  · "⟦ ... ⟧" para representar las hipótesis,
 
−
  · ";" para separar las hipótesis y
 
−
  · "⟹" para separar las hipótesis de la conclusión. *}
 
−
 
−
text {* Se puede hacer la demostración por razonamiento hacia atrás,
 
−
  como sigue *}
 
−
 
−
lemma ejemplo_1_6:
 
 
   assumes "p ∧ q"  
 
   assumes "p ∧ q"  
 
       and "r"  
 
       and "r"  
Línea 122: Línea 129:
 
qed
 
qed
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
 
 
   · "proof (rule r)" para indicar que se hará la demostración con la
 
   · "proof (rule r)" para indicar que se hará la demostración con la
 
     regla r,
 
     regla r,
 
   · "next" para indicar el comienzo de la prueba del siguiente
 
   · "next" para indicar el comienzo de la prueba del siguiente
 
     subobjetivo,
 
     subobjetivo,
−
   · "this" para indicar el hecho actual. *}
+
   · "this" para indicar el hecho actual.›
 +
 
 +
subsubsection ‹Demostración estructurada hacia atrás›
  
−
text {* Se pueden dejar implícitas las reglas como sigue *}
+
text ‹Se pueden dejar implícitas las reglas como sigue›
  
−
lemma ejemplo_1_7:
+
lemma ejemplo_1_6:
 
   assumes "p ∧ q"  
 
   assumes "p ∧ q"  
 
           "r"  
 
           "r"  
Línea 142: Línea 150:
 
qed
 
qed
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
+
   · "." para indicar por el hecho actual.›
−
   · "." para indicar por el hecho actual. *}
+
 
 +
subsubsection ‹Demostraciones automáticas›
 +
 
 +
lemma ejemplo_1_7:
 +
  assumes "p ∧ q"
 +
          "r"
 +
  shows  "q ∧ r"   
 +
  using assms by simp
 +
 
 +
― ‹Se puede acortar como sigue›
 +
lemma ejemplo_1_8_:
 +
  "⟦p ∧ q; r⟧ ⟹ q ∧ r"
 +
  by simp
 +
 
 +
section ‹Reglas de la doble negación›
  
−
subsection {* Reglas de la doble negación *}
+
subsection ‹Reglas de la doble negación›
  
−
text {*
+
text ‹La regla de eliminación de la doble negación es
−
  La regla de eliminación de la doble negación es
 
 
   · notnotD: ¬¬ P ⟹ P
 
   · notnotD: ¬¬ P ⟹ P
  
Línea 155: Línea 176:
 
   introducción de la doble negación
 
   introducción de la doble negación
 
   · notnotI: P ⟹ ¬¬ P
 
   · notnotI: P ⟹ ¬¬ P
−
   aunque, de momento, no detallamos su demostración.
+
   aunque, de momento, no detallamos su demostración.›
−
*}
 
  
 
lemma notnotI [intro!]: "P ⟹ ¬¬ P"
 
lemma notnotI [intro!]: "P ⟹ ¬¬ P"
−
by auto
+
  by auto
 +
 
 +
subsection ‹Ejemplo 2›
 +
 
 +
text ‹Ejemplo 2. (p. 5)
 +
      p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_2:
 +
  "⟦p; ¬¬(q ∧ r)⟧ ⟹ ¬¬p ∧ r"
 +
  apply (rule conjI)
 +
  apply (rule notnotI)
 +
  apply assumption
 +
  apply (drule notnotD)
 +
  apply (erule conjunct2)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 2. (p. 5)
 
−
      p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_2_1:
 
lemma ejemplo_2_1:
 
   assumes 1: "p" and
 
   assumes 1: "p" and
Línea 178: Línea 210:
 
qed         
 
qed         
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 +
― ‹Se puede eliminar etiquetas y reglas›
 
lemma ejemplo_2_2:
 
lemma ejemplo_2_2:
 
   assumes "p"  
 
   assumes "p"  
Línea 184: Línea 218:
 
   shows  "¬¬p ∧ r"
 
   shows  "¬¬p ∧ r"
 
proof -
 
proof -
−
   have "¬¬p" using assms(1) ..
+
   have "¬¬p" using assms(1) ..
−
   have "q ∧ r" using assms(2) by (rule notnotD)
+
   have "q ∧ r" using assms(2) by (rule notnotD)
−
   hence "r" ..
+
   then have "r" ..
−
   with `¬¬p` show  "¬¬p ∧ r" ..
+
   with ‹¬¬p› show  "¬¬p ∧ r" ..
 
qed         
 
qed         
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
+
   · ‹...› para referenciar un hecho y
−
   · "hence" para indicar que se tiene por el hecho anterior,
 
−
  · `...` para referenciar un hecho y
 
 
   · "with P show Q" para indicar que con el hecho anterior junto con el
 
   · "with P show Q" para indicar que con el hecho anterior junto con el
−
     hecho P se demuestra Q. *}
+
     hecho P se demuestra Q.›
 +
 
 +
subsubsection ‹Demostración detallada hacia atrás›
  
−
― ‹La demostración automática es›
 
 
lemma ejemplo_2_3:
 
lemma ejemplo_2_3:
−
  assumes "p"
 
−
          "¬¬(q ∧ r)"
 
−
  shows  "¬¬p ∧ r"
 
−
using assms
 
−
by auto
 
−
 
−
text {* Se puede demostrar hacia atrás *}
 
−
 
−
lemma ejemplo_2_4:
 
 
   assumes "p"  
 
   assumes "p"  
 
           "¬¬(q ∧ r)"  
 
           "¬¬(q ∧ r)"  
Línea 215: Línea 239:
 
next
 
next
 
   have "q ∧ r" using assms(2) by (rule notnotD)  
 
   have "q ∧ r" using assms(2) by (rule notnotD)  
−
   thus "r" by (rule conjunct2)
+
   then show "r" by (rule conjunct2)
 
qed  
 
qed  
  
−
text {* Se puede eliminar las reglas en la demostración anterior, como
+
subsubsection ‹Demostración estructurada hacia atrás›
−
  sigue: *}
 
  
−
lemma ejemplo_2_5:
+
text ‹Se puede eliminar las reglas en la demostración anterior, como
 +
  sigue:›
 +
 
 +
lemma ejemplo_2_4:
 
   assumes "p"  
 
   assumes "p"  
 
           "¬¬(q ∧ r)"  
 
           "¬¬(q ∧ r)"  
Línea 229: Línea 255:
 
next
 
next
 
   have "q ∧ r" using assms(2) by (rule notnotD)  
 
   have "q ∧ r" using assms(2) by (rule notnotD)  
−
   thus "r" ..  
+
   then show "r" ..  
 
qed
 
qed
  
−
subsection {* Regla de eliminación del condicional *}
+
subsubsection ‹Demostraciones automáticas›
 +
 
 +
lemma ejemplo_2_5:
 +
  assumes "p"
 +
          "¬¬(q ∧ r)"
 +
  shows  "¬¬p ∧ r"
 +
  using assms
 +
  by simp
 +
 
 +
― ‹Se puede simplificar›
 +
lemma ejemplo_2_6:
 +
  "⟦p; ¬¬(q ∧ r)⟧ ⟹ ¬¬p ∧ r"
 +
  by simp
 +
 
 +
section ‹Regla de eliminación del condicional›
  
−
text {*
+
text ‹La regla de eliminación del condicional es la regla del modus  
−
  La regla de eliminación del condicional es la regla del modus ponens
+
  ponens
−
   · mp: ⟦P ⟶ Q; P⟧ ⟹ Q  
+
   · mp: ⟦P ⟶ Q; P⟧ ⟹ Q ›
−
*}
 
  
−
text {*
+
subsection ‹Ejemplo 3›
−
  Ejemplo 3. (p. 6) Demostrar que
+
 
−
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p
+
text ‹Ejemplo 3. (p. 6) Demostrar que
−
*}
+
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_3:
 +
  "⟦¬p ∧ q; ¬p ∧ q ⟶ r ∨ ¬p⟧ ⟹ r ∨ ¬p"
 +
  apply (erule mp)
 +
  apply assumption
 +
  done
 +
 
 +
subsubsection ‹Demostración detallada›
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_3_1:
 
lemma ejemplo_3_1:
 
   assumes 1: "¬p ∧ q" and  
 
   assumes 1: "¬p ∧ q" and  
Línea 253: Línea 301:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_3_2:
 
lemma ejemplo_3_2:
 
   assumes "¬p ∧ q"
 
   assumes "¬p ∧ q"
Línea 262: Línea 311:
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_3_3:
 
lemma ejemplo_3_3:
−
   assumes "¬p ∧ q"
+
   "⟦¬p ∧ q; ¬p ∧ q ⟶ r ∨ ¬p⟧ ⟹ r ∨ ¬p"
−
          "¬p ∧ q ⟶ r ∨ ¬p"  
+
   by simp
−
   shows   "r ∨ ¬p"
+
 
−
using assms
+
subsection ‹Ejemplo 4›
−
by auto
+
 
 +
text ‹Ejemplo 4 (p. 6) Demostrar que
 +
    p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_4:
 +
   "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (drule mp)
 +
  apply assumption+
 +
  done   
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 4 (p. 6) Demostrar que
 
−
    p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_4_1:
 
lemma ejemplo_4_1:
 
   assumes 1: "p" and  
 
   assumes 1: "p" and  
Línea 287: Línea 347:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_4_2:
 
lemma ejemplo_4_2:
 
   assumes "p"
 
   assumes "p"
Línea 296: Línea 357:
 
   have "q" using assms(2,1) ..  
 
   have "q" using assms(2,1) ..  
 
   have "q ⟶ r" using assms(3,1) ..
 
   have "q ⟶ r" using assms(3,1) ..
−
   thus "r" using `q` ..
+
   then show "r" using ‹q› ..
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_4_3:
 
lemma ejemplo_4_3:
 
   "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
 
   "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
−
by auto
+
  by simp
  
−
subsection {* Regla derivada del modus tollens *}
+
section ‹Regla derivada del modus tollens›
  
−
text {*
+
text ‹Para ajustarnos al tema de LI vamos a introducir la regla del  
−
  Para ajustarnos al tema de LI vamos a introducir la regla del modus
+
   modus tollens
−
   tollens
 
 
   · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F  
 
   · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F  
−
   aunque, de momento, sin detallar su demostración.
+
   aunque, de momento, sin detallar su demostración.›
−
*}
 
  
 
lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
 
lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
−
by auto
+
  by simp
 +
 
 +
subsection ‹Ejemplo 5›
 +
 
 +
text ‹Ejemplo 5 (p. 7). Demostrar
 +
    p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_5:
 +
  "⟦p ⟶ (q ⟶ r); p; ¬r ⟧ ⟹ ¬q"
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (erule mt)
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 5 (p. 7). Demostrar
 
−
    p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_5_1:
 
lemma ejemplo_5_1:
 
   assumes 1: "p ⟶ (q ⟶ r)" and  
 
   assumes 1: "p ⟶ (q ⟶ r)" and  
Línea 332: Línea 403:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_5_2:
 
lemma ejemplo_5_2:
 
   assumes "p ⟶ (q ⟶ r)"
 
   assumes "p ⟶ (q ⟶ r)"
Línea 340: Línea 412:
 
proof -
 
proof -
 
   have "q ⟶ r" using assms(1,2) ..
 
   have "q ⟶ r" using assms(1,2) ..
−
   thus "¬q" using assms(3) by (rule mt)
+
   then show "¬q" using assms(3) by (rule mt)
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_5_3:
 
lemma ejemplo_5_3:
 
   assumes "p ⟶ (q ⟶ r)"
 
   assumes "p ⟶ (q ⟶ r)"
Línea 349: Línea 422:
 
           "¬r"  
 
           "¬r"  
 
   shows  "¬q"
 
   shows  "¬q"
−
using assms
+
  using assms
−
by auto
+
  by simp
 +
 
 +
lemma ejemplo_5_4:
 +
  "⟦p ⟶ (q ⟶ r); p; ¬r ⟧ ⟹ ¬q"
 +
  by simp
 +
 
 +
subsection ‹Ejemplo 6›
 +
 
 +
text ‹Ejemplo 6. (p. 7) Demostrar
 +
    ¬p ⟶ q, ¬q ⊢ p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_6:
 +
  "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
 +
  apply (drule mt)
 +
  apply assumption
 +
  apply (erule notnotD)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 6. (p. 7) Demostrar
 
−
    ¬p ⟶ q, ¬q ⊢ p
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_6_1:
 
lemma ejemplo_6_1:
 
   assumes 1: "¬p ⟶ q" and  
 
   assumes 1: "¬p ⟶ q" and  
Línea 367: Línea 454:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_6_2:
 
lemma ejemplo_6_2:
 
   assumes "¬p ⟶ q"
 
   assumes "¬p ⟶ q"
Línea 374: Línea 462:
 
proof -
 
proof -
 
   have "¬¬p" using assms(1,2) by (rule mt)
 
   have "¬¬p" using assms(1,2) by (rule mt)
−
   thus "p" by (rule notnotD)
+
   then show "p" by (rule notnotD)
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_6_3:
 
lemma ejemplo_6_3:
 
   "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
 
   "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
−
by auto
+
  by simp
 +
 
 +
subsection ‹Ejemplo 7›
 +
 
 +
text ‹Ejemplo 7. (p. 7) Demostrar
 +
    p ⟶ ¬q, q ⊢ ¬p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_7:
 +
  "⟦p ⟶ ¬q; q⟧ ⟹ ¬p" 
 +
  apply (erule mt)
 +
  apply (erule notnotI)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 7. (p. 7) Demostrar
 
−
    p ⟶ ¬q, q ⊢ ¬p
 
−
  *}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_7_1:
 
lemma ejemplo_7_1:
 
   assumes 1: "p ⟶ ¬q" and  
 
   assumes 1: "p ⟶ ¬q" and  
Línea 397: Línea 495:
 
qed
 
qed
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_7_2:
 
lemma ejemplo_7_2:
 
   assumes "p ⟶ ¬q"
 
   assumes "p ⟶ ¬q"
Línea 407: Línea 504:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_7_3:
 
lemma ejemplo_7_3:
 
   "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"
 
   "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"
−
by auto
+
  by simp
 +
 
 +
section ‹Regla de introducción del condicional›
 +
 
 +
text ‹La regla de introducción del condicional es
 +
  · impI: (P ⟹ Q) ⟹ P ⟶ Q ›
  
−
subsection {* Regla de introducción del condicional *}
+
subsection ‹Ejemplo 8›
  
−
text {*
+
text ‹Ejemplo 8. (p. 8) Demostrar
−
  La regla de introducción del condicional es
+
    p ⟶ q ⊢ ¬q ⟶ ¬p ›
−
  · impI: (P ⟹ Q) ⟹ P ⟶ Q
 
−
*}
 
  
−
text {*
+
subsubsection ‹Demostración aplicativa›
−
   Ejemplo 8. (p. 8) Demostrar
+
 
−
    p ⟶ q ⊢ ¬q ⟶ ¬p
+
lemma ejemplo_8:
−
*}
+
   "p ⟶ q ⟹ ¬q ⟶ ¬p"
 +
  apply (rule impI)
 +
  apply (erule mt)
 +
  apply assumption
 +
  done
 +
 
 +
subsubsection ‹Demostración detallada›
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_8_1:
 
lemma ejemplo_8_1:
 
   assumes 1: "p ⟶ q"  
 
   assumes 1: "p ⟶ q"  
Línea 431: Línea 537:
 
   { assume 2: "¬q"
 
   { assume 2: "¬q"
 
     have "¬p" using 1 2 by (rule mt) }  
 
     have "¬p" using 1 2 by (rule mt) }  
−
   thus "¬q ⟶ ¬p" by (rule impI)
+
   then show "¬q ⟶ ¬p" by (rule impI)
 
qed     
 
qed     
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
+
   · "{ ... }" para representar una caja.›
−
   · "{ ... }" para representar una caja. *}
+
 
 +
subsubsection ‹Demostración estructurada›
  
−
― ‹La demostración estructurada es›
 
 
lemma ejemplo_8_2:
 
lemma ejemplo_8_2:
 
   assumes "p ⟶ q"  
 
   assumes "p ⟶ q"  
Línea 447: Línea 553:
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_8_3:
 
lemma ejemplo_8_3:
 
   assumes "p ⟶ q"  
 
   assumes "p ⟶ q"  
 
   shows "¬q ⟶ ¬p"
 
   shows "¬q ⟶ ¬p"
−
using assms
+
  using assms
−
by auto
+
  by auto
 +
 
 +
subsection ‹Ejemplo 9›
 +
 
 +
text ‹Ejemplo 9. (p. 9) Demostrar
 +
    ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_9:
 +
  "¬q ⟶ ¬p ⟹ p ⟶ ¬¬q" 
 +
  apply (rule impI)
 +
  apply (erule mt)
 +
  apply (erule notnotI)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 9. (p. 9) Demostrar
 
−
    ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_9_1:  
 
lemma ejemplo_9_1:  
 
   assumes 1: "¬q ⟶ ¬p"  
 
   assumes 1: "¬q ⟶ ¬p"  
Línea 467: Línea 584:
 
     have 3: "¬¬p" using 2 by (rule notnotI)
 
     have 3: "¬¬p" using 2 by (rule notnotI)
 
     have "¬¬q" using 1 3 by (rule mt) }  
 
     have "¬¬q" using 1 3 by (rule mt) }  
−
   thus "p ⟶ ¬¬q" by (rule impI)
+
   then show "p ⟶ ¬¬q" by (rule impI)
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_9_2:
 
lemma ejemplo_9_2:
 
   assumes "¬q ⟶ ¬p"  
 
   assumes "¬q ⟶ ¬p"  
Línea 476: Línea 594:
 
proof  
 
proof  
 
   assume "p"
 
   assume "p"
−
   hence "¬¬p" by (rule notnotI)
+
   then have "¬¬p" by (rule notnotI)
 
   with assms show "¬¬q" by (rule mt)
 
   with assms show "¬¬q" by (rule mt)
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_9_3:
 
lemma ejemplo_9_3:
 
   assumes "¬q ⟶ ¬p"  
 
   assumes "¬q ⟶ ¬p"  
 
   shows "p ⟶ ¬¬q"   
 
   shows "p ⟶ ¬¬q"   
−
using assms
+
  using assms
−
by auto
+
  by auto  
 +
 
 +
subsection ‹Ejemplo 10›
 +
 
 +
text ‹Ejemplo 10 (p. 9). Demostrar
 +
    ⊢ p ⟶ p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_10:
 +
  "p ⟶ p"
 +
  apply (rule impI)
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 10 (p. 9). Demostrar
 
−
    ⊢ p ⟶ p
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_10_1:
 
lemma ejemplo_10_1:
 
   "p ⟶ p"
 
   "p ⟶ p"
Línea 498: Línea 626:
 
   { assume 1: "p"
 
   { assume 1: "p"
 
     have "p" using 1 by this }
 
     have "p" using 1 by this }
−
   thus "p ⟶ p" by (rule impI)  
+
   then show "p ⟶ p" by (rule impI)  
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_10_2:
 
lemma ejemplo_10_2:
 
   "p ⟶ p"
 
   "p ⟶ p"
Línea 507: Línea 636:
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_10_3:
 
lemma ejemplo_10_3:
 
   "p ⟶ p"
 
   "p ⟶ p"
−
by auto
+
  by simp
 +
 
 +
subsection ‹Ejemplo 11›
 +
 
 +
text ‹Ejemplo 11 (p. 10) Demostrar
 +
    ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_11:
 +
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))" 
 +
  apply (rule impI)+ 
 +
  apply (erule mp)
 +
  apply (drule mt)
 +
  apply (erule notnotI)
 +
  apply (erule notnotD)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 11 (p. 10) Demostrar
 
−
    ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_11_1:
 
lemma ejemplo_11_1:
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
Línea 528: Línea 670:
 
         have 6: "q" using 5 by (rule notnotD)
 
         have 6: "q" using 5 by (rule notnotD)
 
         have "r" using 1 6 by (rule mp) }  
 
         have "r" using 1 6 by (rule mp) }  
−
       hence "p ⟶ r" by (rule impI) }  
+
       then have "p ⟶ r" by (rule impI) }  
−
     hence "(¬q ⟶ ¬p) ⟶ p ⟶ r" by (rule impI) }  
+
     then have "(¬q ⟶ ¬p) ⟶ p ⟶ r" by (rule impI) }  
−
   thus "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)" by (rule impI)
+
   then show "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)" by (rule impI)
 
qed
 
qed
  
Línea 552: Línea 694:
 
qed
 
qed
  
−
― ‹La demostración hacia atrás con reglas implícitas es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_11_3:
 
lemma ejemplo_11_3:
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
Línea 582: Línea 725:
 
     proof
 
     proof
 
       assume "p"
 
       assume "p"
−
       hence "¬¬p" ..
+
       then have "¬¬p" ..
−
       with `¬q ⟶ ¬p` have "¬¬q" by (rule mt)
+
       with ‹¬q ⟶ ¬p› have "¬¬q" by (rule mt)
−
       hence "q" by (rule notnotD)
+
       then have "q" by (rule notnotD)
−
       with `q ⟶ r` show "r" ..
+
       with ‹q ⟶ r› show "r" ..
 
     qed
 
     qed
 
   qed
 
   qed
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_11_5:
 
lemma ejemplo_11_5:
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
 
   "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
−
by auto
+
  by auto
  
−
subsection {* Reglas de la disyunción *}
+
section ‹Reglas de la disyunción›
  
−
text {*
+
text ‹Las reglas de la introducción de la disyunción son
−
  Las reglas de la introducción de la disyunción son
 
 
   · disjI1: P ⟹ P ∨ Q
 
   · disjI1: P ⟹ P ∨ Q
 
   · disjI2: Q ⟹ P ∨ Q
 
   · disjI2: Q ⟹ P ∨ Q
 
   La regla de elimación de la disyunción es
 
   La regla de elimación de la disyunción es
−
   · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R  
+
   · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R ›
−
*}
 
  
−
text {*
+
subsection ‹Ejemplo 12›
−
  Ejemplo 12 (p. 11). Demostrar
+
 
−
     p ∨ q ⊢ q ∨ p
+
text ‹Ejemplo 12 (p. 11). Demostrar
−
*}
+
     p ∨ q ⊢ q ∨ p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_12:
 +
  "p ∨ q ⟹ q ∨ p" 
 +
  apply (erule disjE)
 +
  apply (erule disjI2)
 +
  apply (erule disjI1)
 +
  done
 +
 
 +
subsubsection ‹Demostración detallada›
  
 
― ‹La demostración detallada es›
 
― ‹La demostración detallada es›
Línea 625: Línea 778:
 
qed     
 
qed     
  
−
text {*
+
text ‹
 
   Nota sobre el lenguaje: En la demostración anterior se ha usado
 
   Nota sobre el lenguaje: En la demostración anterior se ha usado
 
   · "moreover" para separar los bloques y
 
   · "moreover" para separar los bloques y
−
   · "ultimately" para unir los resultados de los bloques. *}
+
   · "ultimately" para unir los resultados de los bloques.›
−
+
 
 +
subsubsection ‹Demostración estructurada›
 +
 
 
― ‹La demostración detallada con reglas implícitas es›
 
― ‹La demostración detallada con reglas implícitas es›
 
lemma ejemplo_12_2:
 
lemma ejemplo_12_2:
Línea 635: Línea 790:
 
   shows "q ∨ p"
 
   shows "q ∨ p"
 
proof -
 
proof -
−
   note `p ∨ q`
+
   note ‹p ∨ q›
 
   moreover
 
   moreover
 
   { assume "p"
 
   { assume "p"
−
     hence "q ∨ p" .. }
+
     then have "q ∨ p" .. }
 
   moreover
 
   moreover
 
   { assume "q"
 
   { assume "q"
−
     hence "q ∨ p" .. }
+
     then have "q ∨ p" .. }
 
   ultimately show "q ∨ p" ..
 
   ultimately show "q ∨ p" ..
 
qed     
 
qed     
  
−
text {*
+
text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
−
  Nota sobre el lenguaje: En la demostración anterior se ha usado
+
   · "note" para copiar un hecho.›
−
   · "note" para copiar un hecho. *}
+
 
 +
subsubsection ‹Demostración detallada hacia atrás›
  
−
― ‹La demostración hacia atrás es›
 
 
lemma ejemplo_12_3:
 
lemma ejemplo_12_3:
 
   assumes 1: "p ∨ q"  
 
   assumes 1: "p ∨ q"  
Línea 662: Línea 817:
 
qed     
 
qed     
  
−
― ‹La demostración hacia atrás con reglas implícitas es›
+
subsubsection ‹Demostración estructurada hacia atrás›
 +
 
 
lemma ejemplo_12_4:
 
lemma ejemplo_12_4:
 
   assumes "p ∨ q"  
 
   assumes "p ∨ q"  
Línea 669: Línea 825:
 
proof  
 
proof  
 
   { assume  "p"
 
   { assume  "p"
−
     thus "q ∨ p" .. }
+
     then show "q ∨ p" .. }
 
next
 
next
 
   { assume "q"
 
   { assume "q"
−
     thus "q ∨ p" .. }
+
     then show "q ∨ p" .. }
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_12_5:
 
lemma ejemplo_12_5:
 
   assumes "p ∨ q"  
 
   assumes "p ∨ q"  
 
   shows "q ∨ p"
 
   shows "q ∨ p"
−
using assms
+
  using assms
−
by auto
+
  by auto
 +
 
 +
subsection ‹Ejemplo 13›
 +
 
 +
text ‹Ejemplo 13. (p. 12) Demostrar
 +
    q ⟶ r ⊢ p ∨ q ⟶ p ∨ r ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_13:
 +
  "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r" 
 +
  apply (rule impI)
 +
  apply (erule disjE)
 +
  apply (erule disjI1)
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (erule disjI2)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 13. (p. 12) Demostrar
 
−
    q ⟶ r ⊢ p ∨ q ⟶ p ∨ r
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_13_1:
 
lemma ejemplo_13_1:
 
   assumes 1: "q ⟶ r"
 
   assumes 1: "q ⟶ r"
Línea 693: Línea 863:
 
proof (rule impI)
 
proof (rule impI)
 
   assume 2: "p ∨ q"
 
   assume 2: "p ∨ q"
−
   thus "p ∨ r"
+
   then show "p ∨ r"
 
   proof (rule disjE)
 
   proof (rule disjE)
 
     { assume 3: "p"
 
     { assume 3: "p"
Línea 704: Línea 874:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_13_2:
 
lemma ejemplo_13_2:
 
   assumes "q ⟶ r"
 
   assumes "q ⟶ r"
Línea 710: Línea 881:
 
proof  
 
proof  
 
   assume "p ∨ q"
 
   assume "p ∨ q"
−
   thus "p ∨ r"
+
   then show "p ∨ r"
 
   proof  
 
   proof  
 
     { assume "p"
 
     { assume "p"
−
       thus "p ∨ r" .. }
+
       then show "p ∨ r" .. }
 
   next
 
   next
 
     { assume "q"
 
     { assume "q"
−
       have "r" using assms `q` ..
+
       have "r" using assms ‹q› ..
−
       thus "p ∨ r" .. }
+
       then show "p ∨ r" .. }
 
   qed
 
   qed
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_13_3:
 
lemma ejemplo_13_3:
 
   assumes "q ⟶ r"
 
   assumes "q ⟶ r"
 
   shows "p ∨ q ⟶ p ∨ r"
 
   shows "p ∨ q ⟶ p ∨ r"
−
using assms
+
  using assms
−
by auto
+
  by auto
 +
 
 +
section ‹Regla de copia›
 +
 
 +
subsection ‹Ejemplo 14›
 +
 
 +
text ‹Ejemplo 14 (p. 13). Demostrar
 +
    ⊢ p ⟶ (q ⟶ p) ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
  
−
subsection {* Regla de copia *}
+
lemma ejemplo_14:
 +
  "p ⟶ (q ⟶ p)" 
 +
  apply (rule impI)+
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 14 (p. 13). Demostrar
 
−
    ⊢ p ⟶ (q ⟶ p)
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_14_1:
 
lemma ejemplo_14_1:
 
   "p ⟶ (q ⟶ p)"
 
   "p ⟶ (q ⟶ p)"
Línea 747: Línea 928:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_14_2:
 
lemma ejemplo_14_2:
 
   "p ⟶ (q ⟶ p)"
 
   "p ⟶ (q ⟶ p)"
 
proof  
 
proof  
 
   assume "p"
 
   assume "p"
−
   thus "q ⟶ p" ..
+
   then show "q ⟶ p" ..
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_14_3:
 
lemma ejemplo_14_3:
 
   "p ⟶ (q ⟶ p)"
 
   "p ⟶ (q ⟶ p)"
−
by auto
+
  by simp
  
−
subsection {* Reglas de la negación *}
+
section ‹Reglas de la negación›
  
−
text {*
+
text ‹La regla de eliminación de lo falso es
−
  La regla de eliminación de lo falso es
 
 
   · FalseE: False ⟹ P
 
   · FalseE: False ⟹ P
 
   La regla de eliminación de la negación es
 
   La regla de eliminación de la negación es
 
   · notE: ⟦¬P; P⟧ ⟹ R
 
   · notE: ⟦¬P; P⟧ ⟹ R
 
   La regla de introducción de la negación es
 
   La regla de introducción de la negación es
−
   · notI: (P ⟹ False) ⟹ ¬P
+
   · notI: (P ⟹ False) ⟹ ¬P ›
−
*}
+
 
 +
subsection ‹Ejemplo 15›
 +
 
 +
text ‹Ejemplo 15 (p. 15). Demostrar
 +
    ¬p ∨ q ⊢ p ⟶ q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
  
−
text {*
+
lemma ejemplo_15:
−
   Ejemplo 15 (p. 15). Demostrar
+
   "¬p ∨ q ⟹ p ⟶ q" 
−
    ¬p ∨ q ⊢ p ⟶ q
+
  apply (rule impI)
−
*}
+
  apply (erule disjE)
 +
  apply (erule notE)
 +
  apply assumption+
 +
  done
 +
 
 +
subsubsection ‹Demostración detallada›
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_15_1:
 
lemma ejemplo_15_1:
 
   assumes 1: "¬p ∨ q"  
 
   assumes 1: "¬p ∨ q"  
Línea 783: Línea 975:
 
   assume 2: "p"
 
   assume 2: "p"
 
   note 1
 
   note 1
−
   thus "q"
+
   then show "q"
 
   proof (rule disjE)
 
   proof (rule disjE)
 
     { assume 3: "¬p"
 
     { assume 3: "¬p"
Línea 793: Línea 985:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_15_2:
 
lemma ejemplo_15_2:
 
   assumes "¬p ∨ q"  
 
   assumes "¬p ∨ q"  
Línea 799: Línea 992:
 
proof  
 
proof  
 
   assume "p"
 
   assume "p"
−
   note `¬p ∨ q`
+
   note ‹¬p ∨ q›
−
   thus "q"
+
   then show "q"
 
   proof
 
   proof
 
     assume "¬p"
 
     assume "¬p"
−
     thus "q" using `p` ..  
+
     then show "q" using ‹p› ..  
 
   next
 
   next
 
     assume "q"
 
     assume "q"
−
       thus "q" .
+
       then show "q" .
 
   qed
 
   qed
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_15_3:
 
lemma ejemplo_15_3:
 
   assumes "¬p ∨ q"  
 
   assumes "¬p ∨ q"  
 
   shows "p ⟶ q"
 
   shows "p ⟶ q"
−
using assms
+
  using assms
−
by auto
+
  by auto
 +
 
 +
subsection ‹Ejemplo 16›
 +
 
 +
text ‹Ejemplo 16 (p. 16). Demostrar
 +
    p ⟶ q, p ⟶ ¬q ⊢ ¬p ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_16:
 +
  "⟦p ⟶ q; p ⟶ ¬q⟧ ⟹ ¬p" 
 +
  apply (rule notI)
 +
  apply (drule mp)+
 +
    apply assumption+
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (erule notE)
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 16 (p. 16). Demostrar
 
−
    p ⟶ q, p ⟶ ¬q ⊢ ¬p
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_16_1:
 
lemma ejemplo_16_1:
 
   assumes 1: "p ⟶ q" and  
 
   assumes 1: "p ⟶ q" and  
Línea 834: Línea 1042:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_16_2:
 
lemma ejemplo_16_2:
 
   assumes "p ⟶ q"
 
   assumes "p ⟶ q"
Línea 841: Línea 1050:
 
proof  
 
proof  
 
   assume "p"
 
   assume "p"
−
   have "q" using assms(1) `p` ..
+
   have "q" using assms(1) ‹p› ..
−
   have "¬q" using assms(2) `p` ..
+
   have "¬q" using assms(2) ‹p› ..
−
   thus False using `q` ..
+
   then show False using ‹q› ..
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_16_3:
 
lemma ejemplo_16_3:
 
   assumes "p ⟶ q"
 
   assumes "p ⟶ q"
 
           "p ⟶ ¬q"  
 
           "p ⟶ ¬q"  
 
   shows "¬p"     
 
   shows "¬p"     
−
using assms
+
  using assms
−
by auto
+
  by simp
  
−
subsection {* Reglas del bicondicional *}
+
section ‹Reglas del bicondicional›
  
−
text {*
+
text ‹La regla de introducción del bicondicional es
−
  La regla de introducción del bicondicional es
 
 
   · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P ⟷ Q
 
   · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P ⟷ Q
 
   Las reglas de eliminación del bicondicional son
 
   Las reglas de eliminación del bicondicional son
 
   · iffD1: ⟦Q ⟷ P; Q⟧ ⟹ P  
 
   · iffD1: ⟦Q ⟷ P; Q⟧ ⟹ P  
−
   · iffD2: ⟦P ⟷ Q; Q⟧ ⟹ P
+
   · iffD2: ⟦P ⟷ Q; Q⟧ ⟹ P ›
−
*}
+
 
 +
subsection ‹Ejemplo 17›
 +
 
 +
text ‹Ejemplo 17 (p. 17) Demostrar
 +
    (p ∧ q) ⟷ (q ∧ p) ›
  
−
text {*
+
subsubsection ‹Demostración aplicativa›
−
   Ejemplo 17 (p. 17) Demostrar
+
 
−
    (p ∧ q) ⟷ (q ∧ p)
+
lemma ejemplo_17_4:
−
*}
+
   "(p ∧ q) ⟷ (q ∧ p)" 
 +
  apply (rule iffI)
 +
  apply (rule conjI)
 +
    apply (erule conjunct2)
 +
  apply (erule conjunct1)
 +
    apply (rule conjI)
 +
    apply (erule conjunct2)
 +
  apply (erule conjunct1)
 +
  done
 +
 
 +
subsubsection ‹Demostración detallada›
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_17_1:
 
lemma ejemplo_17_1:
 
   "(p ∧ q) ⟷ (q ∧ p)"  
 
   "(p ∧ q) ⟷ (q ∧ p)"  
Línea 884: Línea 1106:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_17_2:
 
lemma ejemplo_17_2:
 
   "(p ∧ q) ⟷ (q ∧ p)"
 
   "(p ∧ q) ⟷ (q ∧ p)"
Línea 891: Línea 1114:
 
     have "p" using 1 ..
 
     have "p" using 1 ..
 
     have "q" using 1 ..
 
     have "q" using 1 ..
−
     show "q ∧ p" using `q` `p` .. }
+
     show "q ∧ p" using ‹q› ‹p› .. }
 
next
 
next
 
   { assume 2: "q ∧ p"
 
   { assume 2: "q ∧ p"
 
     have "q" using 2 ..
 
     have "q" using 2 ..
 
     have "p" using 2 ..
 
     have "p" using 2 ..
−
     show "p ∧ q" using `p` `q` .. }
+
     show "p ∧ q" using ‹p› ‹q› .. }
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_17_3:
 
lemma ejemplo_17_3:
 
   "(p ∧ q) ⟷ (q ∧ p)"
 
   "(p ∧ q) ⟷ (q ∧ p)"
−
by auto
+
  by auto
 +
 
 +
subsection ‹Ejemplo 18›
 +
 
 +
text ‹Ejemplo 18 (p. 18). Demostrar
 +
    p ⟷ q, p ∨ q ⊢ p ∧ q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_18_4:
 +
  "⟦p ⟷ q; p ∨ q⟧ ⟹ p ∧ q" 
 +
  apply (erule disjE)
 +
  apply (rule conjI)
 +
    apply assumption
 +
  apply (erule iffD1)
 +
  apply assumption
 +
  apply (rule conjI)
 +
  apply (erule iffD2)
 +
  apply assumption+
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 18 (p. 18). Demostrar
 
−
    p ⟷ q, p ∨ q ⊢ p ∧ q
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_18_1:
 
lemma ejemplo_18_1:
 
   assumes 1: "p ⟷ q" and  
 
   assumes 1: "p ⟷ q" and  
Línea 925: Línea 1164:
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_18_2:
 
lemma ejemplo_18_2:
 
   assumes "p ⟷ q"
 
   assumes "p ⟷ q"
Línea 934: Línea 1174:
 
   { assume "p"
 
   { assume "p"
 
     with assms(1) have "q" ..
 
     with assms(1) have "q" ..
−
     with `p` show "p ∧ q" .. }
+
     with ‹p› show "p ∧ q" .. }
 
next
 
next
 
   { assume "q"
 
   { assume "q"
 
     with assms(1) have "p" ..
 
     with assms(1) have "p" ..
−
     thus "p ∧ q" using `q` .. }
+
     then show "p ∧ q" using ‹q› .. }
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_18_3:
 
lemma ejemplo_18_3:
 
   assumes "p ⟷ q"
 
   assumes "p ⟷ q"
 
           "p ∨ q"   
 
           "p ∨ q"   
 
   shows "p ∧ q"
 
   shows "p ∧ q"
−
using assms
+
  using assms
−
by auto
+
  by simp
 +
 
 +
section ‹Reglas derivadas›
 +
 
 +
subsection ‹Regla del modus tollens›
 +
 
 +
text ‹Ejemplo 19 (p. 20) Demostrar la regla del modus tollens a partir
 +
  de las reglas básicas.›
  
−
subsection {* Reglas derivadas *}
+
subsubsection ‹Demostración aplicativa›
  
−
subsubsection {* Regla del modus tollens *}
+
lemma ejemplo_20:
 +
  "⟦F ⟶ G; ¬G⟧ ⟹ ¬F" 
 +
  apply (rule notI)
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (erule notE)
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 19 (p. 20) Demostrar la regla del modus tollens a partir de
 
−
  las reglas básicas.
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_20_1:
 
lemma ejemplo_20_1:
 
   assumes 1: "F ⟶ G" and  
 
   assumes 1: "F ⟶ G" and  
Línea 969: Línea 1220:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_20_2:
 
lemma ejemplo_20_2:
 
   assumes "F ⟶ G"
 
   assumes "F ⟶ G"
Línea 980: Línea 1232:
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_20_3:
 
lemma ejemplo_20_3:
 
   assumes "F ⟶ G"
 
   assumes "F ⟶ G"
 
           "¬G"  
 
           "¬G"  
 
   shows "¬F"
 
   shows "¬F"
−
using assms
+
  using assms
−
by auto
+
  by simp
 +
 
 +
subsection ‹Regla de la introducción de la doble negación›
 +
 
 +
text ‹Ejemplo 21 (p. 21) Demostrar la regla de introducción de la doble
 +
  negación a partir de las reglas básicas.›
 +
 
 +
subsubsection ‹Demostración aplicativa›
  
−
subsubsection {* Regla de la introducción de la doble negación *}
+
lemma ejemplo_21:
 +
  "F ⟹ ¬¬F" 
 +
  apply (rule notI)
 +
  apply (erule notE)
 +
  apply assumption
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 21 (p. 21) Demostrar la regla de introducción de la doble
 
−
  negación a partir de las reglas básicas.
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_21_1:
 
lemma ejemplo_21_1:
 
   assumes 1: "F"  
 
   assumes 1: "F"  
Línea 1004: Línea 1265:
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_21_2:
 
lemma ejemplo_21_2:
 
   assumes "F"  
 
   assumes "F"  
Línea 1010: Línea 1272:
 
proof  
 
proof  
 
   assume "¬F"
 
   assume "¬F"
−
   thus False using assms ..
+
   then show False using assms ..
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_21_3:
 
lemma ejemplo_21_3:
 
   assumes "F"  
 
   assumes "F"  
 
   shows "¬¬F"
 
   shows "¬¬F"
−
using assms
+
  using assms
−
by auto
+
  by simp
  
−
subsubsection {* Regla de reducción al absurdo *}
+
subsection ‹Regla de reducción al absurdo›
  
−
text {*
+
text ‹La regla de reducción al absurdo en Isabelle se correponde con la
−
  La regla de reducción al absurdo en Isabelle se correponde con la
 
 
   regla clásica de contradicción  
 
   regla clásica de contradicción  
−
   · ccontr: (¬P ⟹ False) ⟹ P
+
   · ccontr: (¬P ⟹ False) ⟹ P ›
−
*}
+
 
 +
subsection ‹Ley del tercio excluso›
 +
 
 +
text ‹La ley del tercio excluso es
 +
  · excluded_middle: ¬P ∨ P ›
 +
 
 +
text ‹Ejemplo 22 (p. 23). Demostrar la ley del tercio excluso a partir de
 +
  las reglas básicas.›
  
−
subsubsection {* Ley del tercio excluso *}
+
subsubsection ‹Demostración aplicativa›
  
−
text {*
+
lemma ejemplo_22:
−
   La ley del tercio excluso es
+
   "F ∨ ¬F"
−
   · excluded_middle: ¬P ∨ P
+
   apply (rule ccontr)
−
*}
+
  apply (rule_tac P="F" in notE)
 +
  apply (rule notI)
 +
  apply (erule notE)
 +
  apply (erule disjI1)
 +
  apply (rule notnotD)
 +
  apply (rule notI)
 +
  apply (erule notE)
 +
  apply (erule disjI2)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 22 (p. 23). Demostrar la ley del tercio excluso a partir de
 
−
  las reglas básicas. 
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_22_1:
 
lemma ejemplo_22_1:
 
   "F ∨ ¬F"
 
   "F ∨ ¬F"
 
proof (rule ccontr)
 
proof (rule ccontr)
 
   assume 1: "¬(F ∨ ¬F)"
 
   assume 1: "¬(F ∨ ¬F)"
−
   thus False
+
   then show False
 
   proof (rule notE)
 
   proof (rule notE)
 
     show "F ∨ ¬F"
 
     show "F ∨ ¬F"
Línea 1052: Línea 1325:
 
       proof (rule notI)
 
       proof (rule notI)
 
         assume 2: "F"
 
         assume 2: "F"
−
         hence 3: "F ∨ ¬F" by (rule disjI1)
+
         then have 3: "F ∨ ¬F" by (rule disjI1)
 
         show False using 1 3 by (rule notE)
 
         show False using 1 3 by (rule notE)
 
       qed
 
       qed
Línea 1058: Línea 1331:
 
   qed
 
   qed
 
qed
 
qed
−
   
+
 
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_22_2:
 
lemma ejemplo_22_2:
 
   "F ∨ ¬F"
 
   "F ∨ ¬F"
 
proof (rule ccontr)
 
proof (rule ccontr)
 
   assume "¬(F ∨ ¬F)"
 
   assume "¬(F ∨ ¬F)"
−
   thus False
+
   then show False
 
   proof (rule notE)
 
   proof (rule notE)
 
     show "F ∨ ¬F"
 
     show "F ∨ ¬F"
Línea 1071: Línea 1345:
 
       proof (rule notI)
 
       proof (rule notI)
 
         assume "F"
 
         assume "F"
−
         hence "F ∨ ¬F" ..
+
         then have "F ∨ ¬F" ..
−
         with `¬(F ∨ ¬F)`show False ..
+
         with ‹¬(F ∨ ¬F)› show False ..
 
       qed
 
       qed
 
     qed
 
     qed
 
   qed
 
   qed
 
qed
 
qed
−
   
+
 
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_22_3:
 
lemma ejemplo_22_3:
 
   "F ∨ ¬F"
 
   "F ∨ ¬F"
−
using assms
+
  by simp
−
by auto
+
 
 +
subsection ‹Ejemplo 23›
 +
 
 +
text ‹Ejemplo 23 (p. 24). Demostrar
 +
    p ⟶ q ⊢ ¬p ∨ q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
 +
 
 +
lemma ejemplo_23:
 +
  "p ⟶ q ⟹ ¬p ∨ q"
 +
  apply (cut_tac P="p" in excluded_middle)
 +
  apply (erule disjE)
 +
  apply (erule disjI1)
 +
  apply (drule mp)
 +
  apply assumption
 +
  apply (erule disjI2)
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 23 (p. 24). Demostrar
 
−
    p ⟶ q ⊢ ¬p ∨ q
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_23_1:
 
lemma ejemplo_23_1:
 
   assumes 1: "p ⟶ q"  
 
   assumes 1: "p ⟶ q"  
Línea 1095: Línea 1382:
 
proof -
 
proof -
 
   have "¬p ∨ p" by (rule excluded_middle)
 
   have "¬p ∨ p" by (rule excluded_middle)
−
   thus "¬p ∨ q"
+
   then show "¬p ∨ q"
 
   proof (rule disjE)
 
   proof (rule disjE)
 
     { assume "¬p"
 
     { assume "¬p"
−
       thus "¬p ∨ q" by (rule disjI1) }
+
       then show "¬p ∨ q" by (rule disjI1) }
 
   next
 
   next
 
     { assume 2: "p"
 
     { assume 2: "p"
 
       have "q" using 1 2 by (rule mp)
 
       have "q" using 1 2 by (rule mp)
−
       thus "¬p ∨ q" by (rule disjI2) }
+
       then show "¬p ∨ q" by (rule disjI2) }
 
   qed
 
   qed
 
qed     
 
qed     
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_23_2:
 
lemma ejemplo_23_2:
 
   assumes "p ⟶ q"  
 
   assumes "p ⟶ q"  
Línea 1112: Línea 1400:
 
proof -
 
proof -
 
   have "¬p ∨ p" ..
 
   have "¬p ∨ p" ..
−
   thus "¬p ∨ q"
+
   then show "¬p ∨ q"
 
   proof  
 
   proof  
 
     { assume "¬p"
 
     { assume "¬p"
−
       thus "¬p ∨ q" .. }
+
       then show "¬p ∨ q" .. }
 
   next
 
   next
 
     { assume "p"
 
     { assume "p"
 
       with assms have "q" ..
 
       with assms have "q" ..
−
       thus "¬p ∨ q" .. }
+
       then show "¬p ∨ q" .. }
 
   qed
 
   qed
 
qed     
 
qed     
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_23_3:
 
lemma ejemplo_23_3:
 
   assumes "p ⟶ q"  
 
   assumes "p ⟶ q"  
 
   shows "¬p ∨ q"
 
   shows "¬p ∨ q"
−
using assms
+
  using assms
−
by auto
+
  by simp
 +
 
 +
section ‹Demostraciones por contradicción›
 +
 
 +
subsection ‹Ejemplo 24›
 +
 
 +
text ‹Ejemplo 24. Demostrar que
 +
    ¬p, p ∨ q ⊢ q ›
 +
 
 +
subsubsection ‹Demostración aplicativa›
  
−
subsection {* Demostraciones por contradicción *}
+
lemma ejemplo_24_4:
 +
  "⟦¬p ; p ∨ q⟧ ⟹ q" 
 +
  apply (erule disjE)
 +
  apply (erule notE)
 +
  apply assumption+
 +
  done
  
−
text {*
+
subsubsection ‹Demostración detallada›
−
  Ejemplo 24. Demostrar que
 
−
    ¬p, p ∨ q ⊢ q
 
−
*}
 
  
−
― ‹La demostración detallada es›
 
 
lemma ejemplo_24_1:
 
lemma ejemplo_24_1:
 
   assumes "¬p"
 
   assumes "¬p"
 
           "p ∨ q"
 
           "p ∨ q"
 
   shows  "q"
 
   shows  "q"
−
using `p ∨ q`
+
using ‹p ∨ q›
 
proof (rule disjE)
 
proof (rule disjE)
 
   assume "p"
 
   assume "p"
Línea 1148: Línea 1447:
 
next
 
next
 
   assume "q"
 
   assume "q"
−
   thus "q" by assumption
+
   then show "q" by assumption
 
qed
 
qed
  
−
― ‹La demostración estructurada es›
+
subsubsection ‹Demostración estructurada›
 +
 
 
lemma ejemplo_24_2:
 
lemma ejemplo_24_2:
 
   assumes "¬p"
 
   assumes "¬p"
 
           "p ∨ q"
 
           "p ∨ q"
 
   shows "q"
 
   shows "q"
−
using `p ∨ q`
+
using ‹p ∨ q›
 
proof  
 
proof  
 
   assume "p"
 
   assume "p"
Línea 1162: Línea 1462:
 
next
 
next
 
   assume "q"
 
   assume "q"
−
   thus "q" .
+
   then show "q" .
 
qed
 
qed
  
−
― ‹La demostración automática es›
+
subsubsection ‹Demostración automática›
 +
 
 
lemma ejemplo_24_3:
 
lemma ejemplo_24_3:
 
   assumes "¬p"
 
   assumes "¬p"
 
           "p ∨ q"
 
           "p ∨ q"
 
   shows "q"
 
   shows "q"
−
using assms
+
  using assms
−
by auto
+
  by simp
  
 
end
 
end
 
</source>
 
</source>

Revisión actual del 21:39 19 feb 2020

chapter ‹Tema 2a: Deducción natural proposicional con Isabelle/HOL›

theory T2a_Deduccion_natural_en_logica_proposicional_con_Isabelle
imports Main 
begin

text ‹En este tema se presentan los ejemplos del tema de deducción 
  natural proposicional siguiendo la presentación de Huth y Ryan en su 
  libro "Logic in Computer Science" http://goo.gl/qsVpY y, más 
  concretamente, a la forma como se explica en la asignatura de 
  "Lógica informática" (LI) http://goo.gl/AwDiv
 
  La página al lado de cada ejemplo indica la página de las 
  transparencias de LI donde se encuentra la demostración.›

section ‹Reglas de la conjunción›

text ‹  Notas sobre la lógica: Las reglas de la conjunción son
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q
  · conjunct1:  P ∧ Q ⟹ P
  · conjunct2:  P ∧ Q ⟹ Q  ›

thm conjI
thm conjunct1
thm conjunct2

subsection ‹Ejemplo 1›

text ‹Ejemplo 1 (p. 4). Demostrar que
     p ∧ q, r ⊢ q ∧ r. ›     

subsubsection ‹Demostración aplicativa›

lemma ejemplo_1: 
  "⟦p ∧ q; r⟧ ⟹ q ∧ r"
  apply (rule conjI)
   apply (erule conjunct2)
  apply assumption  
  done 

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "⟦ ... ⟧" para representar las hipótesis,
  · ";" para separar las hipótesis y
  · "⟹" para separar las hipótesis de la conclusión.›

subsubsection ‹Demostración detallada›

lemma ejemplo_1_1:
  assumes 1: "p ∧ q" and
          2: "r" 
  shows "q ∧ r"     
proof -
  have 3: "q" using 1 by (rule conjunct2)
  show 4: "q ∧ r" using 3 2 by (rule conjI)
qed

text ‹Notas sobre el lenguaje: En la demostración anterior se ha usado
  · "assumes" para indicar las hipótesis,
  · "and" para separar las hipótesis,
  · "shows" para indicar la conclusión,
  · "proof" para iniciar la prueba,
  · "qed" para terminar la pruebas,
  · "-" (después de "proof") para no usar el método por defecto,
  · "have" para establecer un paso,
  · "using" para usar hechos en un paso,
  · "by (rule ..)" para indicar la regla con la que se peueba un hecho,
  · "show" para establecer la conclusión.›

subsubsection ‹Demostración estructurada›

text ‹Se pueden dejar implícitas las reglas como sigue›

lemma ejemplo_1_2:
  assumes 1: "p ∧ q" and 
          2: "r" 
  shows "q ∧ r"     
proof -
  have 3: "q" using 1 .. 
  show 4: "q ∧ r" using 3 2 ..
qed

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · ".." para indicar que se prueba por la regla correspondiente.›

text ‹Se pueden eliminar las etiquetas como sigue›

lemma ejemplo_1_3:
  assumes "p ∧ q" 
          "r" 
  shows   "q ∧ r"     
proof -
  have "q" using assms(1) ..
  then show "q ∧ r" using assms(2) ..
qed

text ‹
  Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "assms(n)" para indicar la hipótesis n y
  · "then show" para demostrar la conclusión usando el hecho anterior.
  Además, no es necesario usar and entre las hipótesis.›

subsubsection ‹Demostración automática›

lemma ejemplo_1_4:
  assumes "p ∧ q" 
          "r" 
  shows   "q ∧ r"     
  using assms
  by auto

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "assms" para indicar las hipótesis y
  · "by auto" para demostrar la conclusión automáticamente.›

subsubsection ‹Demostración detallada hacia atrás›

text ‹Se puede hacer la demostración por razonamiento hacia atrás,
  como sigue›

lemma ejemplo_1_5:
  assumes "p ∧ q" 
      and "r" 
  shows   "q ∧ r"     
proof (rule conjI)
  show "q" using assms(1) by (rule conjunct2)
next
  show "r" using assms(2) by this
qed

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "proof (rule r)" para indicar que se hará la demostración con la
    regla r,
  · "next" para indicar el comienzo de la prueba del siguiente
    subobjetivo,
  · "this" para indicar el hecho actual.›

subsubsection ‹Demostración estructurada hacia atrás›

text ‹Se pueden dejar implícitas las reglas como sigue›

lemma ejemplo_1_6:
  assumes "p ∧ q" 
          "r" 
  shows   "q ∧ r"     
proof 
  show "q" using assms(1) ..
next
  show "r" using assms(2) . 
qed

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "." para indicar por el hecho actual.›

subsubsection ‹Demostraciones automáticas›

lemma ejemplo_1_7:
  assumes "p ∧ q" 
          "r" 
  shows   "q ∧ r"     
  using assms by simp

― ‹Se puede acortar como sigue›
lemma ejemplo_1_8_:
  "⟦p ∧ q; r⟧ ⟹ q ∧ r"
  by simp

section ‹Reglas de la doble negación›

subsection ‹Reglas de la doble negación›

text ‹La regla de eliminación de la doble negación es
  · notnotD: ¬¬ P ⟹ P

  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de
  introducción de la doble negación
  · notnotI: P ⟹ ¬¬ P
  aunque, de momento, no detallamos su demostración.›

lemma notnotI [intro!]: "P ⟹ ¬¬ P"
  by auto

subsection ‹Ejemplo 2›

text ‹Ejemplo 2. (p. 5)
       p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_2: 
  "⟦p; ¬¬(q ∧ r)⟧ ⟹ ¬¬p ∧ r"
  apply (rule conjI)
   apply (rule notnotI)
   apply assumption
  apply (drule notnotD)
  apply (erule conjunct2)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_2_1:
  assumes 1: "p" and
          2: "¬¬(q ∧ r)" 
  shows      "¬¬p ∧ r"
proof -
  have 3: "¬¬p" using 1 by (rule notnotI)
  have 4: "q ∧ r" using 2 by (rule notnotD)
  have 5: "r" using 4 by (rule conjunct2)
  show 6: "¬¬p ∧ r" using 3 5 by (rule conjI)
qed        

subsubsection ‹Demostración estructurada›

― ‹Se puede eliminar etiquetas y reglas›
lemma ejemplo_2_2:
  assumes "p" 
          "¬¬(q ∧ r)" 
  shows   "¬¬p ∧ r"
proof -
  have "¬¬p" using assms(1) ..
  have "q ∧ r" using assms(2) by (rule notnotD)
  then have "r" ..
  with ‹¬¬p› show  "¬¬p ∧ r" ..
qed        

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · ‹...› para referenciar un hecho y
  · "with P show Q" para indicar que con el hecho anterior junto con el
    hecho P se demuestra Q.›

subsubsection ‹Demostración detallada hacia atrás›

lemma ejemplo_2_3:
  assumes "p" 
          "¬¬(q ∧ r)" 
  shows   "¬¬p ∧ r"
proof  (rule conjI)
  show "¬¬p" using assms(1) by (rule notnotI)
next
  have "q ∧ r" using assms(2) by (rule notnotD) 
  then show "r" by (rule conjunct2)
qed 

subsubsection ‹Demostración estructurada hacia atrás›

text ‹Se puede eliminar las reglas en la demostración anterior, como
  sigue:›

lemma ejemplo_2_4:
  assumes "p" 
          "¬¬(q ∧ r)" 
  shows   "¬¬p ∧ r"
proof 
  show "¬¬p" using assms(1) ..
next
  have "q ∧ r" using assms(2) by (rule notnotD) 
  then show "r" .. 
qed

subsubsection ‹Demostraciones automáticas›

lemma ejemplo_2_5:
  assumes "p" 
          "¬¬(q ∧ r)" 
  shows   "¬¬p ∧ r"
  using assms
  by simp

― ‹Se puede simplificar›
lemma ejemplo_2_6: 
  "⟦p; ¬¬(q ∧ r)⟧ ⟹ ¬¬p ∧ r"
  by simp

section ‹Regla de eliminación del condicional›

text ‹La regla de eliminación del condicional es la regla del modus 
  ponens
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q ›

subsection ‹Ejemplo 3›

text ‹Ejemplo 3. (p. 6) Demostrar que
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_3: 
  "⟦¬p ∧ q; ¬p ∧ q ⟶ r ∨ ¬p⟧ ⟹ r ∨ ¬p"
  apply (erule mp)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_3_1:
  assumes 1: "¬p ∧ q" and 
          2: "¬p ∧ q ⟶ r ∨ ¬p" 
  shows      "r ∨ ¬p"
proof -
  show "r ∨ ¬p" using 2 1 by (rule mp)
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_3_2:
  assumes "¬p ∧ q"
          "¬p ∧ q ⟶ r ∨ ¬p" 
  shows   "r ∨ ¬p"
proof -
  show "r ∨ ¬p" using assms(2,1) ..
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_3_3:
  "⟦¬p ∧ q; ¬p ∧ q ⟶ r ∨ ¬p⟧ ⟹ r ∨ ¬p"
  by simp

subsection ‹Ejemplo 4›

text ‹Ejemplo 4 (p. 6) Demostrar que
     p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_4:
  "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
  apply (drule mp)
   apply assumption
  apply (drule mp)
   apply assumption
  apply (drule mp)
   apply assumption+
  done    

subsubsection ‹Demostración detallada›

lemma ejemplo_4_1:
  assumes 1: "p" and 
          2: "p ⟶ q" and 
          3: "p ⟶ (q ⟶ r)" 
  shows "r"
proof -
  have 4: "q" using 2 1 by (rule mp)
  have 5: "q ⟶ r" using 3 1 by (rule mp)
  show 6: "r" using 5 4 by (rule mp)
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_4_2:
  assumes "p"
          "p ⟶ q"
          "p ⟶ (q ⟶ r)" 
  shows "r"
proof -
  have "q" using assms(2,1) .. 
  have "q ⟶ r" using assms(3,1) ..
  then show "r" using ‹q› ..
qed

subsubsection ‹Demostración automática›

lemma ejemplo_4_3:
  "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
  by simp

section ‹Regla derivada del modus tollens›

text ‹Para ajustarnos al tema de LI vamos a introducir la regla del 
  modus tollens
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F 
  aunque, de momento, sin detallar su demostración.›

lemma mt: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
  by simp

subsection ‹Ejemplo 5›

text ‹Ejemplo 5 (p. 7). Demostrar
     p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_5: 
  "⟦p ⟶ (q ⟶ r); p; ¬r ⟧ ⟹ ¬q"
  apply (drule mp)
   apply assumption
  apply (erule mt)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_5_1:
  assumes 1: "p ⟶ (q ⟶ r)" and 
          2: "p" and 
          3: "¬r" 
  shows "¬q"
proof -
  have 4: "q ⟶ r" using 1 2 by (rule mp)
  show "¬q" using 4 3 by (rule mt)
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_5_2:
  assumes "p ⟶ (q ⟶ r)"
          "p"
          "¬r" 
  shows   "¬q"
proof -
  have "q ⟶ r" using assms(1,2) ..
  then show "¬q" using assms(3) by (rule mt)
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_5_3:
  assumes "p ⟶ (q ⟶ r)"
          "p"
          "¬r" 
  shows   "¬q"
  using assms
  by simp

lemma ejemplo_5_4: 
  "⟦p ⟶ (q ⟶ r); p; ¬r ⟧ ⟹ ¬q"
  by simp

subsection ‹Ejemplo 6›

text ‹Ejemplo 6. (p. 7) Demostrar 
     ¬p ⟶ q, ¬q ⊢ p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_6: 
  "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
  apply (drule mt)
   apply assumption
  apply (erule notnotD)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_6_1:
  assumes 1: "¬p ⟶ q" and 
          2: "¬q" 
  shows "p"
proof -
  have 3: "¬¬p" using 1 2 by (rule mt)
  show "p" using 3 by (rule notnotD)
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_6_2:
  assumes "¬p ⟶ q"
          "¬q" 
  shows   "p"
proof -
  have "¬¬p" using assms(1,2) by (rule mt)
  then show "p" by (rule notnotD)
qed

subsubsection ‹Demostración automática›

lemma ejemplo_6_3:
  "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
  by simp

subsection ‹Ejemplo 7›

text ‹Ejemplo 7. (p. 7) Demostrar
     p ⟶ ¬q, q ⊢ ¬p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_7: 
  "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"  
  apply (erule mt)
  apply (erule notnotI)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_7_1:
  assumes 1: "p ⟶ ¬q" and 
          2: "q" 
  shows "¬p"
proof -
  have 3: "¬¬q" using 2 by (rule notnotI)
  show "¬p" using 1 3 by (rule mt)
qed

lemma ejemplo_7_2:
  assumes "p ⟶ ¬q"
          "q" 
  shows   "¬p"
proof -
  have "¬¬q" using assms(2) by (rule notnotI)
  with assms(1) show "¬p" by (rule mt)
qed

subsubsection ‹Demostración automática›

lemma ejemplo_7_3:
  "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"
  by simp

section ‹Regla de introducción del condicional›

text ‹La regla de introducción del condicional es
  · impI: (P ⟹ Q) ⟹ P ⟶ Q ›

subsection ‹Ejemplo 8›

text ‹Ejemplo 8. (p. 8) Demostrar
     p ⟶ q ⊢ ¬q ⟶ ¬p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_8: 
  "p ⟶ q ⟹ ¬q ⟶ ¬p"
  apply (rule impI)
  apply (erule mt)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_8_1:
  assumes 1: "p ⟶ q" 
  shows "¬q ⟶ ¬p"
proof -
  { assume 2: "¬q"
    have "¬p" using 1 2 by (rule mt) } 
  then show "¬q ⟶ ¬p" by (rule impI)
qed    

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "{ ... }" para representar una caja.›

subsubsection ‹Demostración estructurada›

lemma ejemplo_8_2:
  assumes "p ⟶ q" 
  shows "¬q ⟶ ¬p"
proof 
  assume "¬q"
  with assms show "¬p" by (rule mt)
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_8_3:
  assumes "p ⟶ q" 
  shows "¬q ⟶ ¬p"
  using assms
  by auto

subsection ‹Ejemplo 9›

text ‹Ejemplo 9. (p. 9) Demostrar
     ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_9: 
  "¬q ⟶ ¬p ⟹ p ⟶ ¬¬q"  
  apply (rule impI)
  apply (erule mt)
  apply (erule notnotI)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_9_1: 
  assumes 1: "¬q ⟶ ¬p" 
  shows "p ⟶ ¬¬q"   
proof -
  { assume 2: "p"
    have 3: "¬¬p" using 2 by (rule notnotI)
    have "¬¬q" using 1 3 by (rule mt) } 
  then show "p ⟶ ¬¬q" by (rule impI)
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_9_2:
  assumes "¬q ⟶ ¬p" 
  shows    "p ⟶ ¬¬q"   
proof 
  assume "p"
  then have "¬¬p" by (rule notnotI)
  with assms show "¬¬q" by (rule mt)
qed

subsubsection ‹Demostración automática›

lemma ejemplo_9_3:
  assumes "¬q ⟶ ¬p" 
  shows "p ⟶ ¬¬q"   
  using assms
  by auto 

subsection ‹Ejemplo 10›

text ‹Ejemplo 10 (p. 9). Demostrar
     ⊢ p ⟶ p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_10: 
  "p ⟶ p"
  apply (rule impI)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_10_1:
  "p ⟶ p"
proof -
  { assume 1: "p"
    have "p" using 1 by this }
  then show "p ⟶ p" by (rule impI) 
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_10_2:
  "p ⟶ p"
proof (rule impI)
qed

subsubsection ‹Demostración automática›

lemma ejemplo_10_3:
  "p ⟶ p"
  by simp 

subsection ‹Ejemplo 11›

text ‹Ejemplo 11 (p. 10) Demostrar
     ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_11:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"  
  apply (rule impI)+  
  apply (erule mp)
  apply (drule mt)
   apply (erule notnotI)
  apply (erule notnotD)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_11_1:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
proof -
  { assume 1: "q ⟶ r"
    { assume 2: "¬q ⟶ ¬p"
      { assume 3: "p"
        have 4: "¬¬p" using 3 by (rule notnotI)
        have 5: "¬¬q" using 2 4 by (rule mt)
        have 6: "q" using 5 by (rule notnotD)
        have "r" using 1 6 by (rule mp) } 
      then have "p ⟶ r" by (rule impI) } 
    then have "(¬q ⟶ ¬p) ⟶ p ⟶ r" by (rule impI) } 
  then show "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)" by (rule impI)
qed

― ‹La demostración hacia atrás es›
lemma ejemplo_11_2:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
proof (rule impI)
  assume 1: "q ⟶ r"
  show "(¬q ⟶ ¬p) ⟶ (p ⟶ r)"
  proof (rule impI)
    assume 2: "¬q ⟶ ¬p"
    show "p ⟶ r"
    proof (rule impI)
      assume 3: "p"
      have 4: "¬¬p" using 3 by (rule notnotI)
      have 5: "¬¬q" using 2 4 by (rule mt)
      have 6: "q" using 5 by (rule notnotD)
      show "r" using 1 6 by (rule mp)
    qed
  qed
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_11_3:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
proof
  assume 1: "q ⟶ r"
  show "(¬q ⟶ ¬p) ⟶ (p ⟶ r)"
  proof
    assume 2: "¬q ⟶ ¬p"
    show "p ⟶ r"
    proof
      assume 3: "p"
      have 4: "¬¬p" using 3 ..
      have 5: "¬¬q" using 2 4 by (rule mt)
      have 6: "q" using 5 by (rule notnotD)
      show "r" using 1 6 ..
    qed
  qed
qed

― ‹La demostración sin etiquetas es› 
lemma ejemplo_11_4:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
proof
  assume "q ⟶ r"
  show "(¬q ⟶ ¬p) ⟶ (p ⟶ r)"
  proof
    assume "¬q ⟶ ¬p"
    show "p ⟶ r"
    proof
      assume "p"
      then have "¬¬p" ..
      with ‹¬q ⟶ ¬p› have "¬¬q" by (rule mt)
      then have "q" by (rule notnotD)
      with ‹q ⟶ r› show "r" ..
    qed
  qed
qed

subsubsection ‹Demostración automática›

lemma ejemplo_11_5:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
  by auto

section ‹Reglas de la disyunción›

text ‹Las reglas de la introducción de la disyunción son
  · disjI1: P ⟹ P ∨ Q
  · disjI2: Q ⟹ P ∨ Q
  La regla de elimación de la disyunción es
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R  ›

subsection ‹Ejemplo 12›

text ‹Ejemplo 12 (p. 11). Demostrar
     p ∨ q ⊢ q ∨ p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_12: 
  "p ∨ q ⟹ q ∨ p"  
  apply (erule disjE)
   apply (erule disjI2)
   apply (erule disjI1)
  done

subsubsection ‹Demostración detallada›

― ‹La demostración detallada es›
lemma ejemplo_12_1:
  assumes "p ∨ q" 
  shows "q ∨ p"
proof -
  have "p ∨ q" using assms by this
  moreover
  { assume 2: "p"
    have "q ∨ p" using 2 by (rule disjI2) }
  moreover
  { assume 3: "q"
    have "q ∨ p" using 3 by (rule disjI1) }
  ultimately show "q ∨ p" by (rule disjE) 
qed    

text ‹
  Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "moreover" para separar los bloques y
  · "ultimately" para unir los resultados de los bloques.›

subsubsection ‹Demostración estructurada›

― ‹La demostración detallada con reglas implícitas es›
lemma ejemplo_12_2:
  assumes "p ∨ q" 
  shows "q ∨ p"
proof -
  note ‹p ∨ q›
  moreover
  { assume "p"
    then have "q ∨ p" .. }
  moreover
  { assume "q"
    then have "q ∨ p" .. }
  ultimately show "q ∨ p" ..
qed    

text ‹Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "note" para copiar un hecho.›

subsubsection ‹Demostración detallada hacia atrás›

lemma ejemplo_12_3:
  assumes 1: "p ∨ q" 
  shows "q ∨ p"
using 1
proof (rule disjE)
  { assume 2: "p"
    show "q ∨ p" using 2 by (rule disjI2) }
next
  { assume 3: "q"
    show "q ∨ p" using 3 by (rule disjI1) }
qed    

subsubsection ‹Demostración estructurada hacia atrás›

lemma ejemplo_12_4:
  assumes "p ∨ q" 
  shows "q ∨ p"
using assms
proof 
  { assume  "p"
    then show "q ∨ p" .. }
next
  { assume "q"
    then show "q ∨ p" .. }
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_12_5:
  assumes "p ∨ q" 
  shows "q ∨ p"
  using assms
  by auto

subsection ‹Ejemplo 13›

text ‹Ejemplo 13. (p. 12) Demostrar
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_13: 
  "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r"  
  apply (rule impI)
  apply (erule disjE)
   apply (erule disjI1)
  apply (drule mp)
   apply assumption
  apply (erule disjI2)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_13_1:
  assumes 1: "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
proof (rule impI)
  assume 2: "p ∨ q"
  then show "p ∨ r"
  proof (rule disjE)
    { assume 3: "p"
      show "p ∨ r" using 3 by (rule disjI1) }
  next
    { assume 4: "q"
      have 5: "r" using 1 4 by (rule mp)
      show "p ∨ r" using 5 by (rule disjI2) }
  qed
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_13_2:
  assumes "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
proof 
  assume "p ∨ q"
  then show "p ∨ r"
  proof 
    { assume "p"
      then show "p ∨ r" .. }
  next
    { assume "q"
      have "r" using assms ‹q› ..
      then show "p ∨ r" .. }
  qed
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_13_3:
  assumes "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
  using assms
  by auto

section ‹Regla de copia›

subsection ‹Ejemplo 14›

text ‹Ejemplo 14 (p. 13). Demostrar
     ⊢ p ⟶ (q ⟶ p) ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_14: 
  "p ⟶ (q ⟶ p)"  
  apply (rule impI)+
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_14_1:
  "p ⟶ (q ⟶ p)"
proof (rule impI)
  assume 1: "p"
  show "q ⟶ p" 
  proof (rule impI)
    assume "q"
    show "p" using 1 by this
  qed
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_14_2:
  "p ⟶ (q ⟶ p)"
proof 
  assume "p"
  then show "q ⟶ p" ..
qed

subsubsection ‹Demostración automática›

lemma ejemplo_14_3:
  "p ⟶ (q ⟶ p)"
  by simp 

section ‹Reglas de la negación›

text ‹La regla de eliminación de lo falso es
  · FalseE: False ⟹ P
  La regla de eliminación de la negación es
  · notE: ⟦¬P; P⟧ ⟹ R
  La regla de introducción de la negación es
  · notI: (P ⟹ False) ⟹ ¬P ›

subsection ‹Ejemplo 15›

text ‹Ejemplo 15 (p. 15). Demostrar
     ¬p ∨ q ⊢ p ⟶ q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_15: 
  "¬p ∨ q ⟹ p ⟶ q"  
  apply (rule impI)
  apply (erule disjE)
   apply (erule notE)
   apply assumption+
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_15_1:
  assumes 1: "¬p ∨ q" 
  shows "p ⟶ q"
proof (rule impI)
  assume 2: "p"
  note 1
  then show "q"
  proof (rule disjE)
    { assume 3: "¬p"
      show "q" using 3 2 by (rule notE) }
  next
    { assume 4: "q"
      show "q" using 4 by this}
  qed
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_15_2:
  assumes "¬p ∨ q" 
  shows "p ⟶ q"
proof 
  assume "p"
  note ‹¬p ∨ q›
  then show "q"
  proof
    assume "¬p"
    then show "q" using ‹p› .. 
  next
    assume "q"
      then show "q" .
  qed
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_15_3:
  assumes "¬p ∨ q" 
  shows "p ⟶ q"
  using assms
  by auto

subsection ‹Ejemplo 16›

text ‹Ejemplo 16 (p. 16). Demostrar
     p ⟶ q, p ⟶ ¬q ⊢ ¬p ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_16: 
  "⟦p ⟶ q; p ⟶ ¬q⟧ ⟹ ¬p"  
  apply (rule notI)
  apply (drule mp)+
    apply assumption+
  apply (drule mp)
   apply assumption
  apply (erule notE)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_16_1:
  assumes 1: "p ⟶ q" and 
          2: "p ⟶ ¬q" 
  shows "¬p"    
proof (rule notI)
  assume 3: "p"
  have 4: "q" using 1 3 by (rule mp)
  have 5: "¬q" using 2 3 by (rule mp)
  show False using 5 4 by (rule notE)
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_16_2:
  assumes "p ⟶ q"
          "p ⟶ ¬q" 
  shows "¬p"    
proof 
  assume "p"
  have "q" using assms(1) ‹p› ..
  have "¬q" using assms(2) ‹p› ..
  then show False using ‹q› ..
qed

subsubsection ‹Demostración automática›

lemma ejemplo_16_3:
  assumes "p ⟶ q"
          "p ⟶ ¬q" 
  shows "¬p"    
  using assms
  by simp 

section ‹Reglas del bicondicional›

text ‹La regla de introducción del bicondicional es
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P ⟷ Q
  Las reglas de eliminación del bicondicional son
  · iffD1: ⟦Q ⟷ P; Q⟧ ⟹ P 
  · iffD2: ⟦P ⟷ Q; Q⟧ ⟹ P ›

subsection ‹Ejemplo 17›

text ‹Ejemplo 17 (p. 17) Demostrar
     (p ∧ q) ⟷ (q ∧ p) ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_17_4: 
  "(p ∧ q) ⟷ (q ∧ p)"  
  apply (rule iffI)
   apply (rule conjI)
    apply (erule conjunct2)
   apply (erule conjunct1)
    apply (rule conjI)
    apply (erule conjunct2)
  apply (erule conjunct1)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_17_1:
  "(p ∧ q) ⟷ (q ∧ p)" 
proof (rule iffI)
  { assume 1: "p ∧ q"
    have 2: "p" using 1 by (rule conjunct1)
    have 3: "q" using 1 by (rule conjunct2)
    show "q ∧ p" using 3 2 by (rule conjI) }
next
  { assume 4: "q ∧ p"
    have 5: "q" using 4 by (rule conjunct1)
    have 6: "p" using 4 by (rule conjunct2)
    show "p ∧ q" using 6 5 by (rule conjI) }
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_17_2:
  "(p ∧ q) ⟷ (q ∧ p)"
proof 
  { assume 1: "p ∧ q"
    have "p" using 1 ..
    have "q" using 1 ..
    show "q ∧ p" using ‹q› ‹p› .. }
next
  { assume 2: "q ∧ p"
    have "q" using 2 ..
    have "p" using 2 ..
    show "p ∧ q" using ‹p› ‹q›  .. }
qed

subsubsection ‹Demostración automática›

lemma ejemplo_17_3:
  "(p ∧ q) ⟷ (q ∧ p)"
  by auto

subsection ‹Ejemplo 18›

text ‹Ejemplo 18 (p. 18). Demostrar
     p ⟷ q, p ∨ q ⊢ p ∧ q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_18_4: 
  "⟦p ⟷ q; p ∨ q⟧ ⟹ p ∧ q"  
  apply (erule disjE)
   apply (rule conjI)
    apply assumption
   apply (erule iffD1)
   apply assumption
  apply (rule conjI)
   apply (erule iffD2)
   apply assumption+
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_18_1:
  assumes 1: "p ⟷ q" and 
          2: "p ∨ q"  
  shows "p ∧ q"
using 2
proof (rule disjE)
  { assume 3: "p"
    have 4: "q" using 1 3 by (rule iffD1)
    show "p ∧ q" using 3 4 by (rule conjI) }
next
  { assume 5: "q"
    have 6: "p" using 1 5 by (rule iffD2)
    show "p ∧ q" using 6 5 by (rule conjI) }
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_18_2:
  assumes "p ⟷ q"
          "p ∨ q"  
  shows  "p ∧ q"
using assms(2)
proof
  { assume "p"
    with assms(1) have "q" ..
    with ‹p› show "p ∧ q" .. }
next
  { assume "q"
    with assms(1) have "p" ..
    then show "p ∧ q" using ‹q› .. }
qed

subsubsection ‹Demostración automática›

lemma ejemplo_18_3:
  assumes "p ⟷ q"
          "p ∨ q"  
  shows "p ∧ q"
  using assms
  by simp 

section ‹Reglas derivadas›

subsection ‹Regla del modus tollens›

text ‹Ejemplo 19 (p. 20) Demostrar la regla del modus tollens a partir 
  de las reglas básicas.›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_20: 
  "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"  
  apply (rule notI)
  apply (drule mp)
   apply assumption
  apply (erule notE)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_20_1:
  assumes 1: "F ⟶ G" and 
          2: "¬G" 
  shows "¬F"
proof (rule notI)
  assume 3: "F"
  have 4: "G" using 1 3 by (rule mp)
  show False using 2 4 by (rule notE)
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_20_2:
  assumes "F ⟶ G"
          "¬G" 
  shows   "¬F"
proof 
  assume "F"
  with assms(1) have "G" ..
  with assms(2) show False ..
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_20_3:
  assumes "F ⟶ G"
          "¬G" 
  shows "¬F"
  using assms
  by simp 

subsection ‹Regla de la introducción de la doble negación›

text ‹Ejemplo 21 (p. 21) Demostrar la regla de introducción de la doble
  negación a partir de las reglas básicas.›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_21: 
  "F ⟹ ¬¬F"  
  apply (rule notI)
  apply (erule notE)
  apply assumption
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_21_1:
  assumes 1: "F" 
  shows "¬¬F"
proof (rule notI)
  assume 2: "¬F"
  show False using 2 1 by (rule notE)
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_21_2:
  assumes "F" 
  shows "¬¬F"
proof 
  assume "¬F"
  then show False using assms ..
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_21_3:
  assumes "F" 
  shows "¬¬F"
  using assms
  by simp 

subsection ‹Regla de reducción al absurdo›

text ‹La regla de reducción al absurdo en Isabelle se correponde con la
  regla clásica de contradicción 
  · ccontr: (¬P ⟹ False) ⟹ P ›

subsection ‹Ley del tercio excluso›

text ‹La ley del tercio excluso es 
  · excluded_middle: ¬P ∨ P ›

text ‹Ejemplo 22 (p. 23). Demostrar la ley del tercio excluso a partir de
  las reglas básicas.›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_22:
  "F ∨ ¬F"
  apply (rule ccontr)
  apply (rule_tac P="F" in notE)
   apply (rule notI)
   apply (erule notE)
   apply (erule disjI1)
  apply (rule notnotD)
  apply (rule notI)
  apply (erule notE)
  apply (erule disjI2)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_22_1:
  "F ∨ ¬F"
proof (rule ccontr)
  assume 1: "¬(F ∨ ¬F)"
  then show False
  proof (rule notE)
    show "F ∨ ¬F"
    proof (rule disjI2)
      show "¬F"
      proof (rule notI)
        assume 2: "F"
        then have 3: "F ∨ ¬F" by (rule disjI1)
        show False using 1 3 by (rule notE)
      qed
    qed
  qed
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_22_2:
  "F ∨ ¬F"
proof (rule ccontr)
  assume "¬(F ∨ ¬F)"
  then show False
  proof (rule notE)
    show "F ∨ ¬F"
    proof (rule disjI2)
      show "¬F"
      proof (rule notI)
        assume "F"
        then have "F ∨ ¬F" ..
        with ‹¬(F ∨ ¬F)› show False ..
      qed
    qed
  qed
qed

subsubsection ‹Demostración automática›

lemma ejemplo_22_3:
  "F ∨ ¬F"
  by simp 

subsection ‹Ejemplo 23›

text ‹Ejemplo 23 (p. 24). Demostrar
     p ⟶ q ⊢ ¬p ∨ q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_23: 
  "p ⟶ q ⟹ ¬p ∨ q"
  apply (cut_tac P="p" in excluded_middle)
  apply (erule disjE)
   apply (erule disjI1)
  apply (drule mp)
   apply assumption
  apply (erule disjI2)
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_23_1:
  assumes 1: "p ⟶ q" 
  shows "¬p ∨ q"
proof -
  have "¬p ∨ p" by (rule excluded_middle)
  then show "¬p ∨ q"
  proof (rule disjE)
    { assume "¬p"
      then show "¬p ∨ q" by (rule disjI1) }
  next
    { assume 2: "p"
      have "q" using 1 2 by (rule mp)
      then show "¬p ∨ q" by (rule disjI2) }
  qed
qed    

subsubsection ‹Demostración estructurada›

lemma ejemplo_23_2:
  assumes "p ⟶ q" 
  shows "¬p ∨ q"
proof -
  have "¬p ∨ p" ..
  then show "¬p ∨ q"
  proof 
    { assume "¬p"
      then show "¬p ∨ q" .. }
  next
    { assume "p"
      with assms have "q" ..
      then show "¬p ∨ q" .. }
  qed
qed    

subsubsection ‹Demostración automática›

lemma ejemplo_23_3:
  assumes "p ⟶ q" 
  shows "¬p ∨ q"
  using assms
  by simp 

section ‹Demostraciones por contradicción›

subsection ‹Ejemplo 24›

text ‹Ejemplo 24. Demostrar que 
     ¬p, p ∨ q ⊢ q ›

subsubsection ‹Demostración aplicativa›

lemma ejemplo_24_4: 
  "⟦¬p ; p ∨ q⟧ ⟹ q"  
  apply (erule disjE)
   apply (erule notE)
   apply assumption+
  done

subsubsection ‹Demostración detallada›

lemma ejemplo_24_1:
  assumes "¬p"
          "p ∨ q"
  shows   "q"
using ‹p ∨ q›
proof (rule disjE)
  assume "p"
  with assms(1) show "q" by contradiction 
next
  assume "q"
  then show "q" by assumption
qed

subsubsection ‹Demostración estructurada›

lemma ejemplo_24_2:
  assumes "¬p"
          "p ∨ q"
  shows "q"
using ‹p ∨ q›
proof 
  assume "p"
  with assms(1) show "q" ..
next
  assume "q"
  then show "q" .
qed

subsubsection ‹Demostración automática›

lemma ejemplo_24_3:
  assumes "¬p"
          "p ∨ q"
  shows "q"
  using assms
  by simp 

end