src/ZF/OrdQuant.thy
changeset 13169 394a6c649547
parent 13162 660a71e712af
child 13170 9e23faed6c97
equal deleted inserted replaced
13168:afcbca3498b0 13169:394a6c649547
    37 
    37 
    38 
    38 
    39 (** simplification of the new quantifiers **)
    39 (** simplification of the new quantifiers **)
    40 
    40 
    41 
    41 
    42 (*MOST IMPORTANT that this is added to the simpset BEFORE OrdQuant.ML
    42 (*MOST IMPORTANT that this is added to the simpset BEFORE Ord_atomize
    43   is loaded: it's Ord_atomize would convert this rule to 
    43   is proved.  Ord_atomize would convert this rule to 
    44     x < 0 ==> P(x) == True, which causes dire effects!*)
    44     x < 0 ==> P(x) == True, which causes dire effects!*)
    45 lemma [simp]: "(ALL x<0. P(x))"
    45 lemma [simp]: "(ALL x<0. P(x))"
    46 by (simp add: oall_def) 
    46 by (simp add: oall_def) 
    47 
    47 
    48 lemma [simp]: "~(EX x<0. P(x))"
    48 lemma [simp]: "~(EX x<0. P(x))"
   197 (*So that rule_format will get rid of ALL x<A...*)
   197 (*So that rule_format will get rid of ALL x<A...*)
   198 lemma atomize_oall [symmetric, rulify]:
   198 lemma atomize_oall [symmetric, rulify]:
   199      "(!!x. x<A ==> P(x)) == Trueprop (ALL x<A. P(x))"
   199      "(!!x. x<A ==> P(x)) == Trueprop (ALL x<A. P(x))"
   200 by (simp add: oall_def atomize_all atomize_imp)
   200 by (simp add: oall_def atomize_all atomize_imp)
   201 
   201 
       
   202 (*** universal quantifier for ordinals ***)
       
   203 
       
   204 lemma oallI [intro!]:
       
   205     "[| !!x. x<A ==> P(x) |] ==> ALL x<A. P(x)"
       
   206 by (simp add: oall_def); 
       
   207 
       
   208 lemma ospec: "[| ALL x<A. P(x);  x<A |] ==> P(x)"
       
   209 by (simp add: oall_def); 
       
   210 
       
   211 lemma oallE:
       
   212     "[| ALL x<A. P(x);  P(x) ==> Q;  ~x<A ==> Q |] ==> Q"
       
   213 apply (simp add: oall_def); 
       
   214 apply (blast intro: elim:); 
       
   215 done
       
   216 
       
   217 lemma rev_oallE [elim]:
       
   218     "[| ALL x<A. P(x);  ~x<A ==> Q;  P(x) ==> Q |] ==> Q"
       
   219 apply (simp add: oall_def);
       
   220 apply (blast intro: elim:);  
       
   221 done
       
   222 
       
   223 
       
   224 (*Trival rewrite rule;   (ALL x<a.P)<->P holds only if a is not 0!*)
       
   225 lemma oall_simp [simp]: "(ALL x<a. True) <-> True"
       
   226 apply (blast intro: elim:); 
       
   227 done
       
   228 
       
   229 (*Congruence rule for rewriting*)
       
   230 lemma oall_cong [cong]:
       
   231     "[| a=a';  !!x. x<a' ==> P(x) <-> P'(x) |] ==> oall(a,P) <-> oall(a',P')"
       
   232 by (simp add: oall_def)
       
   233 
       
   234 
       
   235 (*** existential quantifier for ordinals ***)
       
   236 
       
   237 lemma oexI [intro]:
       
   238     "[| P(x);  x<A |] ==> EX x<A. P(x)"
       
   239 apply (simp add: oex_def); 
       
   240 apply (blast intro: elim:); 
       
   241 done
       
   242 
       
   243 (*Not of the general form for such rules; ~EX has become ALL~ *)
       
   244 lemma oexCI:
       
   245    "[| ALL x<A. ~P(x) ==> P(a);  a<A |] ==> EX x<A. P(x)"
       
   246 apply (simp add: oex_def); 
       
   247 apply (blast intro: elim:); 
       
   248 done
       
   249 
       
   250 lemma oexE [elim!]:
       
   251     "[| EX x<A. P(x);  !!x. [| x<A; P(x) |] ==> Q |] ==> Q"
       
   252 apply (simp add: oex_def); 
       
   253 apply (blast intro: elim:); 
       
   254 done
       
   255 
       
   256 lemma oex_cong [cong]:
       
   257     "[| a=a';  !!x. x<a' ==> P(x) <-> P'(x) |] ==> oex(a,P) <-> oex(a',P')"
       
   258 apply (simp add: oex_def cong add: conj_cong)
       
   259 done
       
   260 
       
   261 
       
   262 (*** Rules for Ordinal-Indexed Unions ***)
       
   263 
       
   264 lemma OUN_I [intro]: "[| a<i;  b: B(a) |] ==> b: (UN z<i. B(z))"
       
   265 apply (unfold OUnion_def lt_def)
       
   266 apply (blast)
       
   267 done
       
   268 
       
   269 lemma OUN_E [elim!]:
       
   270     "[| b : (UN z<i. B(z));  !!a.[| b: B(a);  a<i |] ==> R |] ==> R"
       
   271 apply (unfold OUnion_def lt_def)
       
   272 apply (blast)
       
   273 done
       
   274 
       
   275 lemma OUN_iff: "b : (UN x<i. B(x)) <-> (EX x<i. b : B(x))"
       
   276 apply (unfold OUnion_def oex_def lt_def)
       
   277 apply (blast intro: elim:); 
       
   278 done
       
   279 
       
   280 lemma OUN_cong [cong]:
       
   281     "[| i=j;  !!x. x<j ==> C(x)=D(x) |] ==> (UN x<i. C(x)) = (UN x<j. D(x))"
       
   282 by (simp add: OUnion_def lt_def OUN_iff)
       
   283 
       
   284 declare ltD [THEN beta, simp]
       
   285 
       
   286 
       
   287 lemma lt_induct: 
       
   288     "[| i<k;  !!x.[| x<k;  ALL y<x. P(y) |] ==> P(x) |]  ==>  P(i)"
       
   289 apply (simp add: lt_def oall_def)
       
   290 apply (erule conjE) 
       
   291 apply (erule Ord_induct, assumption)
       
   292 apply (blast intro: elim:); 
       
   293 done
       
   294 
       
   295 ML
       
   296 {*
       
   297 val oall_def = thm "oall_def"
       
   298 val oex_def = thm "oex_def"
       
   299 val OUnion_def = thm "OUnion_def"
       
   300 
       
   301 val oallI = thm "oallI";
       
   302 val ospec = thm "ospec";
       
   303 val oallE = thm "oallE";
       
   304 val rev_oallE = thm "rev_oallE";
       
   305 val oall_simp = thm "oall_simp";
       
   306 val oall_cong = thm "oall_cong";
       
   307 val oexI = thm "oexI";
       
   308 val oexCI = thm "oexCI";
       
   309 val oexE = thm "oexE";
       
   310 val oex_cong = thm "oex_cong";
       
   311 val OUN_I = thm "OUN_I";
       
   312 val OUN_E = thm "OUN_E";
       
   313 val OUN_iff = thm "OUN_iff";
       
   314 val OUN_cong = thm "OUN_cong";
       
   315 val lt_induct = thm "lt_induct";
       
   316 
       
   317 val Ord_atomize =
       
   318     atomize (("OrdQuant.oall", [ospec])::ZF_conn_pairs, ZF_mem_pairs);
       
   319 simpset_ref() := simpset() setmksimps (map mk_eq o Ord_atomize o gen_all);
       
   320 *}
       
   321 
   202 end
   322 end