94 \<forall>x[M]. \<forall>y[M]. \<forall>y'[M]. \<forall>p[M]. \<forall>p'[M]. |
94 \<forall>x[M]. \<forall>y[M]. \<forall>y'[M]. \<forall>p[M]. \<forall>p'[M]. |
95 pair(M,x,y,p) --> pair(M,x,y',p') --> p\<in>r --> p'\<in>r --> y=y'" |
95 pair(M,x,y,p) --> pair(M,x,y',p') --> p\<in>r --> p'\<in>r --> y=y'" |
96 |
96 |
97 fun_apply :: "[i=>o,i,i,i] => o" |
97 fun_apply :: "[i=>o,i,i,i] => o" |
98 "fun_apply(M,f,x,y) == |
98 "fun_apply(M,f,x,y) == |
99 (\<forall>y'[M]. (\<exists>u[M]. u\<in>f & pair(M,x,y',u)) <-> y=y')" |
99 (\<exists>xs[M]. \<exists>fxs[M]. |
|
100 upair(M,x,x,xs) & image(M,f,xs,fxs) & big_union(M,fxs,y))" |
100 |
101 |
101 typed_function :: "[i=>o,i,i,i] => o" |
102 typed_function :: "[i=>o,i,i,i] => o" |
102 "typed_function(M,A,B,r) == |
103 "typed_function(M,A,B,r) == |
103 is_function(M,r) & is_relation(M,r) & is_domain(M,r,A) & |
104 is_function(M,r) & is_relation(M,r) & is_domain(M,r,A) & |
104 (\<forall>u[M]. u\<in>r --> (\<forall>x[M]. \<forall>y[M]. pair(M,x,y,u) --> y\<in>B))" |
105 (\<forall>u[M]. u\<in>r --> (\<forall>x[M]. \<forall>y[M]. pair(M,x,y,u) --> y\<in>B))" |
643 apply (force simp add: quasinat_def) |
644 apply (force simp add: quasinat_def) |
644 apply (simp add: quasinat_def is_nat_case_def) |
645 apply (simp add: quasinat_def is_nat_case_def) |
645 apply (elim disjE exE) |
646 apply (elim disjE exE) |
646 apply (simp_all add: b_abs) |
647 apply (simp_all add: b_abs) |
647 done |
648 done |
|
649 |
|
650 (*Needed? surely better to replace by nat_case?*) |
|
651 lemma (in M_triv_axioms) is_nat_case_cong [cong]: |
|
652 "[| a = a'; k = k'; z = z'; M(z'); |
|
653 !!x y. [| M(x); M(y) |] ==> is_b(x,y) <-> is_b'(x,y) |] |
|
654 ==> is_nat_case(M, a, is_b, k, z) <-> is_nat_case(M, a', is_b', k', z')" |
|
655 by (simp add: is_nat_case_def) |
648 |
656 |
649 lemma (in M_triv_axioms) Inl_in_M_iff [iff]: |
657 lemma (in M_triv_axioms) Inl_in_M_iff [iff]: |
650 "M(Inl(a)) <-> M(a)" |
658 "M(Inl(a)) <-> M(a)" |
651 by (simp add: Inl_def) |
659 by (simp add: Inl_def) |
652 |
660 |
968 |
976 |
969 lemma (in M_axioms) apply_closed [intro,simp]: |
977 lemma (in M_axioms) apply_closed [intro,simp]: |
970 "[|M(f); M(a)|] ==> M(f`a)" |
978 "[|M(f); M(a)|] ==> M(f`a)" |
971 by (simp add: apply_def) |
979 by (simp add: apply_def) |
972 |
980 |
973 lemma (in M_axioms) apply_abs: |
981 lemma (in M_axioms) apply_abs [simp]: |
974 "[| function(f); M(f); M(y) |] |
982 "[| M(f); M(x); M(y) |] ==> fun_apply(M,f,x,y) <-> f`x = y" |
975 ==> fun_apply(M,f,x,y) <-> x \<in> domain(f) & f`x = y" |
983 apply (simp add: fun_apply_def apply_def) |
976 apply (simp add: fun_apply_def) |
984 apply (blast intro: elim:); |
977 apply (blast intro: function_apply_equality function_apply_Pair) |
985 done |
978 done |
|
979 |
|
980 lemma (in M_axioms) typed_apply_abs: |
|
981 "[| f \<in> A -> B; M(f); M(y) |] |
|
982 ==> fun_apply(M,f,x,y) <-> x \<in> A & f`x = y" |
|
983 by (simp add: apply_abs fun_is_function domain_of_fun) |
|
984 |
986 |
985 lemma (in M_axioms) typed_function_abs [simp]: |
987 lemma (in M_axioms) typed_function_abs [simp]: |
986 "[| M(A); M(f) |] ==> typed_function(M,A,B,f) <-> f \<in> A -> B" |
988 "[| M(A); M(f) |] ==> typed_function(M,A,B,f) <-> f \<in> A -> B" |
987 apply (auto simp add: typed_function_def relation_def Pi_iff) |
989 apply (auto simp add: typed_function_def relation_def Pi_iff) |
988 apply (blast dest: pair_components_in_M)+ |
990 apply (blast dest: pair_components_in_M)+ |
994 apply (blast dest: transM [of _ A]) |
996 apply (blast dest: transM [of _ A]) |
995 done |
997 done |
996 |
998 |
997 lemma (in M_axioms) surjection_abs [simp]: |
999 lemma (in M_axioms) surjection_abs [simp]: |
998 "[| M(A); M(B); M(f) |] ==> surjection(M,A,B,f) <-> f \<in> surj(A,B)" |
1000 "[| M(A); M(B); M(f) |] ==> surjection(M,A,B,f) <-> f \<in> surj(A,B)" |
999 by (simp add: typed_apply_abs surjection_def surj_def) |
1001 by (simp add: surjection_def surj_def) |
1000 |
1002 |
1001 lemma (in M_axioms) bijection_abs [simp]: |
1003 lemma (in M_axioms) bijection_abs [simp]: |
1002 "[| M(A); M(B); M(f) |] ==> bijection(M,A,B,f) <-> f \<in> bij(A,B)" |
1004 "[| M(A); M(B); M(f) |] ==> bijection(M,A,B,f) <-> f \<in> bij(A,B)" |
1003 by (simp add: bijection_def bij_def) |
1005 by (simp add: bijection_def bij_def) |
1004 |
1006 |