Acciones

Tema 7b: Deducción natural proposicional con Isabelle/HOL

De Razonamiento automático (2018-19)

chapter {* Tema 7b: Deducción natural proposicional con Isabelle/HOL *}

theory T7b_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. *}

subsection {* Reglas de la conjunción *}

text {* 
  Ejemplo 1 (p. 4). Demostrar que
     p ∧ q, r ⊢ q ∧ r.
  *}     

 La demostración detallada es
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.

  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  
*}

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) ..
  thus "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
  · "thus" para demostrar la conclusión usando el hecho anterior.
  Además, no es necesario usar and entre las hipótesis. *}

text {* Se puede automatizar la demostración como sigue *}
  
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. *}

text {* Se puede automatizar totalmente la demostración como sigue *}

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" 
      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. *}

text {* Se pueden dejar implícitas las reglas como sigue *}

lemma ejemplo_1_7:
  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. *}

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

text {*
  Ejemplo 2. (p. 5)
       p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r
*}

 La demostración detallada es
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        

 La demostración estructurada es
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)
  hence "r" ..
  with `¬¬p` show  "¬¬p ∧ r" ..
qed        

text {*
  Nota sobre el lenguaje: En la demostración anterior se ha usado
  · "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
    hecho P se demuestra Q. *}

 La demostración automática es
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" 
          "¬¬(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) 
  thus "r" by (rule conjunct2)
qed 

text {* Se puede eliminar las reglas en la demostración anterior, como
  sigue: *}

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

subsection {* 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 
*}

text {* 
  Ejemplo 3. (p. 6) Demostrar que
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p
*}

 La demostración detallada es
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    

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

 La demostración automática es
lemma ejemplo_3_3:
  assumes "¬p ∧ q"
          "¬p ∧ q ⟶ r ∨ ¬p" 
  shows   "r ∨ ¬p"
using assms
by auto

text {* 
  Ejemplo 4 (p. 6) Demostrar que
     p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r
 *}

 La demostración detallada es
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

 La demostración estructurada es
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) ..
  thus "r" using `q` ..
qed

 La demostración automática es
lemma ejemplo_4_3:
  "⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r"
by auto

subsection {* 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 auto

text {*
  Ejemplo 5 (p. 7). Demostrar
     p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q
 *}

 La demostración detallada es
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    

 La demostración estructurada es
lemma ejemplo_5_2:
  assumes "p ⟶ (q ⟶ r)"
          "p"
          "¬r" 
  shows   "¬q"
proof -
  have "q ⟶ r" using assms(1,2) ..
  thus "¬q" using assms(3) by (rule mt)
qed    

 La demostración automática es
lemma ejemplo_5_3:
  assumes "p ⟶ (q ⟶ r)"
          "p"
          "¬r" 
  shows   "¬q"
using assms
by auto

text {* 
  Ejemplo 6. (p. 7) Demostrar 
     ¬p ⟶ q, ¬q ⊢ p
*}

 La demostración detallada es
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

 La demostración estructurada es
lemma ejemplo_6_2:
  assumes "¬p ⟶ q"
          "¬q" 
  shows   "p"
proof -
  have "¬¬p" using assms(1,2) by (rule mt)
  thus "p" by (rule notnotD)
qed

 La demostración automática es
lemma ejemplo_6_3:
  "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
by auto

text {* 
  Ejemplo 7. (p. 7) Demostrar
     p ⟶ ¬q, q ⊢ ¬p
  *}

 La demostración detallada es
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

 La demostración detallada es
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

 La demostración estructurada es
lemma ejemplo_7_3:
  "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"
by auto

subsection {* Regla de introducción del condicional *}

text {*
  La regla de introducción del condicional es
  · impI: (P ⟹ Q) ⟹ P ⟶ Q
*}

text {* 
  Ejemplo 8. (p. 8) Demostrar
     p ⟶ q ⊢ ¬q ⟶ ¬p
*}

 La demostración detallada es
lemma ejemplo_8_1:
  assumes 1: "p ⟶ q" 
  shows "¬q ⟶ ¬p"
proof -
  { assume 2: "¬q"
    have "¬p" using 1 2 by (rule mt) } 
  thus "¬q ⟶ ¬p" by (rule impI)
qed    

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

 La demostración estructurada es
lemma ejemplo_8_2:
  assumes "p ⟶ q" 
  shows "¬q ⟶ ¬p"
proof 
  assume "¬q"
  with assms show "¬p" by (rule mt)
qed    

 La demostración automática es
lemma ejemplo_8_3:
  assumes "p ⟶ q" 
  shows "¬q ⟶ ¬p"
using assms
by auto

text {* 
  Ejemplo 9. (p. 9) Demostrar
     ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q
*}

 La demostración detallada es
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) } 
  thus "p ⟶ ¬¬q" by (rule impI)
qed

 La demostración estructurada es
