180 by (rtac (major RS UnE) 1); |
180 by (rtac (major RS UnE) 1); |
181 by (REPEAT (rtac refl 1 |
181 by (REPEAT (rtac refl 1 |
182 ORELSE eresolve_tac (prems@[QSigmaE,singletonE,ssubst]) 1)); |
182 ORELSE eresolve_tac (prems@[QSigmaE,singletonE,ssubst]) 1)); |
183 val qsumE = result(); |
183 val qsumE = result(); |
184 |
184 |
185 (** QInjection and freeness rules **) |
|
186 |
|
187 val [major] = goalw QPair.thy qsum_defs "QInl(a)=QInl(b) ==> a=b"; |
|
188 by (EVERY1 [rtac (major RS QPair_inject), assume_tac]); |
|
189 val QInl_inject = result(); |
|
190 |
|
191 val [major] = goalw QPair.thy qsum_defs "QInr(a)=QInr(b) ==> a=b"; |
|
192 by (EVERY1 [rtac (major RS QPair_inject), assume_tac]); |
|
193 val QInr_inject = result(); |
|
194 |
|
195 val [major] = goalw QPair.thy qsum_defs "QInl(a)=QInr(b) ==> P"; |
|
196 by (rtac (major RS QPair_inject) 1); |
|
197 by (etac (sym RS one_neq_0) 1); |
|
198 val QInl_neq_QInr = result(); |
|
199 |
|
200 val QInr_neq_QInl = sym RS QInl_neq_QInr; |
|
201 |
|
202 (** Injection and freeness equivalences, for rewriting **) |
185 (** Injection and freeness equivalences, for rewriting **) |
203 |
186 |
204 goal QPair.thy "QInl(a)=QInl(b) <-> a=b"; |
187 goalw QPair.thy qsum_defs "QInl(a)=QInl(b) <-> a=b"; |
205 by (rtac iffI 1); |
188 by (simp_tac (ZF_ss addsimps [QPair_iff]) 1); |
206 by (REPEAT (eresolve_tac [QInl_inject,subst_context] 1)); |
|
207 val QInl_iff = result(); |
189 val QInl_iff = result(); |
208 |
190 |
209 goal QPair.thy "QInr(a)=QInr(b) <-> a=b"; |
191 goalw QPair.thy qsum_defs "QInr(a)=QInr(b) <-> a=b"; |
210 by (rtac iffI 1); |
192 by (simp_tac (ZF_ss addsimps [QPair_iff]) 1); |
211 by (REPEAT (eresolve_tac [QInr_inject,subst_context] 1)); |
|
212 val QInr_iff = result(); |
193 val QInr_iff = result(); |
213 |
194 |
214 goal QPair.thy "QInl(a)=QInr(b) <-> False"; |
195 goalw QPair.thy qsum_defs "QInl(a)=QInr(b) <-> False"; |
215 by (rtac iffI 1); |
196 by (simp_tac (ZF_ss addsimps [QPair_iff, one_not_0 RS not_sym]) 1); |
216 by (REPEAT (eresolve_tac [QInl_neq_QInr,FalseE] 1)); |
|
217 val QInl_QInr_iff = result(); |
197 val QInl_QInr_iff = result(); |
218 |
198 |
219 goal QPair.thy "QInr(b)=QInl(a) <-> False"; |
199 goalw QPair.thy qsum_defs "QInr(b)=QInl(a) <-> False"; |
220 by (rtac iffI 1); |
200 by (simp_tac (ZF_ss addsimps [QPair_iff, one_not_0]) 1); |
221 by (REPEAT (eresolve_tac [QInr_neq_QInl,FalseE] 1)); |
|
222 val QInr_QInl_iff = result(); |
201 val QInr_QInl_iff = result(); |
|
202 |
|
203 (*Injection and freeness rules*) |
|
204 |
|
205 val QInl_inject = standard (QInl_iff RS iffD1); |
|
206 val QInr_inject = standard (QInr_iff RS iffD1); |
|
207 val QInl_neq_QInr = standard (QInl_QInr_iff RS iffD1 RS FalseE); |
|
208 val QInr_neq_QInl = standard (QInr_QInl_iff RS iffD1 RS FalseE); |
223 |
209 |
224 val qsum_cs = |
210 val qsum_cs = |
225 ZF_cs addIs [QInlI,QInrI] addSEs [qsumE,QInl_neq_QInr,QInr_neq_QInl] |
211 ZF_cs addIs [QInlI,QInrI] addSEs [qsumE,QInl_neq_QInr,QInr_neq_QInl] |
226 addSDs [QInl_inject,QInr_inject]; |
212 addSDs [QInl_inject,QInr_inject]; |
|
213 |
|
214 goal QPair.thy "!!A B. QInl(a): A<+>B ==> a: A"; |
|
215 by (fast_tac qsum_cs 1); |
|
216 val QInlD = result(); |
|
217 |
|
218 goal QPair.thy "!!A B. QInr(b): A<+>B ==> b: B"; |
|
219 by (fast_tac qsum_cs 1); |
|
220 val QInrD = result(); |
227 |
221 |
228 (** <+> is itself injective... who cares?? **) |
222 (** <+> is itself injective... who cares?? **) |
229 |
223 |
230 goal QPair.thy |
224 goal QPair.thy |
231 "u: A <+> B <-> (EX x. x:A & u=QInl(x)) | (EX y. y:B & u=QInr(y))"; |
225 "u: A <+> B <-> (EX x. x:A & u=QInl(x)) | (EX y. y:B & u=QInr(y))"; |