(* Title: HOL/Induct/PropLog.thy Author: Tobias Nipkow Copyright 1994 TU Muenchen & University of Cambridge
*)
section‹Meta-theory of propositional logic›
theory PropLog imports Main begin
text‹ Datatypedefinition of propositional logic formulae andinductive definition of the propositional tautologies.
Inductivedefinition of propositional logic. Soundness and
completeness w.r.t.\ truth-tables.
Prove: If‹H ⊨ p›then‹G ⊨ p›where‹G ∈
Fin(H)› ›
subsection‹The datatype of propositions›
datatype'a pl =
false
| var 'a (\#_\ [1000])
| imp "'a pl""'a pl" (infixr‹⇀› 90)
subsection‹The proof system›
inductive thms :: "['a pl set, 'a pl] \ bool" (infixl‹⊨› 50) for H :: "'a pl set" where
H: "p \ H \ H \ p"
| K: "H \ p\q\p"
| S: "H \ (p\q\r) \ (p\q) \ p\r"
| DN: "H \ ((p\false) \ false) \ p"
| MP: "\H \ p\q; H \ p\ \ H \ q"
subsection‹The semantics›
subsubsection ‹Semantics of propositional logic.›
primrec eval :: "['a set, 'a pl] => bool" (‹_[[_]]› [100,0] 100) where "tt[[false]] = False"
| "tt[[#v]] = (v \ tt)"
| eval_imp: "tt[[p\q]] = (tt[[p]] \ tt[[q]])"
text‹
A finite set of hypotheses from‹t›and the ‹Var›s in ‹p›. ›
primrec hyps :: "['a pl, 'a set] => 'a pl set" where "hyps false tt = {}"
| "hyps (#v) tt = {if v \ tt then #v else #v\false}"
| "hyps (p\q) tt = hyps p tt Un hyps q tt"
subsubsection ‹Logical consequence›
text‹ For every valuation, if all elements of ‹H› are true then so is‹p›. ›
definition sat :: "['a pl set, 'a pl] => bool" (infixl‹⊨› 50) where"H \ p = (\tt. (\q\H. tt[[q]]) \ tt[[p]])"
subsection‹Prooftheory of propositional logic›
lemma thms_mono: assumes"G \ H"shows"thms(G) \ thms(H)" proof - have"G \ p \ H \ p"for p by (induction rule: thms.induct) (use assms in‹auto intro: thms.intros›) thenshow ?thesis by blast qed
lemma thms_I: "H \ p\p" 🍋‹Called ‹I›for Identity Combinator, not for Introduction.› by (best intro: thms.K thms.S thms.MP)
subsubsection ‹Weakening, left and right›
lemma weaken_left: "\G \ H; G\p\ \ H\p" 🍋‹Order of premises is convenient with‹THEN›› by (meson predicate1D thms_mono)
lemma weaken_left_insert: "G \ p \ insert a G \ p" by (meson subset_insertI weaken_left)
lemma weaken_left_Un1: "G \ p \ G \ B \ p" by (rule weaken_left) (rule Un_upper1)
lemma weaken_left_Un2: "G \ p \ A \ G \ p" by (metis Un_commute weaken_left_Un1)
lemma weaken_right: "H \ q \ H \ p\q" using K MP by blast
subsubsection ‹The deduction theorem›
theorem deduction: "insert p H \ q \ H \ p\q" proof (induct set: thms) case (H p) thenshow ?case using thms.H thms_I weaken_right by fastforce qed (metis thms.simps)+
subsubsection ‹The cut rule›
lemma cut: "insert p H \ q \ H \ p \ H \ q" using MP deduction by blast
lemma thms_falseE: "H \ false \ H \ q" by (metis thms.simps)
lemma thms_notE: "H \ p \ false \ H \ p \ H \ q" using MP thms_falseE by blast
subsubsection ‹Soundness of the rules wrt truth-table semantics›
theorem soundness: "H \ p \ H \ p" by (induct set: thms) (auto simp: sat_def)
subsection‹Completeness›
subsubsection ‹Towards the completeness proof›
lemma false_imp: "H \ p\false \ H \ p\q" by (metis thms.simps)
lemma imp_false: "\H \ p; H \ q\false\ \ H \ (p\q)\false" by (meson MP S weaken_right)
lemma hyps_thms_if: "hyps p tt \ (if tt[[p]] then p else p\false)" 🍋‹Typical example of strengthening the induction statement.› proof (induction p) case (imp p1 p2) thenshow ?case by (metis (full_types) eval_imp false_imp hyps.simps(3) imp_false weaken_left_Un1 weaken_left_Un2 weaken_right)
qed (simp_all add: thms_I thms.H)
lemma sat_thms_p: "{} \ p \ hyps p tt \ p" 🍋‹Key lemmafor completeness; yields a set of assumptions
satisfying ‹p›› by (metis (full_types) empty_iff hyps_thms_if sat_def)
text‹ For proving certain theoremsin our new propositional logic. ›
lemma thms_excluded_middle_rule: "\insert p H \ q; insert (p\false) H \ q\ \ H \ q" 🍋‹Hard to prove directly because it requires cuts› by (rule thms_excluded_middle [THEN thms.MP, THEN thms.MP], auto)
subsection‹Completeness -- lemmasfor reducing the set of assumptions›
text‹ For the case🍋‹hyps p t - insert #v Y ⊨ p› we alsohave🍋‹hyps p t - {#v} ⊆ hyps p (t-{v})›. ›
lemma hyps_Diff: "hyps p (t-{v}) \ insert (#v\false) ((hyps p t)-{#v})" by (induct p) auto
text‹ For the case🍋‹hyps p t - insert (#v ⇀ Fls) Y ⊨ p› we alsohave 🍋‹hyps p t-{#v⇀Fls} ⊆ hyps p (insert v t)›. ›
lemma hyps_insert: "hyps p (insert v t) \ insert (#v) (hyps p t-{#v\false})" by (induct p) auto
text‹Two lemmasforusewith‹weaken_left››
lemma insert_Diff_same: "B-C \ insert a (B-insert a C)" by fast
lemma insert_Diff_subset2: "insert a (B-{c}) - D \ insert a (B-insert c D)" by fast
text‹
The set 🍋‹hyps p t›is finite, and elements have the form 🍋‹#v› or 🍋‹#v⇀Fls›. ›
lemma hyps_finite: "finite(hyps p t)" by (induct p) auto
lemma hyps_subset: "hyps p t \ (UN v. {#v, #v\false})" by (induct p) auto
lemma Diff_weaken_left: "A \ C \ A - B \ p \ C - B \ p" by (rule Diff_mono [OF _ subset_refl, THEN weaken_left])
subsubsection ‹Completeness theorem›
text‹ Induction on the finite set of assumptions 🍋‹hyps p t0›. We
may repeatedly subtract assumptions until none are left! ›
lemma completeness_0: assumes"{} \ p" shows"{} \ p" proof -
{ fix t t0 have"hyps p t - hyps p t0 \ p" using hyps_finite hyps_subset proof (induction arbitrary: t rule: finite_subset_induct) case empty thenshow ?case by (simp add: assms sat_thms_p) next case (insert q H) then consider v where"q = #v" | v where"q = #v \ false" by blast thenshow ?case proof cases case 1 thenshow ?thesis by (metis (no_types, lifting) insert.IH thms_excluded_middle_rule insert_Diff_same
insert_Diff_subset2 weaken_left Diff_weaken_left hyps_Diff) next case 2 thenshow ?thesis by (metis (no_types, lifting) insert.IH thms_excluded_middle_rule insert_Diff_same
insert_Diff_subset2 weaken_left Diff_weaken_left hyps_insert) qed qed
} thenshow ?thesis by (metis Diff_cancel) qed
text‹A semantic analogue of the Deduction Theorem› lemma sat_imp: "insert p H \ q \ H \ p\q" by (auto simp: sat_def)
theorem completeness: "finite H \ H \ p \ H \ p" proof (induction arbitrary: p rule: finite_induct) case empty thenshow ?case by (simp add: completeness_0) next case insert thenshow ?case by (meson H MP insertI1 sat_imp weaken_left_insert) qed
theorem syntax_iff_semantics: "finite H \ (H \ p) = (H \ p)" by (blast intro: soundness completeness)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.