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 |