src/ZF/qpair.ML
changeset 55 331d93292ee0
parent 6 8ce8c4d13d4d
equal deleted inserted replaced
54:3dea30013b58 55:331d93292ee0
   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))";