theory T2b
imports Main
begin
section "Introducción"
subsection "Enunciado de teoremas"
theorem primerEjemplo: "(A ⟶ B) ∨ (B ⟶ A)"
oops
subsection "Demostración por asunción"
lemma "⟦A; B; C⟧ ⟹ B"
apply assumption
done
subsection "Ejemplo de aplicación de rule"
text {* 1º ejemplo de aplicación de rule *}
lemma "A ∧ B ⟹ B ∧ A"
apply (rule conjI)
oops
text {* 2º ejemplo de aplicación de rule *}
lemma "A ∧ B ⟹ B ∨ A"
apply (rule disjI1)
oops
lemma "⟦(A ∧ B) ∨ C; D⟧ ⟹ B ∨ C"
apply (rule disjE)
apply assumption
oops
subsection "Ejemplo de demostración con rule y assumption"
theorem K: "A ⟶ (B ⟶ A)"
apply (rule impI) (* da A ⟹ B ⟶ A *)
apply (rule impI) (* da ⟦A; B⟧ ⟹ A *)
apply assumption (* da No subgoals! *)
done
subsection "Ejemplo de derivación con hipótesis"
text {* Derivación de A, B ⊢ A ∧ (B ∧ A) *}
theorem "⟦A; B⟧ ⟹ A ∧ (B ∧ A)"
apply (rule conjI) (* da ⟦A; B⟧ ⟹ A
⟦A; B⟧ ⟹ B ∧ A *)
apply assumption (* da ⟦A; B⟧ ⟹ B ∧ A *)
apply (rule conjI) (* da ⟦A; B⟧ ⟹ B
⟦A; B⟧ ⟹ A *)
apply assumption (* da ⟦A; B⟧ ⟹ A *)
apply assumption (* da No subgoals *)
done
text {* La prueba anterior se puede simplificar usando assumption+ *}
theorem "⟦A; B⟧ ⟹ A ∧ (B ∧ A)"
apply (rule conjI) (* da ⟦A; B⟧ ⟹ A
⟦A; B⟧ ⟹ B ∧ A *)
apply assumption (* da ⟦A; B⟧ ⟹ B ∧ A *)
apply (rule conjI) (* da ⟦A; B⟧ ⟹ B
⟦A; B⟧ ⟹ A *)
apply assumption+ (* da No subgoals *)
done
subsection "Ejemplo de aplicación de erule"
lemma "⟦(A ∧ B) ∨ C; D⟧ ⟹ B ∨ C"
apply (erule disjE)
oops
text {* Demostración con erule *}
lemma "A ∨ B ⟹ B ∨ A"
apply (erule disjE) (* da A ⟹ B ∨ A
B ⟹ B ∨ A*)
apply (rule disjI2) (* da A ⟹ A
B ⟹ B ∨ A *)
apply assumption (* da B ⟹ B ∨ A *)
apply (rule disjI1) (* da B ⟹ B *)
apply assumption (* da No subgoals *)
done
text {* Variación de la demostración anterior cambiando erule por rule *}
lemma "A ∨ B ⟹ B ∨ A"
apply (rule disjE) (* da A ∨ B ⟹ ?P ∨ ?Q
⟦A ∨ B; ?P⟧ ⟹ B ∨ A
⟦A ∨ B; ?Q⟧ ⟹ B ∨ A *)
apply assumption (* da ⟦A ∨ B; A⟧ ⟹ B ∨ A
⟦A ∨ B; B⟧ ⟹ B ∨ A *)
apply (rule disjI2) (* da ⟦A ∨ B; A⟧ ⟹ A
⟦A ∨ B; B⟧ ⟹ B ∨ A*)
apply assumption (* da ⟦A ∨ B; B⟧ ⟹ B ∨ A *)
apply (rule disjI1) (* da ⟦A ∨ B; B⟧ ⟹ B *)
apply assumption (* da No subgoals! *)
done
subsection "Ejemplo de aplicación de drule"
lemma "⟦A ⟶ B; A ∧ C⟧ ⟹ B ∧ C"
apply (drule mp)
oops
text {* Demostración con drule *}
lemma "A ∧ B ⟹ A"
apply (drule conjunct1) (* da A ⟹ A *)
apply assumption (* da No subgoals! *)
done
subsection "Ejemplo de aplicación de frule"
lemma "⟦A ⟶ B; A ∧ C⟧ ⟹ B ∧ C"
apply (frule mp)
oops
text {* Demostración con frule *}
lemma "A ∧ B ⟹ A"
apply (frule conjunct1) (* da ⟦A ∧ B; A⟧ ⟹ A *)
apply assumption (* da No subgoals! *)
done
subsection "Ejemplo de aplicación de erule_tac"
lemma "⟦A ∧ B; C ∧ (B ∧ D)⟧ ⟹ B ∧ D"
apply (erule_tac Q="B ∧ D" in conjE)
apply assumption
done
lemma "⟦A ∧ B; C ∧ (B ∧ D)⟧ ⟹ B ∧ D"
apply (erule conjE)
oops
text {* Demostración con erule_tac *}
lemma "⟦A ∧ B; C ∧ D⟧ ⟹ D"
apply (erule_tac P=C in conjE) (* da ⟦A ∧ B; C; D⟧ ⟹ D *)
apply assumption (* da No subgoals! *)
done
text {* Demostración sin erule_tac *}
lemma "⟦A ∧ B; C ∧ D⟧ ⟹ D"
apply (erule conjE) (* da ⟦C ∧ D; A; B⟧ ⟹ D *)
apply (erule conjE) (* da ⟦A; B; C; D⟧ ⟹ D *)
apply assumption (* da No subgoals! *)
done
subsection "Cálculo de secuentes"
lemma "A ⟹ P ∧ Q"
apply (rule conjI)
oops
lemma "⟦A; P ∧ Q⟧ ⟹ R"
apply (erule conjE)
oops
lemma "A ⟹ P ∨ Q"
apply (rule disjI1)
oops
lemma "A ⟹ P ∨ Q"
apply (rule disjI2)
oops
lemma "⟦A; P ∨ Q⟧ ⟹ R"
apply (erule disjE)
oops
lemma "A ⟹ P ⟶ Q"
apply (rule impI)
oops
lemma "⟦A; P ⟶ Q⟧ ⟹ R"
apply (erule impE)
oops
lemma "⟦A; False⟧ ⟹ P"
apply (erule FalseE)
done
lemma "A ⟹ ¬P"
apply (rule notI)
oops
lemma "⟦A; P; ¬P⟧ ⟹ R"
apply (erule notE, assumption)
done
lemma "A ⟹ ¬P ∨ P"
apply (rule excluded_middle)
done
subsection "Ejemplos de pruebas"
lemma "((S ∨ R) ∧ ¬S) ⟶ R"
apply (rule impI) (* da (S ∨ R) ∧ ¬ S ⟹ R *)
apply (frule conjunct1) (* da ⟦(S ∨ R) ∧ ¬ S; S ∨ R⟧ ⟹ R *)
apply (erule disjE) (* da ⟦(S ∨ R) ∧ ¬ S; S⟧ ⟹ R
⟦(S ∨ R) ∧ ¬ S; R⟧ ⟹ R *)
apply (drule conjunct2) (* da ⟦S; ¬ S⟧ ⟹ R
⟦(S ∨ R) ∧ ¬ S; R⟧ ⟹ R *)
apply (erule notE) (* da S ⟹ S
⟦(S ∨ R) ∧ ¬ S; R⟧ ⟹ R *)
apply assumption+ (* da No subgoals! *)
done
lemma "(C ∨ P) ∧ (C ⟶ S) ∧ ¬P ⟶ S"
apply (rule impI) (* da (C ∨ P) ∧ (C ⟶ S) ∧ ¬ P ⟹ S *)
apply (erule conjE)+ (* da ⟦C ∨ P; C ⟶ S; ¬ P⟧ ⟹ S *)
apply (erule disjE) (* da ⟦C ⟶ S; ¬ P; C⟧ ⟹ S
⟦C ⟶ S; ¬ P; P⟧ ⟹ S *)
apply (erule impE) (* da ⟦¬ P; C⟧ ⟹ C
⟦¬ P; C; S⟧ ⟹ S
⟦C ⟶ S; ¬ P; P⟧ ⟹ S *)
apply assumption+ (* da ⟦C ⟶ S; ¬ P; P⟧ ⟹ S *)
apply (erule notE) (* da ⟦C ⟶ S; P⟧ ⟹ P *)
apply assumption (* da No subgoals! *)
done
subsection "La regla de corte"
lemma aux: "A ⟹ A ∨ B"
sorry
lemma "P ∧ Q ⟹ Q"
apply (cut_tac aux)
oops
lemma "¬(¬p ∧ ¬q) ⟹ p ∨ q"
apply (cut_tac P=p in excluded_middle)
apply (erule disjE)
apply (cut_tac P=q in excluded_middle)
apply (erule disjE)
apply (erule notE)
apply (rule conjI)
apply assumption+
apply (erule disjI2)
apply (erule disjI1)
done
text {* Ejemplo de case_tac *}
lemma "P ∧ Q ⟹ Q"
apply (case_tac "P") (* da ⟦P ∧ Q; P⟧ ⟹ Q
⟦P ∧ Q; ¬ P⟧ ⟹ Q *)
oops
text {* La demostración anterior usando case_tac *}
lemma "¬(¬p ∧ ¬q) ⟹ p ∨ q"
apply (case_tac p)
apply (erule disjI1)
apply (case_tac q)
apply (erule disjI2)
apply (erule notE)
apply (rule conjI)
apply assumption+
done
subsection "Ejemplo de demostración automática"
lemma "⟦A ∧ B; C ∧ (B ∧ D)⟧ ⟹ B ∧ D"
apply simp
done
section "Ejemplos del tema 2"
subsection {* Reglas de la conjunción *}
text {*
Ejemplo 1 (p. 4). Demostrar que
p ∧ q, r ⊢ q ∧ r.
*}
lemma ejemplo_1: "⟦p ∧ q; r⟧ ⟹ q ∧ r"
apply (rule conjI)
apply (erule conjunct2)
apply assumption
done
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
*}
lemma ejemplo_2_A: "⟦p; ¬¬(q ∧ r) ⟧ ⟹ ¬¬p ∧ r"
apply (rule conjI)
apply (rule notnotI)
apply assumption
apply (drule notnotD)
apply (erule conjunct2)
done
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
*}
lemma ejemplo_3: "⟦¬p ∧ q; ¬p ∧ q ⟶ r ∨ ¬p⟧ ⟹ r ∨ ¬p"
apply (erule mp)
apply assumption
done
text {*
Ejemplo 4 (p. 6) Demostrar que
p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r
*}
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
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
*}
lemma ejemplo_5_: "⟦p ⟶ (q ⟶ r); p; ¬r ⟧ ⟹ ¬q"
apply (drule mp)
apply assumption
apply (erule mt)
apply assumption
done
text {*
Ejemplo 6. (p. 7) Demostrar
¬p ⟶ q, ¬q ⊢ p
*}
lemma ejemplo_6: "⟦¬p ⟶ q; ¬q⟧ ⟹ p"
apply (drule mt)
apply assumption
apply (erule notnotD)
done
text {*
Ejemplo 7. (p. 7) Demostrar
p ⟶ ¬q, q ⊢ ¬p
*}
lemma ejemplo_7: "⟦p ⟶ ¬q; q⟧ ⟹ ¬p"
apply (erule mt)
apply (erule notnotI)
done
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
*}
lemma ejemplo_8: "p ⟶ q ⟹ ¬q ⟶ ¬p"
apply (rule impI)
apply (erule mt)
apply assumption
done
text {*
Ejemplo 9. (p. 9) Demostrar
¬q ⟶ ¬p ⊢ p ⟶ ¬¬q
*}
lemma ejemplo_9: "¬q ⟶ ¬p ⟹ p ⟶ ¬¬q"
apply (rule impI)
apply (erule mt)
apply (rule notnotI)
apply assumption
done
text {*
Ejemplo 10 (p. 9). Demostrar
⊢ p ⟶ p
*}
lemma ejemplo_10: "p ⟶ p"
apply (rule impI)
apply assumption
done
text {*
Ejemplo 11 (p. 10) Demostrar
⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))
*}
lemma ejemplo_11_A: "(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))"
apply (rule impI)+
apply (erule mp)
apply (drule mt)
apply (rule notnotI)
apply assumption
apply (rule notnotD)
apply assumption
done
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
*}
lemma ejemplo_12: "p ∨ q ⟹ q ∨ p"
apply (erule disjE)
apply (rule disjI2)
prefer 2
apply (rule disjI1)
apply assumption+
done
text {*
Ejemplo 13. (p. 12) Demostrar
q ⟶ r ⊢ p ∨ q ⟶ p ∨ r
*}
lemma ejemplo_13_A: "q ⟶ r ⟹ p ∨ q ⟶ p ∨ r"
apply (rule impI)
apply (erule disjE)
apply (rule disjI1)
prefer 2
apply (drule mp)
prefer 2
apply (rule disjI2)
apply assumption+
done
subsection {* Regla de copia *}
text {*
Ejemplo 14 (p. 13). Demostrar
⊢ p ⟶ (q ⟶ p)
*}
lemma ejemplo_14_A: "p ⟶ (q ⟶ p)"
apply (rule impI)+
apply assumption
done
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
*}
lemma ejemplo_15: "¬p ∨ q ⟹ p ⟶ q"
apply (rule impI)
apply (erule disjE)
apply (erule notE)
apply assumption+
done
text {*
Ejemplo 16 (p. 16). Demostrar
p ⟶ q, p ⟶ ¬q ⊢ ¬p
*}
lemma ejemplo_16_A: "⟦p ⟶ q; p ⟶ ¬q⟧ ⟹ ¬p"
apply (rule notI)
apply (drule mp)+
apply assumption+
apply (drule mp)
prefer 2
apply (erule notE)
apply assumption+
done
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
*}
lemma ejemplo_17: "(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
text {*
Ejemplo 18 (p. 18). Demostrar
p ⟷ q, p ∨ q ⊢ p ∧ q
*}
lemma ejemplo_18_A: "⟦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
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.
*}
lemma ejemplo_20: "⟦F ⟶ G; ¬G⟧ ⟹ ¬F"
apply (rule notI)
apply (drule mp)
apply assumption
apply (erule notE)
apply assumption
done
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.
*}
lemma ejemplo_21_A: "F ⟹ ¬¬F"
apply (rule notI)
apply (erule notE)
apply assumption
done
subsubsection {* Regla de reducción al absurdo *}
text {*
La regla de reducción al absurdo en Isabelle se corresponde 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.
*}
lemma ejemplo_22: "F ∨ ¬F"
oops
text {*
Ejemplo 23 (p. 24). Demostrar
p ⟶ q ⊢ ¬p ∨ q
*}
lemma ejemplo_23: "p ⟶ q ⟹ ¬p ∨ q"
apply (cut_tac P="p" in excluded_middle)
apply (erule disjE)
apply (rule disjI1)
prefer 2
apply (drule mp)
prefer 2
apply (rule disjI2)
apply assumption+
done
subsection {* Demostraciones por contradicción *}
text {*
Ejemplo 24. Demostrar que
¬p, p ∨ q ⊢ q
*}
lemma ejemplo_24: "⟦¬p ; p ∨ q⟧ ⟹ q"
apply (erule disjE)
apply (erule notE)
apply assumption+
done
end