Theory PropLog

(*  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 ‹
  Datatype definition of propositional logic formulae and inductive
  definition of the propositional tautologies.

  Inductive definition of propositional logic.  Soundness and
  completeness w.r.t.\ truth-tables.

  Prove: If H ⊨ p› then G ⊨ p› where G ∈

subsection ‹The datatype of propositions›

datatype 'a pl =
  | 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"
    H: "p  H  H  p"
  | K: "H  pqp"
  | S: "H  (pqr)  (pq)  pr"
  | DN: "H  ((pfalse)  false)  p"
  | MP: "H  pq; H  p  H  q"

subsection ‹The semantics›

subsubsection ‹Semantics of propositional logic.›

primrec eval :: "['a set, 'a pl] => bool"  ("_[[_]]" [100,0] 100)
    "tt[[false]] = False"
  | "tt[[#v]] = (v  tt)"
  | eval_imp: "tt[[pq]] = (tt[[p]]  tt[[q]])"

text ‹
  A finite set of hypotheses from t› and the Var›s in

primrec hyps :: "['a pl, 'a set] => 'a pl set"
    "hyps false  tt = {}"
  | "hyps (#v)   tt = {if v  tt then #v else #vfalse}"
  | "hyps (pq) 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. (qH. tt[[q]])  tt[[p]])"

subsection ‹Proof theory 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)
  then show ?thesis
    by blast

lemma thms_I: "H  pp"
  ― ‹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;  Gp  Hp"
  ― ‹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  pq"
  using K MP by blast

subsubsection ‹The deduction theorem›

theorem deduction: "insert p H  q    H  pq"
proof (induct set: thms)
  case (H p)
  then show ?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  pfalse  H  pq"
  by (metis thms.simps)

lemma imp_false:
  "H  p;  H  qfalse  H  (pq)false"
  by (meson MP S weaken_right)

lemma hyps_thms_if: "hyps p tt  (if tt[[p]] then p else pfalse)"
  ― ‹Typical example of strengthening the induction statement.›
proof (induction p)
  case (imp p1 p2)
  then show ?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 lemma for completeness; yields a set of assumptions
        satisfying p›
  by (metis (full_types) empty_iff hyps_thms_if sat_def)

text ‹
  For proving certain theorems in our new propositional logic.

declare deduction [intro!]
declare thms.H [THEN thms.MP, intro]

text ‹
  The excluded middle in the form of an elimination rule.

lemma thms_excluded_middle: "H  (pq)  ((pfalse)q)  q"
proof -
  have "insert ((p  false)  q) (insert (p  q) H)  (q  false)  false"
    by (best intro: H)
  then show ?thesis
    by (metis deduction thms.simps)

lemma thms_excluded_middle_rule:
  "insert p H  q;  insert (pfalse) 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 -- lemmas for reducing the set of assumptions›

text ‹
  For the case prophyps p t - insert #v Y  p we also have prophyps p t - {#v}  hyps p (t-{v}).

lemma hyps_Diff: "hyps p (t-{v})  insert (#vfalse) ((hyps p t)-{#v})"
  by (induct p) auto

text ‹
  For the case prophyps p t - insert (#v  Fls) Y  p we also have
  prophyps p t-{#vFls}  hyps p (insert v t).

lemma hyps_insert: "hyps p (insert v t)  insert (#v) (hyps p t-{#vfalse})"
  by (induct p) auto

text ‹Two lemmas for use with 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 termhyps p t is finite, and elements have the form
  term#v or term#vFls.

lemma hyps_finite: "finite(hyps p t)"
  by (induct p) auto

lemma hyps_subset: "hyps p t  (UN v. {#v, #vfalse})"
  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 termhyps 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
      then show ?case
        by (simp add: assms sat_thms_p)
      case (insert q H)
      then consider v where "q = #v" | v where "q = #v  false"
        by blast
      then show ?case
      proof cases
        case 1
        then show ?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)
        case 2
        then show ?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)
  then show ?thesis
    by (metis Diff_cancel)

text‹A semantic analogue of the Deduction Theorem›
lemma sat_imp: "insert p H  q  H  pq"
  by (auto simp: sat_def)

theorem completeness: "finite H  H  p  H  p"
proof (induction arbitrary: p rule: finite_induct)
  case empty
  then show ?case
    by (simp add: completeness_0)
  case insert
  then show ?case
    by (meson H MP insertI1 sat_imp weaken_left_insert)

theorem syntax_iff_semantics: "finite H  (H  p) = (H  p)"
  by (blast intro: soundness completeness)