Acciones

Tema 1: Deducción natural proposicional con Isabelle/HOL

De DAO (Demostración asistida por ordenador)

header {* Tema 3: Deducción natural proposicional con Isabelle/HOL *}

theory T3 imports Main begin

text {*

 En esta sección 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
  • }

-- "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