author | wenzelm |
Fri, 06 Oct 2000 17:35:58 +0200 | |
changeset 10168 | 50be659d4222 |
parent 8267 | 2ae7f9b2c0bf |
child 11317 | 7f9e4c389318 |
permissions | -rw-r--r-- |
1461 | 1 |
(* Title: ZF/AC/AC2_AC6.ML |
1123 | 2 |
ID: $Id$ |
1461 | 3 |
Author: Krzysztof Grabczewski |
1123 | 4 |
|
1196 | 5 |
The proofs needed to show that each of AC2, AC3, ..., AC6 is equivalent |
6 |
to AC0 and AC1: |
|
1123 | 7 |
AC1 ==> AC2 ==> AC1 |
8 |
AC1 ==> AC4 ==> AC3 ==> AC1 |
|
9 |
AC4 ==> AC5 ==> AC4 |
|
10 |
AC1 <-> AC6 |
|
11 |
*) |
|
12 |
||
13 |
(* ********************************************************************** *) |
|
1461 | 14 |
(* AC1 ==> AC2 *) |
1123 | 15 |
(* ********************************************************************** *) |
16 |
||
8267 | 17 |
Goal "[| f:(PROD X:A. X); B:A; 0~:A |] ==> {f`B} <= B Int {f`C. C:A}"; |
4091 | 18 |
by (fast_tac (claset() addSEs [apply_type]) 1); |
1123 | 19 |
val lemma1 = result(); |
20 |
||
5068 | 21 |
Goalw [pairwise_disjoint_def] |
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
22 |
"[| pairwise_disjoint(A); B:A; C:A; D:B; D:C |] ==> f`B = f`C"; |
5265
9d1d4c43c76d
Disjointness reasoning by AddEs [equals0E, sym RS equals0E]
paulson
parents:
5241
diff
changeset
|
23 |
by (Fast_tac 1); |
1123 | 24 |
val lemma2 = result(); |
25 |
||
5137 | 26 |
Goalw AC_defs "AC1 ==> AC2"; |
1206 | 27 |
by (rtac allI 1); |
28 |
by (rtac impI 1); |
|
1123 | 29 |
by (REPEAT (eresolve_tac [asm_rl,conjE,allE,exE,impE] 1)); |
30 |
by (REPEAT (resolve_tac [exI,ballI,equalityI] 1)); |
|
1206 | 31 |
by (rtac lemma1 2 THEN (REPEAT (assume_tac 2))); |
5241 | 32 |
by (fast_tac (claset() addSEs [lemma2] addEs [apply_type]) 1); |
1196 | 33 |
qed "AC1_AC2"; |
1123 | 34 |
|
35 |
||
36 |
(* ********************************************************************** *) |
|
1461 | 37 |
(* AC2 ==> AC1 *) |
1123 | 38 |
(* ********************************************************************** *) |
39 |
||
5137 | 40 |
Goal "0~:A ==> 0 ~: {B*{B}. B:A}"; |
5265
9d1d4c43c76d
Disjointness reasoning by AddEs [equals0E, sym RS equals0E]
paulson
parents:
5241
diff
changeset
|
41 |
by (fast_tac (claset() addSDs [sym RS (Sigma_empty_iff RS iffD1)]) 1); |
1123 | 42 |
val lemma1 = result(); |
43 |
||
5137 | 44 |
Goal "[| X*{X} Int C = {y}; X:A |] \ |
1461 | 45 |
\ ==> (THE y. X*{X} Int C = {y}): X*A"; |
1206 | 46 |
by (rtac subst_elem 1); |
4091 | 47 |
by (fast_tac (claset() addSIs [the_equality] |
1461 | 48 |
addSEs [sym RS trans RS (singleton_eq_iff RS iffD1)]) 2); |
8267 | 49 |
by (blast_tac (claset() addSEs [equalityE]) 1); |
1123 | 50 |
val lemma2 = result(); |
51 |
||
5137 | 52 |
Goal "ALL D:{E*{E}. E:A}. EX y. D Int C = {y} \ |
1461 | 53 |
\ ==> (lam x:A. fst(THE z. (x*{x} Int C = {z}))) : \ |
54 |
\ (PROD X:A. X) "; |
|
8267 | 55 |
by (fast_tac (claset() addSEs [lemma2] |
56 |
addSIs [lam_type, RepFunI, fst_type]) 1); |
|
1123 | 57 |
val lemma3 = result(); |
58 |
||
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
59 |
Goalw (AC_defs@AC_aux_defs) "AC2 ==> AC1"; |
1123 | 60 |
by (REPEAT (resolve_tac [allI, impI] 1)); |
61 |
by (REPEAT (eresolve_tac [allE, impE] 1)); |
|
4091 | 62 |
by (fast_tac (claset() addSEs [lemma3]) 2); |
63 |
by (fast_tac (claset() addSIs [lemma1, equals0I]) 1); |
|
1196 | 64 |
qed "AC2_AC1"; |
1123 | 65 |
|
66 |
||
67 |
(* ********************************************************************** *) |
|
1461 | 68 |
(* AC1 ==> AC4 *) |
1123 | 69 |
(* ********************************************************************** *) |
70 |
||
5137 | 71 |
Goal "0 ~: {R``{x}. x:domain(R)}"; |
5265
9d1d4c43c76d
Disjointness reasoning by AddEs [equals0E, sym RS equals0E]
paulson
parents:
5241
diff
changeset
|
72 |
by (Blast_tac 1); |
1123 | 73 |
val lemma = result(); |
74 |
||
5137 | 75 |
Goalw AC_defs "AC1 ==> AC4"; |
1123 | 76 |
by (REPEAT (resolve_tac [allI, impI] 1)); |
77 |
by (REPEAT (eresolve_tac [allE, lemma RSN (2, impE), exE] 1)); |
|
4091 | 78 |
by (best_tac (claset() addSIs [lam_type] addSEs [apply_type]) 1); |
1196 | 79 |
qed "AC1_AC4"; |
1123 | 80 |
|
81 |
||
82 |
(* ********************************************************************** *) |
|
1461 | 83 |
(* AC4 ==> AC3 *) |
1123 | 84 |
(* ********************************************************************** *) |
85 |
||
5137 | 86 |
Goal "f:A->B ==> (UN z:A. {z}*f`z) <= A*Union(B)"; |
4091 | 87 |
by (fast_tac (claset() addSDs [apply_type]) 1); |
1123 | 88 |
val lemma1 = result(); |
89 |
||
5137 | 90 |
Goal "domain(UN z:A. {z}*f(z)) = {a:A. f(a)~=0}"; |
8267 | 91 |
by (Blast_tac 1); |
1123 | 92 |
val lemma2 = result(); |
93 |
||
5137 | 94 |
Goal "x:A ==> (UN z:A. {z}*f(z))``{x} = f(x)"; |
2496 | 95 |
by (Fast_tac 1); |
1123 | 96 |
val lemma3 = result(); |
97 |
||
5137 | 98 |
Goalw AC_defs "AC4 ==> AC3"; |
1123 | 99 |
by (REPEAT (resolve_tac [allI,ballI] 1)); |
100 |
by (REPEAT (eresolve_tac [allE,impE] 1)); |
|
1206 | 101 |
by (etac lemma1 1); |
4091 | 102 |
by (asm_full_simp_tac (simpset() addsimps [lemma2, lemma3] |
8267 | 103 |
addcongs [Pi_cong]) 1); |
1196 | 104 |
qed "AC4_AC3"; |
1123 | 105 |
|
106 |
(* ********************************************************************** *) |
|
1461 | 107 |
(* AC3 ==> AC1 *) |
1123 | 108 |
(* ********************************************************************** *) |
109 |
||
5137 | 110 |
Goal "b~:A ==> (PROD x:{a:A. id(A)`a~=b}. id(A)`x) = (PROD x:A. x)"; |
4091 | 111 |
by (asm_full_simp_tac (simpset() addsimps [id_def] addcongs [Pi_cong]) 1); |
1123 | 112 |
by (res_inst_tac [("b","A")] subst_context 1); |
2496 | 113 |
by (Fast_tac 1); |
1123 | 114 |
val lemma = result(); |
115 |
||
5137 | 116 |
Goalw AC_defs "AC3 ==> AC1"; |
8267 | 117 |
by (fast_tac (claset() addSIs [id_type] addEs [lemma RS subst]) 1); |
1196 | 118 |
qed "AC3_AC1"; |
1123 | 119 |
|
120 |
(* ********************************************************************** *) |
|
1461 | 121 |
(* AC4 ==> AC5 *) |
1123 | 122 |
(* ********************************************************************** *) |
123 |
||
5147
825877190618
More tidying and removal of "\!\!... from Goal commands
paulson
parents:
5137
diff
changeset
|
124 |
Goalw (range_def::AC_defs) "AC4 ==> AC5"; |
1123 | 125 |
by (REPEAT (resolve_tac [allI,ballI] 1)); |
126 |
by (REPEAT (eresolve_tac [allE,impE] 1)); |
|
127 |
by (eresolve_tac [fun_is_rel RS converse_type] 1); |
|
1206 | 128 |
by (etac exE 1); |
129 |
by (rtac bexI 1); |
|
130 |
by (rtac Pi_type 2 THEN (assume_tac 2)); |
|
4091 | 131 |
by (fast_tac (claset() addSDs [apply_type] |
1461 | 132 |
addSEs [fun_is_rel RS converse_type RS subsetD RS SigmaD2]) 2); |
1206 | 133 |
by (rtac ballI 1); |
134 |
by (rtac apply_equality 1 THEN (assume_tac 2)); |
|
135 |
by (etac domainE 1); |
|
7499 | 136 |
by (ftac range_type 1 THEN (assume_tac 1)); |
4091 | 137 |
by (fast_tac (claset() addDs [apply_equality]) 1); |
1196 | 138 |
qed "AC4_AC5"; |
1123 | 139 |
|
140 |
||
141 |
(* ********************************************************************** *) |
|
1461 | 142 |
(* AC5 ==> AC4, Rubin & Rubin, p. 11 *) |
1123 | 143 |
(* ********************************************************************** *) |
144 |
||
5137 | 145 |
Goal "R <= A*B ==> (lam x:R. fst(x)) : R -> A"; |
4091 | 146 |
by (fast_tac (claset() addSIs [lam_type, fst_type]) 1); |
1123 | 147 |
val lemma1 = result(); |
148 |
||
5137 | 149 |
Goalw [range_def] "R <= A*B ==> range(lam x:R. fst(x)) = domain(R)"; |
8267 | 150 |
by (force_tac (claset() addIs [lamI RS subst_elem] addSEs [lamE], |
151 |
simpset()) 1); |
|
1123 | 152 |
val lemma2 = result(); |
153 |
||
5137 | 154 |
Goal "[| EX f: A->C. P(f,domain(f)); A=B |] ==> EX f: B->C. P(f,B)"; |
1206 | 155 |
by (etac bexE 1); |
7499 | 156 |
by (ftac domain_of_fun 1); |
2469 | 157 |
by (Fast_tac 1); |
1123 | 158 |
val lemma3 = result(); |
159 |
||
5137 | 160 |
Goal "[| R <= A*B; g: C->R; ALL x:C. (lam z:R. fst(z))` (g`x) = x |] \ |
1461 | 161 |
\ ==> (lam x:C. snd(g`x)): (PROD x:C. R``{x})"; |
1206 | 162 |
by (rtac lam_type 1); |
8267 | 163 |
by (force_tac (claset() addDs [apply_type], simpset()) 1); |
1123 | 164 |
val lemma4 = result(); |
165 |
||
5137 | 166 |
Goalw AC_defs "AC5 ==> AC4"; |
8267 | 167 |
by (Clarify_tac 1); |
1123 | 168 |
by (REPEAT (eresolve_tac [allE,ballE] 1)); |
1196 | 169 |
by (eresolve_tac [lemma1 RSN (2, notE)] 2 THEN (assume_tac 2)); |
170 |
by (dresolve_tac [lemma2 RSN (2, lemma3)] 1 THEN (assume_tac 1)); |
|
4091 | 171 |
by (fast_tac (claset() addSEs [lemma4]) 1); |
1196 | 172 |
qed "AC5_AC4"; |
1123 | 173 |
|
174 |
||
175 |
(* ********************************************************************** *) |
|
1461 | 176 |
(* AC1 <-> AC6 *) |
1123 | 177 |
(* ********************************************************************** *) |
178 |
||
5068 | 179 |
Goalw AC_defs "AC1 <-> AC6"; |
5265
9d1d4c43c76d
Disjointness reasoning by AddEs [equals0E, sym RS equals0E]
paulson
parents:
5241
diff
changeset
|
180 |
by (Blast_tac 1); |
1196 | 181 |
qed "AC1_iff_AC6"; |