src/HOL/Induct/PropLog.thy
changeset 77062 1d5872cb52ec
parent 69597 ff784d5a5bfb
equal deleted inserted replaced
77061:5de3772609ea 77062:1d5872cb52ec
    12   definition of the propositional tautologies.
    12   definition of the propositional tautologies.
    13 
    13 
    14   Inductive definition of propositional logic.  Soundness and
    14   Inductive definition of propositional logic.  Soundness and
    15   completeness w.r.t.\ truth-tables.
    15   completeness w.r.t.\ truth-tables.
    16 
    16 
    17   Prove: If \<open>H |= p\<close> then \<open>G |= p\<close> where \<open>G \<in>
    17   Prove: If \<open>H \<Turnstile> p\<close> then \<open>G \<Turnstile> p\<close> where \<open>G \<in>
    18   Fin(H)\<close>
    18   Fin(H)\<close>
    19 \<close>
    19 \<close>
    20 
    20 
    21 subsection \<open>The datatype of propositions\<close>
    21 subsection \<open>The datatype of propositions\<close>
    22 
    22 
    23 datatype 'a pl =
    23 datatype 'a pl =
    24   false |
    24     false 
    25   var 'a ("#_" [1000]) |
    25   | var 'a ("#_" [1000]) 
    26   imp "'a pl" "'a pl" (infixr "->" 90)
    26   | imp "'a pl" "'a pl" (infixr "\<rightharpoonup>" 90)
    27 
    27 
    28 
    28 
    29 subsection \<open>The proof system\<close>
    29 subsection \<open>The proof system\<close>
    30 
    30 
    31 inductive thms :: "['a pl set, 'a pl] => bool"  (infixl "|-" 50)
    31 inductive thms :: "['a pl set, 'a pl] \<Rightarrow> bool"  (infixl "\<turnstile>" 50)
    32   for H :: "'a pl set"
    32   for H :: "'a pl set"
    33 where
    33   where
    34   H: "p\<in>H ==> H |- p"
    34     H: "p \<in> H \<Longrightarrow> H \<turnstile> p"
    35 | K: "H |- p->q->p"
    35   | K: "H \<turnstile> p\<rightharpoonup>q\<rightharpoonup>p"
    36 | S: "H |- (p->q->r) -> (p->q) -> p->r"
    36   | S: "H \<turnstile> (p\<rightharpoonup>q\<rightharpoonup>r) \<rightharpoonup> (p\<rightharpoonup>q) \<rightharpoonup> p\<rightharpoonup>r"
    37 | DN: "H |- ((p->false) -> false) -> p"
    37   | DN: "H \<turnstile> ((p\<rightharpoonup>false) \<rightharpoonup> false) \<rightharpoonup> p"
    38 | MP: "[| H |- p->q; H |- p |] ==> H |- q"
    38   | MP: "\<lbrakk>H \<turnstile> p\<rightharpoonup>q; H \<turnstile> p\<rbrakk> \<Longrightarrow> H \<turnstile> q"
    39 
    39 
    40 
    40 
    41 subsection \<open>The semantics\<close>
    41 subsection \<open>The semantics\<close>
    42 
    42 
    43 subsubsection \<open>Semantics of propositional logic.\<close>
    43 subsubsection \<open>Semantics of propositional logic.\<close>
    44 
    44 
    45 primrec eval :: "['a set, 'a pl] => bool"  ("_[[_]]" [100,0] 100)
    45 primrec eval :: "['a set, 'a pl] => bool"  ("_[[_]]" [100,0] 100)
    46 where
    46   where
    47   "tt[[false]] = False"
    47     "tt[[false]] = False"
    48 | "tt[[#v]] = (v \<in> tt)"
    48   | "tt[[#v]] = (v \<in> tt)"
    49 | eval_imp: "tt[[p->q]] = (tt[[p]] --> tt[[q]])"
    49   | eval_imp: "tt[[p\<rightharpoonup>q]] = (tt[[p]] \<longrightarrow> tt[[q]])"
    50 
    50 
    51 text \<open>
    51 text \<open>
    52   A finite set of hypotheses from \<open>t\<close> and the \<open>Var\<close>s in
    52   A finite set of hypotheses from \<open>t\<close> and the \<open>Var\<close>s in
    53   \<open>p\<close>.
    53   \<open>p\<close>.
    54 \<close>
    54 \<close>
    55 
    55 
    56 primrec hyps :: "['a pl, 'a set] => 'a pl set"
    56 primrec hyps :: "['a pl, 'a set] => 'a pl set"
    57 where
    57   where
    58   "hyps false  tt = {}"
    58     "hyps false  tt = {}"
    59 | "hyps (#v)   tt = {if v \<in> tt then #v else #v->false}"
    59   | "hyps (#v)   tt = {if v \<in> tt then #v else #v\<rightharpoonup>false}"
    60 | "hyps (p->q) tt = hyps p tt Un hyps q tt"
    60   | "hyps (p\<rightharpoonup>q) tt = hyps p tt Un hyps q tt"
    61 
    61 
    62 
    62 
    63 subsubsection \<open>Logical consequence\<close>
    63 subsubsection \<open>Logical consequence\<close>
    64 
    64 
    65 text \<open>
    65 text \<open>
    66   For every valuation, if all elements of \<open>H\<close> are true then so
    66   For every valuation, if all elements of \<open>H\<close> are true then so
    67   is \<open>p\<close>.
    67   is \<open>p\<close>.
    68 \<close>
    68 \<close>
    69 
    69 
    70 definition sat :: "['a pl set, 'a pl] => bool"  (infixl "|=" 50)
    70 definition sat :: "['a pl set, 'a pl] => bool"  (infixl "\<Turnstile>" 50)
    71   where "H |= p = (\<forall>tt. (\<forall>q\<in>H. tt[[q]]) --> tt[[p]])"
    71   where "H \<Turnstile> p = (\<forall>tt. (\<forall>q\<in>H. tt[[q]]) \<longrightarrow> tt[[p]])"
    72 
    72 
    73 
    73 
    74 subsection \<open>Proof theory of propositional logic\<close>
    74 subsection \<open>Proof theory of propositional logic\<close>
    75 
    75 
    76 lemma thms_mono: "G<=H ==> thms(G) <= thms(H)"
    76 lemma thms_mono: 
    77 apply (rule predicate1I)
    77   assumes "G \<subseteq> H" shows "thms(G) \<le> thms(H)"
    78 apply (erule thms.induct)
    78 proof -
    79 apply (auto intro: thms.intros)
    79   have "G \<turnstile> p \<Longrightarrow> H \<turnstile> p" for p
    80 done
    80     by (induction rule: thms.induct) (use assms in \<open>auto intro: thms.intros\<close>)
    81 
    81   then show ?thesis
    82 lemma thms_I: "H |- p->p"
    82     by blast
       
    83 qed
       
    84 
       
    85 lemma thms_I: "H \<turnstile> p\<rightharpoonup>p"
    83   \<comment> \<open>Called \<open>I\<close> for Identity Combinator, not for Introduction.\<close>
    86   \<comment> \<open>Called \<open>I\<close> for Identity Combinator, not for Introduction.\<close>
    84 by (best intro: thms.K thms.S thms.MP)
    87   by (best intro: thms.K thms.S thms.MP)
    85 
    88 
    86 
    89 
    87 subsubsection \<open>Weakening, left and right\<close>
    90 subsubsection \<open>Weakening, left and right\<close>
    88 
    91 
    89 lemma weaken_left: "[| G \<subseteq> H;  G|-p |] ==> H|-p"
    92 lemma weaken_left: "\<lbrakk>G \<subseteq> H;  G\<turnstile>p\<rbrakk> \<Longrightarrow> H\<turnstile>p"
    90   \<comment> \<open>Order of premises is convenient with \<open>THEN\<close>\<close>
    93   \<comment> \<open>Order of premises is convenient with \<open>THEN\<close>\<close>
    91   by (erule thms_mono [THEN predicate1D])
    94   by (meson predicate1D thms_mono)
    92 
    95 
    93 lemma weaken_left_insert: "G |- p \<Longrightarrow> insert a G |- p"
    96 lemma weaken_left_insert: "G \<turnstile> p \<Longrightarrow> insert a G \<turnstile> p"
    94 by (rule weaken_left) (rule subset_insertI)
    97   by (meson subset_insertI weaken_left)
    95 
    98 
    96 lemma weaken_left_Un1: "G |- p \<Longrightarrow> G \<union> B |- p"
    99 lemma weaken_left_Un1: "G \<turnstile> p \<Longrightarrow> G \<union> B \<turnstile> p"
    97 by (rule weaken_left) (rule Un_upper1)
   100   by (rule weaken_left) (rule Un_upper1)
    98 
   101 
    99 lemma weaken_left_Un2: "G |- p \<Longrightarrow> A \<union> G |- p"
   102 lemma weaken_left_Un2: "G \<turnstile> p \<Longrightarrow> A \<union> G \<turnstile> p"
   100 by (rule weaken_left) (rule Un_upper2)
   103   by (metis Un_commute weaken_left_Un1)
   101 
   104 
   102 lemma weaken_right: "H |- q ==> H |- p->q"
   105 lemma weaken_right: "H \<turnstile> q \<Longrightarrow> H \<turnstile> p\<rightharpoonup>q"
   103 by (fast intro: thms.K thms.MP)
   106   using K MP by blast
   104 
   107 
   105 
   108 
   106 subsubsection \<open>The deduction theorem\<close>
   109 subsubsection \<open>The deduction theorem\<close>
   107 
   110 
   108 theorem deduction: "insert p H |- q  ==>  H |- p->q"
   111 theorem deduction: "insert p H \<turnstile> q  \<Longrightarrow>  H \<turnstile> p\<rightharpoonup>q"
   109 apply (induct set: thms)
   112 proof (induct set: thms)
   110 apply (fast intro: thms_I thms.H thms.K thms.S thms.DN
   113   case (H p)
   111                    thms.S [THEN thms.MP, THEN thms.MP] weaken_right)+
   114   then show ?case
   112 done
   115     using thms.H thms_I weaken_right by fastforce 
       
   116 qed (metis thms.simps)+
   113 
   117 
   114 
   118 
   115 subsubsection \<open>The cut rule\<close>
   119 subsubsection \<open>The cut rule\<close>
   116 
   120 
   117 lemma cut: "insert p H |- q \<Longrightarrow> H |- p \<Longrightarrow> H |- q"
   121 lemma cut: "insert p H \<turnstile> q \<Longrightarrow> H \<turnstile> p \<Longrightarrow> H \<turnstile> q"
   118 by (rule thms.MP) (rule deduction)
   122   using MP deduction by blast
   119 
   123 
   120 lemma thms_falseE: "H |- false \<Longrightarrow> H |- q"
   124 lemma thms_falseE: "H \<turnstile> false \<Longrightarrow> H \<turnstile> q"
   121 by (rule thms.MP, rule thms.DN) (rule weaken_right)
   125   by (metis thms.simps)
   122 
   126 
   123 lemma thms_notE: "H |- p -> false \<Longrightarrow> H |- p \<Longrightarrow> H |- q"
   127 lemma thms_notE: "H \<turnstile> p \<rightharpoonup> false \<Longrightarrow> H \<turnstile> p \<Longrightarrow> H \<turnstile> q"
   124 by (rule thms_falseE) (rule thms.MP)
   128   using MP thms_falseE by blast
   125 
   129 
   126 
   130 
   127 subsubsection \<open>Soundness of the rules wrt truth-table semantics\<close>
   131 subsubsection \<open>Soundness of the rules wrt truth-table semantics\<close>
   128 
   132 
   129 theorem soundness: "H |- p ==> H |= p"
   133 theorem soundness: "H \<turnstile> p \<Longrightarrow> H \<Turnstile> p"
   130 by (induct set: thms) (auto simp: sat_def)
   134   by (induct set: thms) (auto simp: sat_def)
   131 
   135 
   132 
   136 
   133 subsection \<open>Completeness\<close>
   137 subsection \<open>Completeness\<close>
   134 
   138 
   135 subsubsection \<open>Towards the completeness proof\<close>
   139 subsubsection \<open>Towards the completeness proof\<close>
   136 
   140 
   137 lemma false_imp: "H |- p->false ==> H |- p->q"
   141 lemma false_imp: "H \<turnstile> p\<rightharpoonup>false \<Longrightarrow> H \<turnstile> p\<rightharpoonup>q"
   138 apply (rule deduction)
   142   by (metis thms.simps)
   139 apply (metis H insert_iff weaken_left_insert thms_notE)
       
   140 done
       
   141 
   143 
   142 lemma imp_false:
   144 lemma imp_false:
   143     "[| H |- p;  H |- q->false |] ==> H |- (p->q)->false"
   145   "\<lbrakk>H \<turnstile> p;  H \<turnstile> q\<rightharpoonup>false\<rbrakk> \<Longrightarrow> H \<turnstile> (p\<rightharpoonup>q)\<rightharpoonup>false"
   144 apply (rule deduction)
   146   by (meson MP S weaken_right)
   145 apply (metis H MP insert_iff weaken_left_insert)
   147 
   146 done
   148 lemma hyps_thms_if: "hyps p tt \<turnstile> (if tt[[p]] then p else p\<rightharpoonup>false)"
   147 
       
   148 lemma hyps_thms_if: "hyps p tt |- (if tt[[p]] then p else p->false)"
       
   149   \<comment> \<open>Typical example of strengthening the induction statement.\<close>
   149   \<comment> \<open>Typical example of strengthening the induction statement.\<close>
   150 apply simp
   150 proof (induction p)
   151 apply (induct p)
   151   case (imp p1 p2)
   152 apply (simp_all add: thms_I thms.H)
   152   then show ?case
   153 apply (blast intro: weaken_left_Un1 weaken_left_Un2 weaken_right
   153     by (metis (full_types) eval_imp false_imp hyps.simps(3) imp_false weaken_left_Un1 weaken_left_Un2 weaken_right)
   154                     imp_false false_imp)
   154 
   155 done
   155 qed (simp_all add: thms_I thms.H)
   156 
   156 
   157 lemma sat_thms_p: "{} |= p ==> hyps p tt |- p"
   157 lemma sat_thms_p: "{} \<Turnstile> p \<Longrightarrow> hyps p tt \<turnstile> p"
   158   \<comment> \<open>Key lemma for completeness; yields a set of assumptions
   158   \<comment> \<open>Key lemma for completeness; yields a set of assumptions
   159         satisfying \<open>p\<close>\<close>
   159         satisfying \<open>p\<close>\<close>
   160 unfolding sat_def
   160   by (metis (full_types) empty_iff hyps_thms_if sat_def)
   161 by (metis (full_types) empty_iff hyps_thms_if)
       
   162 
   161 
   163 text \<open>
   162 text \<open>
   164   For proving certain theorems in our new propositional logic.
   163   For proving certain theorems in our new propositional logic.
   165 \<close>
   164 \<close>
   166 
   165 
   169 
   168 
   170 text \<open>
   169 text \<open>
   171   The excluded middle in the form of an elimination rule.
   170   The excluded middle in the form of an elimination rule.
   172 \<close>
   171 \<close>
   173 
   172 
   174 lemma thms_excluded_middle: "H |- (p->q) -> ((p->false)->q) -> q"
   173 lemma thms_excluded_middle: "H \<turnstile> (p\<rightharpoonup>q) \<rightharpoonup> ((p\<rightharpoonup>false)\<rightharpoonup>q) \<rightharpoonup> q"
   175 apply (rule deduction [THEN deduction])
   174 proof -
   176 apply (rule thms.DN [THEN thms.MP], best intro: H)
   175   have "insert ((p \<rightharpoonup> false) \<rightharpoonup> q) (insert (p \<rightharpoonup> q) H) \<turnstile> (q \<rightharpoonup> false) \<rightharpoonup> false"
   177 done
   176     by (best intro: H)
       
   177   then show ?thesis
       
   178     by (metis deduction thms.simps)
       
   179 qed
   178 
   180 
   179 lemma thms_excluded_middle_rule:
   181 lemma thms_excluded_middle_rule:
   180     "[| insert p H |- q;  insert (p->false) H |- q |] ==> H |- q"
   182   "\<lbrakk>insert p H \<turnstile> q;  insert (p\<rightharpoonup>false) H \<turnstile> q\<rbrakk> \<Longrightarrow> H \<turnstile> q"
   181   \<comment> \<open>Hard to prove directly because it requires cuts\<close>
   183   \<comment> \<open>Hard to prove directly because it requires cuts\<close>
   182 by (rule thms_excluded_middle [THEN thms.MP, THEN thms.MP], auto)
   184   by (rule thms_excluded_middle [THEN thms.MP, THEN thms.MP], auto)
   183 
   185 
   184 
   186 
   185 subsection\<open>Completeness -- lemmas for reducing the set of assumptions\<close>
   187 subsection\<open>Completeness -- lemmas for reducing the set of assumptions\<close>
   186 
   188 
   187 text \<open>
   189 text \<open>
   188   For the case \<^prop>\<open>hyps p t - insert #v Y |- p\<close> we also have \<^prop>\<open>hyps p t - {#v} \<subseteq> hyps p (t-{v})\<close>.
   190   For the case \<^prop>\<open>hyps p t - insert #v Y \<turnstile> p\<close> we also have \<^prop>\<open>hyps p t - {#v} \<subseteq> hyps p (t-{v})\<close>.
   189 \<close>
   191 \<close>
   190 
   192 
   191 lemma hyps_Diff: "hyps p (t-{v}) <= insert (#v->false) ((hyps p t)-{#v})"
   193 lemma hyps_Diff: "hyps p (t-{v}) \<subseteq> insert (#v\<rightharpoonup>false) ((hyps p t)-{#v})"
   192 by (induct p) auto
   194   by (induct p) auto
   193 
   195 
   194 text \<open>
   196 text \<open>
   195   For the case \<^prop>\<open>hyps p t - insert (#v -> Fls) Y |- p\<close> we also have
   197   For the case \<^prop>\<open>hyps p t - insert (#v \<rightharpoonup> Fls) Y \<turnstile> p\<close> we also have
   196   \<^prop>\<open>hyps p t-{#v->Fls} \<subseteq> hyps p (insert v t)\<close>.
   198   \<^prop>\<open>hyps p t-{#v\<rightharpoonup>Fls} \<subseteq> hyps p (insert v t)\<close>.
   197 \<close>
   199 \<close>
   198 
   200 
   199 lemma hyps_insert: "hyps p (insert v t) <= insert (#v) (hyps p t-{#v->false})"
   201 lemma hyps_insert: "hyps p (insert v t) \<subseteq> insert (#v) (hyps p t-{#v\<rightharpoonup>false})"
   200 by (induct p) auto
   202   by (induct p) auto
   201 
   203 
   202 text \<open>Two lemmas for use with \<open>weaken_left\<close>\<close>
   204 text \<open>Two lemmas for use with \<open>weaken_left\<close>\<close>
   203 
   205 
   204 lemma insert_Diff_same: "B-C <= insert a (B-insert a C)"
   206 lemma insert_Diff_same: "B-C \<subseteq> insert a (B-insert a C)"
   205 by fast
   207   by fast
   206 
   208 
   207 lemma insert_Diff_subset2: "insert a (B-{c}) - D <= insert a (B-insert c D)"
   209 lemma insert_Diff_subset2: "insert a (B-{c}) - D \<subseteq> insert a (B-insert c D)"
   208 by fast
   210   by fast
   209 
   211 
   210 text \<open>
   212 text \<open>
   211   The set \<^term>\<open>hyps p t\<close> is finite, and elements have the form
   213   The set \<^term>\<open>hyps p t\<close> is finite, and elements have the form
   212   \<^term>\<open>#v\<close> or \<^term>\<open>#v->Fls\<close>.
   214   \<^term>\<open>#v\<close> or \<^term>\<open>#v\<rightharpoonup>Fls\<close>.
   213 \<close>
   215 \<close>
   214 
   216 
   215 lemma hyps_finite: "finite(hyps p t)"
   217 lemma hyps_finite: "finite(hyps p t)"
   216 by (induct p) auto
   218   by (induct p) auto
   217 
   219 
   218 lemma hyps_subset: "hyps p t <= (UN v. {#v, #v->false})"
   220 lemma hyps_subset: "hyps p t \<subseteq> (UN v. {#v, #v\<rightharpoonup>false})"
   219 by (induct p) auto
   221   by (induct p) auto
   220 
   222 
   221 lemma Diff_weaken_left: "A \<subseteq> C \<Longrightarrow> A - B |- p \<Longrightarrow> C - B |- p"
   223 lemma Diff_weaken_left: "A \<subseteq> C \<Longrightarrow> A - B \<turnstile> p \<Longrightarrow> C - B \<turnstile> p"
   222   by (rule Diff_mono [OF _ subset_refl, THEN weaken_left])
   224   by (rule Diff_mono [OF _ subset_refl, THEN weaken_left])
   223 
   225 
   224 
   226 
   225 subsubsection \<open>Completeness theorem\<close>
   227 subsubsection \<open>Completeness theorem\<close>
   226 
   228 
   227 text \<open>
   229 text \<open>
   228   Induction on the finite set of assumptions \<^term>\<open>hyps p t0\<close>.  We
   230   Induction on the finite set of assumptions \<^term>\<open>hyps p t0\<close>.  We
   229   may repeatedly subtract assumptions until none are left!
   231   may repeatedly subtract assumptions until none are left!
   230 \<close>
   232 \<close>
   231 
   233 
   232 lemma completeness_0_lemma:
   234 lemma completeness_0: 
   233     "{} |= p ==> \<forall>t. hyps p t - hyps p t0 |- p"
   235   assumes "{} \<Turnstile> p"
   234 apply (rule hyps_subset [THEN hyps_finite [THEN finite_subset_induct]])
   236   shows "{} \<turnstile> p"
   235  apply (simp add: sat_thms_p, safe)
   237 proof -
   236  txt\<open>Case \<open>hyps p t-insert(#v,Y) |- p\<close>\<close>
   238   { fix t t0
   237  apply (iprover intro: thms_excluded_middle_rule
   239     have "hyps p t - hyps p t0 \<turnstile> p"
   238                      insert_Diff_same [THEN weaken_left]
   240       using hyps_finite hyps_subset
   239                      insert_Diff_subset2 [THEN weaken_left]
   241     proof (induction arbitrary: t rule: finite_subset_induct)
   240                      hyps_Diff [THEN Diff_weaken_left])
   242       case empty
   241 txt\<open>Case \<open>hyps p t-insert(#v -> false,Y) |- p\<close>\<close>
   243       then show ?case
   242  apply (iprover intro: thms_excluded_middle_rule
   244         by (simp add: assms sat_thms_p)
   243                      insert_Diff_same [THEN weaken_left]
   245     next
   244                      insert_Diff_subset2 [THEN weaken_left]
   246       case (insert q H)
   245                      hyps_insert [THEN Diff_weaken_left])
   247       then consider v where "q = #v" | v where "q = #v \<rightharpoonup> false"
   246 done
   248         by blast
   247 
   249       then show ?case
   248 text\<open>The base case for completeness\<close>
   250       proof cases
   249 lemma completeness_0:  "{} |= p ==> {} |- p"
   251         case 1
   250   by (metis Diff_cancel completeness_0_lemma)
   252         then show ?thesis
       
   253           by (metis (no_types, lifting) insert.IH thms_excluded_middle_rule insert_Diff_same 
       
   254               insert_Diff_subset2 weaken_left Diff_weaken_left hyps_Diff)
       
   255       next
       
   256         case 2
       
   257         then show ?thesis
       
   258           by (metis (no_types, lifting) insert.IH thms_excluded_middle_rule insert_Diff_same 
       
   259               insert_Diff_subset2 weaken_left Diff_weaken_left hyps_insert)
       
   260       qed
       
   261     qed
       
   262   }
       
   263   then show ?thesis
       
   264     by (metis Diff_cancel)
       
   265 qed
   251 
   266 
   252 text\<open>A semantic analogue of the Deduction Theorem\<close>
   267 text\<open>A semantic analogue of the Deduction Theorem\<close>
   253 lemma sat_imp: "insert p H |= q ==> H |= p->q"
   268 lemma sat_imp: "insert p H \<Turnstile> q \<Longrightarrow> H \<Turnstile> p\<rightharpoonup>q"
   254 by (auto simp: sat_def)
   269   by (auto simp: sat_def)
   255 
   270 
   256 theorem completeness: "finite H ==> H |= p ==> H |- p"
   271 theorem completeness: "finite H \<Longrightarrow> H \<Turnstile> p \<Longrightarrow> H \<turnstile> p"
   257 apply (induct arbitrary: p rule: finite_induct)
   272 proof (induction arbitrary: p rule: finite_induct)
   258  apply (blast intro: completeness_0)
   273   case empty
   259 apply (iprover intro: sat_imp thms.H insertI1 weaken_left_insert [THEN thms.MP])
   274   then show ?case
   260 done
   275     by (simp add: completeness_0)
   261 
   276 next
   262 theorem syntax_iff_semantics: "finite H ==> (H |- p) = (H |= p)"
   277   case insert
   263 by (blast intro: soundness completeness)
   278   then show ?case
       
   279     by (meson H MP insertI1 sat_imp weaken_left_insert)
       
   280 qed
       
   281 
       
   282 theorem syntax_iff_semantics: "finite H \<Longrightarrow> (H \<turnstile> p) = (H \<Turnstile> p)"
       
   283   by (blast intro: soundness completeness)
   264 
   284 
   265 end
   285 end