lemma ejemplo_9_2:
  assumes "¬q ⟶ ¬p" 
  shows    "p ⟶ ¬¬q"   
proof 
  assume "p"
  hence "¬¬p" by (rule notnotI)
  with assms show "¬¬q" by (rule mt)
qed

 La demostración automática es
lemma ejemplo_9_3:
  assumes "¬q ⟶ ¬p" 
  shows "p ⟶ ¬¬q"   
using assms
by auto

text {* 
  Ejemplo 10 (p. 9). Demostrar
     ⊢ p ⟶ p
*}

 La demostración detallada es
lemma ejemplo_10_1:
  "p ⟶ p"
proof -
  { assume 1: "p"
    have "p" using 1 by this }
  thus "p ⟶ p" by (rule impI) 
qed

 La demostración estructurada es
lemma ejemplo_10_2:
  "p ⟶ p"
proof (rule impI)
qed

 La demostración automática es
lemma ejemplo_10_3:
  "p ⟶ p"
by auto

text {*
  Ejemplo 11 (p. 10) Demostrar
     ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))
 *}

 La demostración detallada es
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) } 
      hence "p ⟶ r" by (rule impI) } 
    hence "(¬q ⟶ ¬p) ⟶ p ⟶ r" by (rule impI) } 
  thus "(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

 La demostración hacia atrás con reglas implícitas es
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"
      hence "¬¬p" ..
      with `¬q ⟶ ¬p` have "¬¬q" by (rule mt)
      hence "q" by (rule notnotD)
      with `q ⟶ r` show "r" ..
    qed
  qed
qed

 La demostración automática es
lemma ejemplo_11_5:
  "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
by auto

subsection {* 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 
*}

