Deducción natural en lógica de primer orden con Isabelle/Isar
De Razonamiento automático (2010-11)
En esta teoría se presenta una formalización en Isabelle/Isar de los ejemplos del tema de deducción natural proposicional siguiendo la presentación de Huth y Ryan en su libro Logic in Computer Science y, más concretamente, a la forma como se explica en la asignatura de Lógica informática y que puede verse en las transparencias del tema 7.
La páginas en los teorema indican la página de las anteriores transparencias donde se encuentra la demostración.
header {* Deducción natural en la lógica de primer orden *}
theory LogicaDePrimerOrden
imports Main
begin
section {* Reglas del cuantificador universal *}
text {*
La regla de eliminación del cuantificador universal es
· allI: ⟦∀x. P x; P x ⟹ R⟧ ⟹ R
La regla de introducción del cuantificador universal es
· allE: (⋀x. P x) ⟹ ∀x. P x
*}
lemma -- "p. 10"
assumes 1: "P(c)" and
2: "∀x. P(x) ⟶ ¬Q(x)"
shows "¬Q(c)"
proof (rule notI)
assume 3: "Q(c)"
have "P(c) ⟶ ¬Q(c)" using 2 by (rule allE)
hence "¬Q(c)" using 1 by (rule mp)
thus False using 3 by (rule notE)
qed
lemma -- "p. 11"
assumes 1: "∀x. P(x) ⟶ Q(x)" and
2: "∀x. P(x)"
shows "∀x. Q(x)"
proof (rule allI)
fix x
have 3: "P(x) ⟶ Q(x)" using 1 by (rule allE)
have 4: "P(x)" using 2 by (rule allE)
show "Q(x)" using 3 4 by (rule mp)
qed
section {* Reglas del cuantificador existencial *}
text {*
La regla de eliminación del cuantificador existencial es
· exI: P x ⟹ ∃x. P x
La regla de introducción del cuantificador existencial es
· exE: ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q
*}
lemma -- "p. 12"
assumes 1: "∀x. P(x)"
shows "∃x. P(x)"
proof -
have 2: "P(x)" using 1 by (rule allE)
show "∃x. P(x)" using 2 by (rule exI)
qed
lemma -- "p. 12"
assumes 1: "∀x. P(x)"
shows "∃x. P(x)"
proof (rule exI)
show "P(x)" using 1 by (rule allE)
qed
lemma -- "p. 12"
assumes 1: "∀x. P(x)"
shows "∃x. P(x)"
proof
show "P(x)" using 1 ..
qed
lemma -- "p. 13"
assumes 1: "∀x. P(x) ⟶ Q(x)" and
2: "∃x. P(x)"
shows "∃x. Q(x)"
proof -
obtain "a" where 3: "P(a)" using 2 by (rule exE)
have 4: "P(a) ⟶ Q(a)" using 1 by (rule allE)
have 5: "Q(a)" using 4 3 by (rule mp)
show "∃x. Q(x)" using 5 by (rule exI)
qed
lemma
assumes 1: "∀x. Q(x) ⟶ R(x)" and
2: "∃x. P(x) ∧ Q(x)"
shows "∃x. P(x) ∧ R(x)"
proof -
obtain x where 3: "P(x) ∧ Q(x)" using 2 by (rule exE)
have 5: "P(x)" using 3 by (rule conjunct1)
have 6: "Q(x) ⟶ R(x)" using 1 by (rule allE)
have 7: "Q(x)" using 3 by (rule conjunct2)
have 8: "R(x)" using 6 7 by (rule mp)
have 9: "P(x) ∧ R(x)" using 5 8 by (rule conjI)
show "∃x. P(x) ∧ R(x)" using 9 by (rule exI)
qed
lemma
assumes 1: "∃x. P(x)" and
2: "∀x.∀y. P(x) ⟶ Q(y)"
shows "∀y. Q(y)"
proof (rule allI)
fix y
obtain x where 3: "P(x)" using 1 by (rule exE)
have 4: "∀y. P(x) ⟶ Q(y)" using 2 by (rule allE)
have 5: "P(x) ⟶ Q(y)" using 4 by (rule allE)
show "Q(y)" using 5 3 by (rule mp)
qed
section {* Equivalencias *}
-- "p. 15"
lemma equivalencia_1a1:
assumes 1: "¬(∀x. P(x))"
shows "∃x. ¬P(x)"
proof (rule ccontr)
assume 2: "¬(∃x. ¬P(x))"
note 1
thus False
proof (rule notE)
show "∀x. P(x)"
proof (rule allI)
fix x
show "P(x)"
proof (rule ccontr)
assume 3: "¬P(x)"
have 4: "∃x. ¬P(x)" using 3 by (rule exI)
show False using 2 4 by (rule notE)
qed
qed
qed
qed
-- "p. 16"
lemma equivalencia_1a2:
assumes 1: "∃x. ¬P(x)"
shows "¬(∀x. P(x))"
proof (rule ccontr)
assume 2: "¬¬(∀x. P(x))"
obtain x where 3: "¬P(x)" using 1 by (rule exE)
have 4: "∀x. P(x)" using 2 by (rule notnotD)
have 5: "P(x)" using 4 by (rule allE)
show False using 3 5 by (rule notE)
qed
-- "p. 17"
theorem equivalencia_1a:
"(¬(∀x. P(x))) = (∃x. ¬P(x))"
proof (rule iffI)
{ assume "¬(∀x. P x)"
thus "∃x. ¬P x" by (rule equivalencia_1a1)}
next
{ assume "∃x. ¬P x"
thus "¬(∀x. P x)" by (rule equivalencia_1a2) }
qed
-- "p. 18"
lemma equivalencia_3a1:
assumes 1: "∀x. P(x) ∧ Q(x)"
shows "(∀x. P(x)) ∧ (∀x. Q(x))"
proof (rule conjI)
show "∀x. P(x)"
proof (rule allI)
fix x
have 2: "P(x) ∧ Q(x)" using 1 by (rule allE)
show "P(x)" using 2 by (rule conjunct1)
qed
next
show "∀x. Q(x)"
proof (rule allI)
fix x
have 3: "P(x) ∧ Q(x)" using 1 by (rule allE)
show "Q(x)" using 3 by (rule conjunct2)
qed
qed
-- "p. 19"
lemma equivalencia_3a2:
assumes 1: "(∀x. P(x)) ∧ (∀x. Q(x))"
shows "∀x. P(x) ∧ Q(x)"
proof (rule allI)
fix x
have 2: "∀x. P(x)" using 1 by (rule conjunct1)
have 3: "∀x. Q(x)" using 1 by (rule conjunct2)
have 4: "P(x)" using 2 by (rule allE)
have 5: "Q(x)" using 3 by (rule allE)
show "P(x) ∧ Q(x)" using 4 5 by (rule conjI)
qed
-- "p. 20"
lemma equivalencia_3a:
"(∀x. P(x) ∧ Q(x)) = ((∀x. P(x)) ∧ (∀x. Q(x)))"
proof (rule iffI)
{ assume "∀x. P(x) ∧ Q(x)"
thus "(∀x. P(x)) ∧ (∀x. Q(x))" by (rule equivalencia_3a1) }
next
{ assume "(∀x. P(x)) ∧ (∀x. Q(x))"
thus "∀x. P(x) ∧ Q(x)" by (rule equivalencia_3a2) }
qed
-- "p. 21"
lemma equivalencia_3b1:
assumes 1: "(∃x. P(x)) ∨ (∃x. Q(x))"
shows "∃x. P(x) ∨ Q(x)"
using 1
proof (rule disjE)
{ assume "∃x. P(x)"
then obtain x where "P(x)" by (rule exE)
hence "P(x) ∨ Q(x)" by (rule disjI1)
thus "∃x. P(x) ∨ Q(x)" by (rule exI) }
next
{ assume "∃x. Q(x)"
then obtain x where "Q(x)" by (rule exE)
hence "P(x) ∨ Q(x)" by (rule disjI2)
thus "∃x. P(x) ∨ Q(x)" by (rule exI) }
qed
-- "p. 22"
lemma equivalencia_3b2:
assumes 1: "∃x. P(x) ∨ Q(x)"
shows "(∃x. P(x)) ∨ (∃x. Q(x))"
proof -
obtain x where 2: "P(x) ∨ Q(x)" using 1 by (rule exE)
thus "(∃x. P(x)) ∨ (∃x. Q(x))"
proof (rule disjE)
{ assume "P(x)"
hence "∃x. P(x)" by (rule exI)
thus "(∃x. P(x)) ∨ (∃x. Q(x))" by (rule disjI1) }
next
{ assume "Q(x)"
hence "∃x. Q(x)" by (rule exI)
thus "(∃x. P(x)) ∨ (∃x. Q(x))" by (rule disjI2) }
qed
qed
-- "p. 23"
lemma equivalencia_3b:
"((∃x. P(x)) ∨ (∃x. Q(x))) = (∃x. P(x) ∨ Q(x))"
proof (rule iffI)
{ assume "(∃x. P(x)) ∨ (∃x. Q(x))"
thus "∃x. P(x) ∨ Q(x)" by (rule equivalencia_3b1) }
next
{ assume "∃x. P(x) ∨ Q(x)"
thus "(∃x. P(x)) ∨ (∃x. Q(x))" by (rule equivalencia_3b2) }
qed
-- "p. 24"
lemma equivalencia_4b1:
assumes 1: "∃x.∃y. P x y"
shows "∃y.∃x. P x y"
proof -
obtain x where "∃y. P x y" using 1 by (rule exE)
then obtain y where "P x y" by (rule exE)
hence "∃x. P x y" by (rule exI)
thus "∃y.∃x. P x y" by (rule exI)
qed
-- "p. 25"
theorem equivalencia_4b:
"(∃x.∃y. P x y) = (∃y.∃x. P x y)"
proof (rule iffI)
{ assume "∃x.∃y. P x y"
thus "∃y.∃x. P x y" by (rule equivalencia_4b1) }
next
{assume "∃y.∃x. P x y"
thus "∃x.∃y. P x y" by (rule equivalencia_4b1) }
qed
end