src/ZF/Constructible/Relative.thy
changeset 13397 6e5f4d911435
parent 13382 b37764a46b16
child 13418 7c0ba9dba978
equal deleted inserted replaced
13396:11219ca224ab 13397:6e5f4d911435
    61   is_sum :: "[i=>o,i,i,i] => o"
    61   is_sum :: "[i=>o,i,i,i] => o"
    62     "is_sum(M,A,B,Z) == 
    62     "is_sum(M,A,B,Z) == 
    63        \<exists>A0[M]. \<exists>n1[M]. \<exists>s1[M]. \<exists>B1[M]. 
    63        \<exists>A0[M]. \<exists>n1[M]. \<exists>s1[M]. \<exists>B1[M]. 
    64        number1(M,n1) & cartprod(M,n1,A,A0) & upair(M,n1,n1,s1) &
    64        number1(M,n1) & cartprod(M,n1,A,A0) & upair(M,n1,n1,s1) &
    65        cartprod(M,s1,B,B1) & union(M,A0,B1,Z)"
    65        cartprod(M,s1,B,B1) & union(M,A0,B1,Z)"
       
    66 
       
    67   is_Inl :: "[i=>o,i,i] => o"
       
    68     "is_Inl(M,a,z) == \<exists>zero[M]. empty(M,zero) & pair(M,zero,a,z)"
       
    69 
       
    70   is_Inr :: "[i=>o,i,i] => o"
       
    71     "is_Inr(M,a,z) == \<exists>n1[M]. number1(M,n1) & pair(M,n1,a,z)"
    66 
    72 
    67   is_converse :: "[i=>o,i,i] => o"
    73   is_converse :: "[i=>o,i,i] => o"
    68     "is_converse(M,r,z) == 
    74     "is_converse(M,r,z) == 
    69 	\<forall>x[M]. x \<in> z <-> 
    75 	\<forall>x[M]. x \<in> z <-> 
    70              (\<exists>w[M]. w\<in>r & (\<exists>u[M]. \<exists>v[M]. pair(M,u,v,w) & pair(M,v,u,x)))"
    76              (\<exists>w[M]. w\<in>r & (\<exists>u[M]. \<exists>v[M]. pair(M,u,v,w) & pair(M,v,u,x)))"
   897 
   903 
   898 lemma (in M_axioms) sum_abs [simp]:
   904 lemma (in M_axioms) sum_abs [simp]:
   899      "[| M(A); M(B); M(Z) |] ==> is_sum(M,A,B,Z) <-> (Z = A+B)"
   905      "[| M(A); M(B); M(Z) |] ==> is_sum(M,A,B,Z) <-> (Z = A+B)"
   900 by (simp add: is_sum_def sum_def singleton_0 nat_into_M)
   906 by (simp add: is_sum_def sum_def singleton_0 nat_into_M)
   901 
   907 
       
   908 lemma (in M_triv_axioms) Inl_in_M_iff [iff]:
       
   909      "M(Inl(a)) <-> M(a)"
       
   910 by (simp add: Inl_def) 
       
   911 
       
   912 lemma (in M_triv_axioms) Inl_abs [simp]:
       
   913      "M(Z) ==> is_Inl(M,a,Z) <-> (Z = Inl(a))"
       
   914 by (simp add: is_Inl_def Inl_def)
       
   915 
       
   916 lemma (in M_triv_axioms) Inr_in_M_iff [iff]:
       
   917      "M(Inr(a)) <-> M(a)"
       
   918 by (simp add: Inr_def) 
       
   919 
       
   920 lemma (in M_triv_axioms) Inr_abs [simp]:
       
   921      "M(Z) ==> is_Inr(M,a,Z) <-> (Z = Inr(a))"
       
   922 by (simp add: is_Inr_def Inr_def)
       
   923 
   902 
   924 
   903 subsubsection {*converse of a relation*}
   925 subsubsection {*converse of a relation*}
   904 
   926 
   905 lemma (in M_axioms) M_converse_iff:
   927 lemma (in M_axioms) M_converse_iff:
   906      "M(r) ==> 
   928      "M(r) ==> 
  1156 apply (induct_tac n, simp)
  1178 apply (induct_tac n, simp)
  1157 apply (simp add: funspace_succ nat_into_M) 
  1179 apply (simp add: funspace_succ nat_into_M) 
  1158 done
  1180 done
  1159 
  1181 
  1160 
  1182 
       
  1183 subsection{*Relativization and Absoluteness for List Operators*}
       
  1184 
       
  1185 constdefs
       
  1186 
       
  1187   is_Nil :: "[i=>o, i] => o"
       
  1188      --{* because @{term "[] \<equiv> Inl(0)"}*}
       
  1189     "is_Nil(M,xs) == \<exists>zero[M]. empty(M,zero) & is_Inl(M,zero,xs)"
       
  1190 
       
  1191   is_Cons :: "[i=>o,i,i,i] => o"
       
  1192      --{* because @{term "Cons(a, l) \<equiv> Inr(\<langle>a,l\<rangle>)"}*}
       
  1193     "is_Cons(M,a,l,Z) == \<exists>p[M]. pair(M,a,l,p) & is_Inr(M,p,Z)"
       
  1194 
       
  1195 
       
  1196 lemma (in M_triv_axioms) Nil_in_M [intro,simp]: "M(Nil)"
       
  1197 by (simp add: Nil_def)
       
  1198 
       
  1199 lemma (in M_triv_axioms) Nil_abs [simp]: "M(Z) ==> is_Nil(M,Z) <-> (Z = Nil)"
       
  1200 by (simp add: is_Nil_def Nil_def)
       
  1201 
       
  1202 lemma (in M_triv_axioms) Cons_in_M_iff [iff]: "M(Cons(a,l)) <-> M(a) & M(l)"
       
  1203 by (simp add: Cons_def) 
       
  1204 
       
  1205 lemma (in M_triv_axioms) Cons_abs [simp]:
       
  1206      "[|M(a); M(l); M(Z)|] ==> is_Cons(M,a,l,Z) <-> (Z = Cons(a,l))"
       
  1207 by (simp add: is_Cons_def Cons_def)
       
  1208 
       
  1209 
       
  1210 constdefs
       
  1211 
       
  1212   quasilist :: "i => o"
       
  1213     "quasilist(xs) == xs=Nil | (\<exists>x l. xs = Cons(x,l))"
       
  1214 
       
  1215   is_quasilist :: "[i=>o,i] => o"
       
  1216     "is_quasilist(M,z) == is_Nil(M,z) | (\<exists>x[M]. \<exists>l[M]. is_Cons(M,x,l,z))"
       
  1217 
       
  1218   list_case' :: "[i, [i,i]=>i, i] => i"
       
  1219     --{*A version of @{term list_case} that's always defined.*}
       
  1220     "list_case'(a,b,xs) == 
       
  1221        if quasilist(xs) then list_case(a,b,xs) else 0"  
       
  1222 
       
  1223   is_list_case :: "[i=>o, i, [i,i,i]=>o, i, i] => o"
       
  1224     --{*Returns 0 for non-lists*}
       
  1225     "is_list_case(M, a, is_b, xs, z) == 
       
  1226        (is_Nil(M,xs) --> z=a) &
       
  1227        (\<forall>x[M]. \<forall>l[M]. is_Cons(M,x,l,xs) --> is_b(x,l,z)) &
       
  1228        (is_quasilist(M,xs) | empty(M,z))"
       
  1229 
       
  1230   hd' :: "i => i"
       
  1231     --{*A version of @{term hd} that's always defined.*}
       
  1232     "hd'(xs) == if quasilist(xs) then hd(xs) else 0"  
       
  1233 
       
  1234   tl' :: "i => i"
       
  1235     --{*A version of @{term tl} that's always defined.*}
       
  1236     "tl'(xs) == if quasilist(xs) then tl(xs) else 0"  
       
  1237 
       
  1238   is_hd :: "[i=>o,i,i] => o"
       
  1239      --{* @{term "hd([]) = 0"} no constraints if not a list.
       
  1240           Avoiding implication prevents the simplifier's looping.*}
       
  1241     "is_hd(M,xs,H) == 
       
  1242        (is_Nil(M,xs) --> empty(M,H)) &
       
  1243        (\<forall>x[M]. \<forall>l[M]. ~ is_Cons(M,x,l,xs) | H=x) &
       
  1244        (is_quasilist(M,xs) | empty(M,H))"
       
  1245 
       
  1246   is_tl :: "[i=>o,i,i] => o"
       
  1247      --{* @{term "tl([]) = []"}; see comments about @{term is_hd}*}
       
  1248     "is_tl(M,xs,T) == 
       
  1249        (is_Nil(M,xs) --> T=xs) &
       
  1250        (\<forall>x[M]. \<forall>l[M]. ~ is_Cons(M,x,l,xs) | T=l) &
       
  1251        (is_quasilist(M,xs) | empty(M,T))"
       
  1252 
       
  1253 subsubsection{*@{term quasilist}: For Case-Splitting with @{term list_case'}*}
       
  1254 
       
  1255 lemma [iff]: "quasilist(Nil)"
       
  1256 by (simp add: quasilist_def)
       
  1257 
       
  1258 lemma [iff]: "quasilist(Cons(x,l))"
       
  1259 by (simp add: quasilist_def)
       
  1260 
       
  1261 lemma list_imp_quasilist: "l \<in> list(A) ==> quasilist(l)"
       
  1262 by (erule list.cases, simp_all)
       
  1263 
       
  1264 subsubsection{*@{term list_case'}, the Modified Version of @{term list_case}*}
       
  1265 
       
  1266 lemma list_case'_Nil [simp]: "list_case'(a,b,Nil) = a"
       
  1267 by (simp add: list_case'_def quasilist_def)
       
  1268 
       
  1269 lemma list_case'_Cons [simp]: "list_case'(a,b,Cons(x,l)) = b(x,l)"
       
  1270 by (simp add: list_case'_def quasilist_def)
       
  1271 
       
  1272 lemma non_list_case: "~ quasilist(x) ==> list_case'(a,b,x) = 0" 
       
  1273 by (simp add: quasilist_def list_case'_def) 
       
  1274 
       
  1275 lemma list_case'_eq_list_case [simp]:
       
  1276      "xs \<in> list(A) ==>list_case'(a,b,xs) = list_case(a,b,xs)"
       
  1277 by (erule list.cases, simp_all)
       
  1278 
       
  1279 lemma (in M_axioms) list_case'_closed [intro,simp]:
       
  1280   "[|M(k); M(a); \<forall>x[M]. \<forall>y[M]. M(b(x,y))|] ==> M(list_case'(a,b,k))"
       
  1281 apply (case_tac "quasilist(k)") 
       
  1282  apply (simp add: quasilist_def, force) 
       
  1283 apply (simp add: non_list_case) 
       
  1284 done
       
  1285 
       
  1286 lemma (in M_triv_axioms) quasilist_abs [simp]: 
       
  1287      "M(z) ==> is_quasilist(M,z) <-> quasilist(z)"
       
  1288 by (auto simp add: is_quasilist_def quasilist_def)
       
  1289 
       
  1290 lemma (in M_triv_axioms) list_case_abs [simp]: 
       
  1291      "[| relativize2(M,is_b,b); M(k); M(z) |] 
       
  1292       ==> is_list_case(M,a,is_b,k,z) <-> z = list_case'(a,b,k)"
       
  1293 apply (case_tac "quasilist(k)") 
       
  1294  prefer 2 
       
  1295  apply (simp add: is_list_case_def non_list_case) 
       
  1296  apply (force simp add: quasilist_def) 
       
  1297 apply (simp add: quasilist_def is_list_case_def)
       
  1298 apply (elim disjE exE) 
       
  1299  apply (simp_all add: relativize2_def) 
       
  1300 done
       
  1301 
       
  1302 
       
  1303 subsubsection{*The Modified Operators @{term hd'} and @{term tl'}*}
       
  1304 
       
  1305 lemma (in M_triv_axioms) is_hd_Nil: "is_hd(M,[],Z) <-> empty(M,Z)"
       
  1306 by (simp add: is_hd_def )
       
  1307 
       
  1308 lemma (in M_triv_axioms) is_hd_Cons:
       
  1309      "[|M(a); M(l)|] ==> is_hd(M,Cons(a,l),Z) <-> Z = a"
       
  1310 by (force simp add: is_hd_def ) 
       
  1311 
       
  1312 lemma (in M_triv_axioms) hd_abs [simp]:
       
  1313      "[|M(x); M(y)|] ==> is_hd(M,x,y) <-> y = hd'(x)"
       
  1314 apply (simp add: hd'_def)
       
  1315 apply (intro impI conjI)
       
  1316  prefer 2 apply (force simp add: is_hd_def) 
       
  1317 apply (simp add: quasilist_def is_hd_def )
       
  1318 apply (elim disjE exE, auto)
       
  1319 done 
       
  1320 
       
  1321 lemma (in M_triv_axioms) is_tl_Nil: "is_tl(M,[],Z) <-> Z = []"
       
  1322 by (simp add: is_tl_def )
       
  1323 
       
  1324 lemma (in M_triv_axioms) is_tl_Cons:
       
  1325      "[|M(a); M(l)|] ==> is_tl(M,Cons(a,l),Z) <-> Z = l"
       
  1326 by (force simp add: is_tl_def ) 
       
  1327 
       
  1328 lemma (in M_triv_axioms) tl_abs [simp]:
       
  1329      "[|M(x); M(y)|] ==> is_tl(M,x,y) <-> y = tl'(x)"
       
  1330 apply (simp add: tl'_def)
       
  1331 apply (intro impI conjI)
       
  1332  prefer 2 apply (force simp add: is_tl_def) 
       
  1333 apply (simp add: quasilist_def is_tl_def )
       
  1334 apply (elim disjE exE, auto)
       
  1335 done 
       
  1336 
       
  1337 lemma (in M_triv_axioms) relativize1_tl: "relativize1(M, is_tl(M), tl')"  
       
  1338 by (simp add: relativize1_def)
       
  1339 
       
  1340 lemma hd'_Nil: "hd'([]) = 0"
       
  1341 by (simp add: hd'_def)
       
  1342 
       
  1343 lemma hd'_Cons: "hd'(Cons(a,l)) = a"
       
  1344 by (simp add: hd'_def)
       
  1345 
       
  1346 lemma tl'_Nil: "tl'([]) = []"
       
  1347 by (simp add: tl'_def)
       
  1348 
       
  1349 lemma tl'_Cons: "tl'(Cons(a,l)) = l"
       
  1350 by (simp add: tl'_def)
       
  1351 
       
  1352 lemma iterates_tl_Nil: "n \<in> nat ==> tl'^n ([]) = []"
       
  1353 apply (induct_tac n) 
       
  1354 apply (simp_all add: tl'_Nil) 
       
  1355 done
       
  1356 
       
  1357 lemma (in M_axioms) tl'_closed: "M(x) ==> M(tl'(x))"
       
  1358 apply (simp add: tl'_def)
       
  1359 apply (force simp add: quasilist_def)
       
  1360 done
       
  1361 
       
  1362 
  1161 end
  1363 end