text {* 
  Ejemplo 12 (p. 11). Demostrar
     p ∨ q ⊢ q ∨ p
*}

 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. *}
 
 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"
    hence "q ∨ p" .. }
  moreover
  { assume "q"
    hence "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. *}

 La demostración hacia atrás es
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    

 La demostración hacia atrás con reglas implícitas es
lemma ejemplo_12_4:
  assumes "p ∨ q" 
  shows "q ∨ p"
using assms
proof 
  { assume  "p"
    thus "q ∨ p" .. }
next
  { assume "q"
    thus "q ∨ p" .. }
qed    

 La demostración automática es
lemma ejemplo_12_5:
  assumes "p ∨ q" 
  shows "q ∨ p"
using assms
by auto

text {* 
  Ejemplo 13. (p. 12) Demostrar
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r
*}

 La demostración detallada es 
lemma ejemplo_13_1:
  assumes 1: "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
proof (rule impI)
  assume 2: "p ∨ q"
  thus "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    

 La demostración estructurada es 
lemma ejemplo_13_2:
  assumes "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
proof 
  assume "p ∨ q"
  thus "p ∨ r"
  proof 
    { assume "p"
      thus "p ∨ r" .. }
  next
    { assume "q"
      have "r" using assms `q` ..
      thus "p ∨ r" .. }
  qed
qed    

 La demostración automática es 
lemma ejemplo_13_3:
  assumes "q ⟶ r"
  shows "p ∨ q ⟶ p ∨ r"
using assms
by auto

subsection {* Regla de copia *}

text {* 
  Ejemplo 14 (p. 13). Demostrar
     ⊢ p ⟶ (q ⟶ p)
*}

 La demostración detallada es
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

 La demostración estructurada es
lemma ejemplo_14_2:
  "p ⟶ (q ⟶ p)"
proof 
  assume "p"
  thus "q ⟶ p" ..
qed

 La demostración automática es
lemma ejemplo_14_3:
  "p ⟶ (q ⟶ p)"
by auto

subsection {* 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
*}

text {*
  Ejemplo 15 (p. 15). Demostrar
     ¬p ∨ q ⊢ p ⟶ q
*}

 La demostración detallada es
lemma ejemplo_15_1:
  assumes 1: "¬p ∨ q" 
  shows "p ⟶ q"
proof (rule impI)
  assume 2: "p"
  note 1
  thus "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    

 La demostración estructurada es
lemma ejemplo_15_2:
  assumes "¬p ∨ q" 
  shows "p ⟶ q"
proof 
  assume "p"
  note `¬p ∨ q`
  thus "q"
  proof
    assume "¬p"
    thus "q" using `p` .. 
  next
    assume "q"
      thus "q" .
  qed
qed    

 La demostración automática es
lemma ejemplo_15_3:
  assumes "¬p ∨ q" 
  shows "p ⟶ q"
using assms
by auto

text {* 
  Ejemplo 16 (p. 16). Demostrar
     p ⟶ q, p ⟶ ¬q ⊢ ¬p
*}

 La demostración detallada es
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

 La demostración estructurada es
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` ..
  thus False using `q` ..
qed

 La demostración automática es
lemma ejemplo_16_3:
  assumes "p ⟶ q"
          "p ⟶ ¬q" 
  shows "¬p"    
using assms
by auto

subsection {* 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
*}

text {* 
  Ejemplo 17 (p. 17) Demostrar
     (p ∧ q) ⟷ (q ∧ p)
*}

 La demostración detallada es
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

 La demostración estructurada es
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

 La demostración automática es
lemma ejemplo_17_3:
  "(p ∧ q) ⟷ (q ∧ p)"
by auto

text {*
  Ejemplo 18 (p. 18). Demostrar
     p ⟷ q, p ∨ q ⊢ p ∧ q
*}

 La demostración detallada es
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

 La demostración estructurada es
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" ..
    thus "p ∧ q" using `q` .. }
qed

 La demostración automática es
lemma ejemplo_18_3:
  assumes "p ⟷ q"
          "p ∨ q"  
  shows "p ∧ q"
using assms
by auto

subsection {* Reglas derivadas *}

subsubsection {* Regla del modus tollens *}

text {* 
  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:
  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    

 La demostración estructurada es
lemma ejemplo_20_2:
  assumes "F ⟶ G"
          "¬G" 
  shows   "¬F"
proof 
  assume "F"
  with assms(1) have "G" ..
  with assms(2) show False ..
qed    

 La demostración automática es
lemma ejemplo_20_3:
  assumes "F ⟶ G"
          "¬G" 
  shows "¬F"
using assms
by auto

subsubsection {* 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.
*}

 La demostración detallada es
lemma ejemplo_21_1:
  assumes 1: "F" 
  shows "¬¬F"
proof (rule notI)
  assume 2: "¬F"
  show False using 2 1 by (rule notE)
qed    

 La demostración estructurada es
lemma ejemplo_21_2:
  assumes "F" 
  shows "¬¬F"
proof 
  assume "¬F"
  thus False using assms ..
qed    

 La demostración automática es
lemma ejemplo_21_3:
  assumes "F" 
  shows "¬¬F"
using assms
by auto

subsubsection {* 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
*}

subsubsection {* 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.  
*}

 La demostración detallada es
lemma ejemplo_22_1:
  "F ∨ ¬F"
proof (rule ccontr)
  assume 1: "¬(F ∨ ¬F)"
  thus False
  proof (rule notE)
    show "F ∨ ¬F"
    proof (rule disjI2)
      show "¬F"
      proof (rule notI)
        assume 2: "F"
        hence 3: "F ∨ ¬F" by (rule disjI1)
        show False using 1 3 by (rule notE)
      qed
    qed
  qed
qed
    
 La demostración estructurada es
lemma ejemplo_22_2:
  "F ∨ ¬F"
proof (rule ccontr)
  assume "¬(F ∨ ¬F)"
  thus False
  proof (rule notE)
    show "F ∨ ¬F"
    proof (rule disjI2)
      show "¬F"
      proof (rule notI)
        assume "F"
        hence "F ∨ ¬F" ..
        with `¬(F ∨ ¬F)`show False ..
      qed
    qed
  qed
qed
    
 La demostración automática es
lemma ejemplo_22_3:
  "F ∨ ¬F"
using assms
by auto

text {* 
  Ejemplo 23 (p. 24). Demostrar
     p ⟶ q ⊢ ¬p ∨ q
*}

 La demostración detallada es
lemma ejemplo_23_1:
  assumes 1: "p ⟶ q" 
  shows "¬p ∨ q"
proof -
  have "¬p ∨ p" by (rule excluded_middle)
  thus "¬p ∨ q"
  proof (rule disjE)
    { assume "¬p"
      thus "¬p ∨ q" by (rule disjI1) }
  next
    { assume 2: "p"
      have "q" using 1 2 by (rule mp)
      thus "¬p ∨ q" by (rule disjI2) }
  qed
qed    

 La demostración estructurada es
lemma ejemplo_23_2:
  assumes "p ⟶ q" 
  shows "¬p ∨ q"
proof -
  have "¬p ∨ p" ..
  thus "¬p ∨ q"
  proof 
    { assume "¬p"
      thus "¬p ∨ q" .. }
  next
    { assume "p"
      with assms have "q" ..
      thus "¬p ∨ q" .. }
  qed
qed    

 La demostración automática es
lemma ejemplo_23_3:
  assumes "p ⟶ q" 
  shows "¬p ∨ q"
using assms
by auto

subsection {* Demostraciones por contradicción *}

text {* 
  Ejemplo 24. Demostrar que 
     ¬p, p ∨ q ⊢ q
*}

 La demostración detallada es
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"
  thus "q" by assumption
qed

 La demostración estructurada es
lemma ejemplo_24_2:
  assumes "¬p"
          "p ∨ q"
  shows "q"
using `p ∨ q`
proof 
  assume "p"
  with assms(1) show "q" ..
next
  assume "q"
  thus "q" .
qed

 La demostración automática es
lemma ejemplo_24_3:
  assumes "¬p"
          "p ∨ q"
  shows "q"
using assms
by auto

end