src/ZF/Constructible/Relative.thy
changeset 13634 99a593b49b04
parent 13628 87482b5e3f2e
child 13687 22dce9134953
equal deleted inserted replaced
13633:b03a36b8d528 13634:99a593b49b04
     1 (*  Title:      ZF/Constructible/Relative.thy
     1 (*  Title:      ZF/Constructible/Relative.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
     3     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
     4     Copyright   2002  University of Cambridge
       
     5 *)
     4 *)
     6 
     5 
     7 header {*Relativization and Absoluteness*}
     6 header {*Relativization and Absoluteness*}
     8 
     7 
     9 theory Relative = Main:
     8 theory Relative = Main:
   195     "is_nat_case(M, a, is_b, k, z) ==
   194     "is_nat_case(M, a, is_b, k, z) ==
   196        (empty(M,k) --> z=a) &
   195        (empty(M,k) --> z=a) &
   197        (\<forall>m[M]. successor(M,m,k) --> is_b(m,z)) &
   196        (\<forall>m[M]. successor(M,m,k) --> is_b(m,z)) &
   198        (is_quasinat(M,k) | empty(M,z))"
   197        (is_quasinat(M,k) | empty(M,z))"
   199 
   198 
   200   relativize1 :: "[i=>o, [i,i]=>o, i=>i] => o"
   199   relation1 :: "[i=>o, [i,i]=>o, i=>i] => o"
   201     "relativize1(M,is_f,f) == \<forall>x[M]. \<forall>y[M]. is_f(x,y) <-> y = f(x)"
   200     "relation1(M,is_f,f) == \<forall>x[M]. \<forall>y[M]. is_f(x,y) <-> y = f(x)"
   202 
   201 
   203   Relativize1 :: "[i=>o, i, [i,i]=>o, i=>i] => o"
   202   Relation1 :: "[i=>o, i, [i,i]=>o, i=>i] => o"
   204     --{*as above, but typed*}
   203     --{*as above, but typed*}
   205     "Relativize1(M,A,is_f,f) ==
   204     "Relation1(M,A,is_f,f) ==
   206         \<forall>x[M]. \<forall>y[M]. x\<in>A --> is_f(x,y) <-> y = f(x)"
   205         \<forall>x[M]. \<forall>y[M]. x\<in>A --> is_f(x,y) <-> y = f(x)"
   207 
   206 
   208   relativize2 :: "[i=>o, [i,i,i]=>o, [i,i]=>i] => o"
   207   relation2 :: "[i=>o, [i,i,i]=>o, [i,i]=>i] => o"
   209     "relativize2(M,is_f,f) == \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. is_f(x,y,z) <-> z = f(x,y)"
   208     "relation2(M,is_f,f) == \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. is_f(x,y,z) <-> z = f(x,y)"
   210 
   209 
   211   Relativize2 :: "[i=>o, i, i, [i,i,i]=>o, [i,i]=>i] => o"
   210   Relation2 :: "[i=>o, i, i, [i,i,i]=>o, [i,i]=>i] => o"
   212     "Relativize2(M,A,B,is_f,f) ==
   211     "Relation2(M,A,B,is_f,f) ==
   213         \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. x\<in>A --> y\<in>B --> is_f(x,y,z) <-> z = f(x,y)"
   212         \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. x\<in>A --> y\<in>B --> is_f(x,y,z) <-> z = f(x,y)"
   214 
   213 
   215   relativize3 :: "[i=>o, [i,i,i,i]=>o, [i,i,i]=>i] => o"
   214   relation3 :: "[i=>o, [i,i,i,i]=>o, [i,i,i]=>i] => o"
   216     "relativize3(M,is_f,f) ==
   215     "relation3(M,is_f,f) ==
   217        \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>u[M]. is_f(x,y,z,u) <-> u = f(x,y,z)"
   216        \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>u[M]. is_f(x,y,z,u) <-> u = f(x,y,z)"
   218 
   217 
   219   Relativize3 :: "[i=>o, i, i, i, [i,i,i,i]=>o, [i,i,i]=>i] => o"
   218   Relation3 :: "[i=>o, i, i, i, [i,i,i,i]=>o, [i,i,i]=>i] => o"
   220     "Relativize3(M,A,B,C,is_f,f) ==
   219     "Relation3(M,A,B,C,is_f,f) ==
   221        \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>u[M].
   220        \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>u[M].
   222          x\<in>A --> y\<in>B --> z\<in>C --> is_f(x,y,z,u) <-> u = f(x,y,z)"
   221          x\<in>A --> y\<in>B --> z\<in>C --> is_f(x,y,z,u) <-> u = f(x,y,z)"
   223 
   222 
   224   relativize4 :: "[i=>o, [i,i,i,i,i]=>o, [i,i,i,i]=>i] => o"
   223   relation4 :: "[i=>o, [i,i,i,i,i]=>o, [i,i,i,i]=>i] => o"
   225     "relativize4(M,is_f,f) ==
   224     "relation4(M,is_f,f) ==
   226        \<forall>u[M]. \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>a[M]. is_f(u,x,y,z,a) <-> a = f(u,x,y,z)"
   225        \<forall>u[M]. \<forall>x[M]. \<forall>y[M]. \<forall>z[M]. \<forall>a[M]. is_f(u,x,y,z,a) <-> a = f(u,x,y,z)"
   227 
   226 
   228 
   227 
   229 text{*Useful when absoluteness reasoning has replaced the predicates by terms*}
   228 text{*Useful when absoluteness reasoning has replaced the predicates by terms*}
   230 lemma triv_Relativize1:
   229 lemma triv_Relation1:
   231      "Relativize1(M, A, \<lambda>x y. y = f(x), f)"
   230      "Relation1(M, A, \<lambda>x y. y = f(x), f)"
   232 by (simp add: Relativize1_def)
   231 by (simp add: Relation1_def)
   233 
   232 
   234 lemma triv_Relativize2:
   233 lemma triv_Relation2:
   235      "Relativize2(M, A, B, \<lambda>x y a. a = f(x,y), f)"
   234      "Relation2(M, A, B, \<lambda>x y a. a = f(x,y), f)"
   236 by (simp add: Relativize2_def)
   235 by (simp add: Relation2_def)
   237 
   236 
   238 
   237 
   239 subsection {*The relativized ZF axioms*}
   238 subsection {*The relativized ZF axioms*}
   240 constdefs
   239 constdefs
   241 
   240 
   728 apply (blast intro: RepFun_closed2 dest: transM)
   727 apply (blast intro: RepFun_closed2 dest: transM)
   729 done
   728 done
   730 
   729 
   731 lemma (in M_trivial) lambda_abs2 [simp]:
   730 lemma (in M_trivial) lambda_abs2 [simp]:
   732      "[| strong_replacement(M, \<lambda>x y. x\<in>A & y = \<langle>x, b(x)\<rangle>);
   731      "[| strong_replacement(M, \<lambda>x y. x\<in>A & y = \<langle>x, b(x)\<rangle>);
   733          Relativize1(M,A,is_b,b); M(A); \<forall>m[M]. m\<in>A --> M(b(m)); M(z) |]
   732          Relation1(M,A,is_b,b); M(A); \<forall>m[M]. m\<in>A --> M(b(m)); M(z) |]
   734       ==> is_lambda(M,A,is_b,z) <-> z = Lambda(A,b)"
   733       ==> is_lambda(M,A,is_b,z) <-> z = Lambda(A,b)"
   735 apply (simp add: Relativize1_def is_lambda_def)
   734 apply (simp add: Relation1_def is_lambda_def)
   736 apply (rule iffI)
   735 apply (rule iffI)
   737  prefer 2 apply (simp add: lam_def)
   736  prefer 2 apply (simp add: lam_def)
   738 apply (rule M_equalityI)
   737 apply (rule M_equalityI)
   739   apply (simp add: lam_def)
   738   apply (simp add: lam_def)
   740  apply (simp add: lam_closed2)+
   739  apply (simp add: lam_closed2)+
   785 lemma (in M_trivial) quasinat_abs [simp]:
   784 lemma (in M_trivial) quasinat_abs [simp]:
   786      "M(z) ==> is_quasinat(M,z) <-> quasinat(z)"
   785      "M(z) ==> is_quasinat(M,z) <-> quasinat(z)"
   787 by (auto simp add: is_quasinat_def quasinat_def)
   786 by (auto simp add: is_quasinat_def quasinat_def)
   788 
   787 
   789 lemma (in M_trivial) nat_case_abs [simp]:
   788 lemma (in M_trivial) nat_case_abs [simp]:
   790      "[| relativize1(M,is_b,b); M(k); M(z) |]
   789      "[| relation1(M,is_b,b); M(k); M(z) |]
   791       ==> is_nat_case(M,a,is_b,k,z) <-> z = nat_case(a,b,k)"
   790       ==> is_nat_case(M,a,is_b,k,z) <-> z = nat_case(a,b,k)"
   792 apply (case_tac "quasinat(k)")
   791 apply (case_tac "quasinat(k)")
   793  prefer 2
   792  prefer 2
   794  apply (simp add: is_nat_case_def non_nat_case)
   793  apply (simp add: is_nat_case_def non_nat_case)
   795  apply (force simp add: quasinat_def)
   794  apply (force simp add: quasinat_def)
   796 apply (simp add: quasinat_def is_nat_case_def)
   795 apply (simp add: quasinat_def is_nat_case_def)
   797 apply (elim disjE exE)
   796 apply (elim disjE exE)
   798  apply (simp_all add: relativize1_def)
   797  apply (simp_all add: relation1_def)
   799 done
   798 done
   800 
   799 
   801 (*NOT for the simplifier.  The assumption M(z') is apparently necessary, but
   800 (*NOT for the simplifier.  The assumption M(z') is apparently necessary, but
   802   causes the error "Failed congruence proof!"  It may be better to replace
   801   causes the error "Failed congruence proof!"  It may be better to replace
   803   is_nat_case by nat_case before attempting congruence reasoning.*)
   802   is_nat_case by nat_case before attempting congruence reasoning.*)
   927   and funspace_succ_replacement:
   926   and funspace_succ_replacement:
   928      "M(n) ==>
   927      "M(n) ==>
   929       strong_replacement(M, \<lambda>p z. \<exists>f[M]. \<exists>b[M]. \<exists>nb[M]. \<exists>cnbf[M].
   928       strong_replacement(M, \<lambda>p z. \<exists>f[M]. \<exists>b[M]. \<exists>nb[M]. \<exists>cnbf[M].
   930                 pair(M,f,b,p) & pair(M,n,b,nb) & is_cons(M,nb,f,cnbf) &
   929                 pair(M,f,b,p) & pair(M,n,b,nb) & is_cons(M,nb,f,cnbf) &
   931                 upair(M,cnbf,cnbf,z))"
   930                 upair(M,cnbf,cnbf,z))"
   932   and well_ord_iso_separation:
       
   933      "[| M(A); M(f); M(r) |]
       
   934       ==> separation (M, \<lambda>x. x\<in>A --> (\<exists>y[M]. (\<exists>p[M].
       
   935 		     fun_apply(M,f,x,y) & pair(M,y,x,p) & p \<in> r)))"
       
   936   and obase_separation:
       
   937      --{*part of the order type formalization*}
       
   938      "[| M(A); M(r) |]
       
   939       ==> separation(M, \<lambda>a. \<exists>x[M]. \<exists>g[M]. \<exists>mx[M]. \<exists>par[M].
       
   940 	     ordinal(M,x) & membership(M,x,mx) & pred_set(M,A,a,r,par) &
       
   941 	     order_isomorphism(M,par,r,x,mx,g))"
       
   942   and obase_equals_separation:
       
   943      "[| M(A); M(r) |]
       
   944       ==> separation (M, \<lambda>x. x\<in>A --> ~(\<exists>y[M]. \<exists>g[M].
       
   945 			      ordinal(M,y) & (\<exists>my[M]. \<exists>pxr[M].
       
   946 			      membership(M,y,my) & pred_set(M,A,x,r,pxr) &
       
   947 			      order_isomorphism(M,pxr,r,y,my,g))))"
       
   948   and omap_replacement:
       
   949      "[| M(A); M(r) |]
       
   950       ==> strong_replacement(M,
       
   951              \<lambda>a z. \<exists>x[M]. \<exists>g[M]. \<exists>mx[M]. \<exists>par[M].
       
   952 	     ordinal(M,x) & pair(M,a,x,z) & membership(M,x,mx) &
       
   953 	     pred_set(M,A,a,r,par) & order_isomorphism(M,par,r,x,mx,g))"
       
   954   and is_recfun_separation:
   931   and is_recfun_separation:
   955      --{*for well-founded recursion*}
   932      --{*for well-founded recursion: used to prove @{text is_recfun_equal}*}
   956      "[| M(r); M(f); M(g); M(a); M(b) |]
   933      "[| M(r); M(f); M(g); M(a); M(b) |]
   957      ==> separation(M,
   934      ==> separation(M,
   958             \<lambda>x. \<exists>xa[M]. \<exists>xb[M].
   935             \<lambda>x. \<exists>xa[M]. \<exists>xb[M].
   959                 pair(M,x,a,xa) & xa \<in> r & pair(M,x,b,xb) & xb \<in> r &
   936                 pair(M,x,a,xa) & xa \<in> r & pair(M,x,b,xb) & xb \<in> r &
   960                 (\<exists>fx[M]. \<exists>gx[M]. fun_apply(M,f,x,fx) & fun_apply(M,g,x,gx) &
   937                 (\<exists>fx[M]. \<exists>gx[M]. fun_apply(M,f,x,fx) & fun_apply(M,g,x,gx) &
  1488 lemma (in M_trivial) quasilist_abs [simp]:
  1465 lemma (in M_trivial) quasilist_abs [simp]:
  1489      "M(z) ==> is_quasilist(M,z) <-> quasilist(z)"
  1466      "M(z) ==> is_quasilist(M,z) <-> quasilist(z)"
  1490 by (auto simp add: is_quasilist_def quasilist_def)
  1467 by (auto simp add: is_quasilist_def quasilist_def)
  1491 
  1468 
  1492 lemma (in M_trivial) list_case_abs [simp]:
  1469 lemma (in M_trivial) list_case_abs [simp]:
  1493      "[| relativize2(M,is_b,b); M(k); M(z) |]
  1470      "[| relation2(M,is_b,b); M(k); M(z) |]
  1494       ==> is_list_case(M,a,is_b,k,z) <-> z = list_case'(a,b,k)"
  1471       ==> is_list_case(M,a,is_b,k,z) <-> z = list_case'(a,b,k)"
  1495 apply (case_tac "quasilist(k)")
  1472 apply (case_tac "quasilist(k)")
  1496  prefer 2
  1473  prefer 2
  1497  apply (simp add: is_list_case_def non_list_case)
  1474  apply (simp add: is_list_case_def non_list_case)
  1498  apply (force simp add: quasilist_def)
  1475  apply (force simp add: quasilist_def)
  1499 apply (simp add: quasilist_def is_list_case_def)
  1476 apply (simp add: quasilist_def is_list_case_def)
  1500 apply (elim disjE exE)
  1477 apply (elim disjE exE)
  1501  apply (simp_all add: relativize2_def)
  1478  apply (simp_all add: relation2_def)
  1502 done
  1479 done
  1503 
  1480 
  1504 
  1481 
  1505 subsubsection{*The Modified Operators @{term hd'} and @{term tl'}*}
  1482 subsubsection{*The Modified Operators @{term hd'} and @{term tl'}*}
  1506 
  1483 
  1534  prefer 2 apply (force simp add: is_tl_def)
  1511  prefer 2 apply (force simp add: is_tl_def)
  1535 apply (simp add: quasilist_def is_tl_def)
  1512 apply (simp add: quasilist_def is_tl_def)
  1536 apply (elim disjE exE, auto)
  1513 apply (elim disjE exE, auto)
  1537 done
  1514 done
  1538 
  1515 
  1539 lemma (in M_trivial) relativize1_tl: "relativize1(M, is_tl(M), tl')"
  1516 lemma (in M_trivial) relation1_tl: "relation1(M, is_tl(M), tl')"
  1540 by (simp add: relativize1_def)
  1517 by (simp add: relation1_def)
  1541 
  1518 
  1542 lemma hd'_Nil: "hd'([]) = 0"
  1519 lemma hd'_Nil: "hd'([]) = 0"
  1543 by (simp add: hd'_def)
  1520 by (simp add: hd'_def)
  1544 
  1521 
  1545 lemma hd'_Cons: "hd'(Cons(a,l)) = a"
  1522 lemma hd'_Cons: "hd'(Cons(a,l)) = a"