52 by (fast_tac term_cs 1); |
50 by (fast_tac term_cs 1); |
53 val HTT_pair = result(); |
51 val HTT_pair = result(); |
54 |
52 |
55 goal Hered.thy "lam x.f(x) : HTT <-> (ALL x. f(x) : HTT)"; |
53 goal Hered.thy "lam x.f(x) : HTT <-> (ALL x. f(x) : HTT)"; |
56 br (HTTXH RS iff_trans) 1; |
54 br (HTTXH RS iff_trans) 1; |
57 by (SIMP_TAC term_ss 1); |
55 by (simp_tac term_ss 1); |
58 by (safe_tac term_cs); |
56 by (safe_tac term_cs); |
59 by (ASM_SIMP_TAC term_ss 1); |
57 by (asm_simp_tac term_ss 1); |
60 by (fast_tac term_cs 1); |
58 by (fast_tac term_cs 1); |
61 val HTT_lam = result(); |
59 val HTT_lam = result(); |
62 |
60 |
63 local |
61 local |
64 val raw_HTTrews = [HTT_bot,HTT_true,HTT_false,HTT_pair,HTT_lam]; |
62 val raw_HTTrews = [HTT_bot,HTT_true,HTT_false,HTT_pair,HTT_lam]; |
65 fun mk_thm s = prove_goalw Hered.thy data_defs s (fn _ => |
63 fun mk_thm s = prove_goalw Hered.thy data_defs s (fn _ => |
66 [SIMP_TAC (term_ss addrews raw_HTTrews) 1]); |
64 [simp_tac (term_ss addsimps raw_HTTrews) 1]); |
67 in |
65 in |
68 val HTT_rews = raw_HTTrews @ |
66 val HTT_rews = raw_HTTrews @ |
69 map mk_thm ["one : HTT", |
67 map mk_thm ["one : HTT", |
70 "inl(a) : HTT <-> a : HTT", |
68 "inl(a) : HTT <-> a : HTT", |
71 "inr(b) : HTT <-> b : HTT", |
69 "inr(b) : HTT <-> b : HTT", |
113 \ h.t : HTTgen(lfp(%x. HTTgen(x) Un R Un HTT))"]; |
111 \ h.t : HTTgen(lfp(%x. HTTgen(x) Un R Un HTT))"]; |
114 |
112 |
115 (*** Formation Rules for Types ***) |
113 (*** Formation Rules for Types ***) |
116 |
114 |
117 goal Hered.thy "Unit <= HTT"; |
115 goal Hered.thy "Unit <= HTT"; |
118 by (SIMP_TAC (CCL_ss addrews ([subsetXH,UnitXH] @ HTT_rews)) 1); |
116 by (simp_tac (CCL_ss addsimps ([subsetXH,UnitXH] @ HTT_rews)) 1); |
119 val UnitF = result(); |
117 val UnitF = result(); |
120 |
118 |
121 goal Hered.thy "Bool <= HTT"; |
119 goal Hered.thy "Bool <= HTT"; |
122 by (SIMP_TAC (CCL_ss addrews ([subsetXH,BoolXH] @ HTT_rews)) 1); |
120 by (simp_tac (CCL_ss addsimps ([subsetXH,BoolXH] @ HTT_rews)) 1); |
123 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
121 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
124 val BoolF = result(); |
122 val BoolF = result(); |
125 |
123 |
126 val prems = goal Hered.thy "[| A <= HTT; B <= HTT |] ==> A + B <= HTT"; |
124 val prems = goal Hered.thy "[| A <= HTT; B <= HTT |] ==> A + B <= HTT"; |
127 by (SIMP_TAC (CCL_ss addrews ([subsetXH,PlusXH] @ HTT_rews)) 1); |
125 by (simp_tac (CCL_ss addsimps ([subsetXH,PlusXH] @ HTT_rews)) 1); |
128 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
126 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
129 val PlusF = result(); |
127 val PlusF = result(); |
130 |
128 |
131 val prems = goal Hered.thy |
129 val prems = goal Hered.thy |
132 "[| A <= HTT; !!x.x:A ==> B(x) <= HTT |] ==> SUM x:A.B(x) <= HTT"; |
130 "[| A <= HTT; !!x.x:A ==> B(x) <= HTT |] ==> SUM x:A.B(x) <= HTT"; |
133 by (SIMP_TAC (CCL_ss addrews ([subsetXH,SgXH] @ HTT_rews)) 1); |
131 by (simp_tac (CCL_ss addsimps ([subsetXH,SgXH] @ HTT_rews)) 1); |
134 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
132 by (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])) 1); |
135 val SigmaF = result(); |
133 val SigmaF = result(); |
136 |
134 |
137 (*** Formation Rules for Recursive types - using coinduction these only need ***) |
135 (*** Formation Rules for Recursive types - using coinduction these only need ***) |
138 (*** exhaution rule for type-former ***) |
136 (*** exhaution rule for type-former ***) |
139 |
137 |
140 (*Proof by induction - needs induction rule for type*) |
138 (*Proof by induction - needs induction rule for type*) |
141 goal Hered.thy "Nat <= HTT"; |
139 goal Hered.thy "Nat <= HTT"; |
142 by (SIMP_TAC (term_ss addrews [subsetXH]) 1); |
140 by (simp_tac (term_ss addsimps [subsetXH]) 1); |
143 by (safe_tac set_cs); |
141 by (safe_tac set_cs); |
144 be Nat_ind 1; |
142 be Nat_ind 1; |
145 by (ALLGOALS (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])))); |
143 by (ALLGOALS (fast_tac (set_cs addIs HTT_Is @ (prems RL [subsetD])))); |
146 val NatF = result(); |
144 val NatF = result(); |
147 |
145 |
184 by (fast_tac (ccl_cs addIs prems) 1); |
182 by (fast_tac (ccl_cs addIs prems) 1); |
185 by (safe_tac ccl_cs); |
183 by (safe_tac ccl_cs); |
186 bd (poXH RS iffD1) 1; |
184 bd (poXH RS iffD1) 1; |
187 by (safe_tac (set_cs addSEs [HTT_bot RS notE])); |
185 by (safe_tac (set_cs addSEs [HTT_bot RS notE])); |
188 by (REPEAT_SOME (rtac (POgenXH RS iffD2) ORELSE' etac rev_mp)); |
186 by (REPEAT_SOME (rtac (POgenXH RS iffD2) ORELSE' etac rev_mp)); |
189 by (ALLGOALS (SIMP_TAC (term_ss addrews HTT_rews))); |
187 by (ALLGOALS (simp_tac (term_ss addsimps HTT_rews))); |
190 by (ALLGOALS (fast_tac ccl_cs)); |
188 by (ALLGOALS (fast_tac ccl_cs)); |
191 val HTT_po_op = result(); |
189 val HTT_po_op = result(); |
192 |
190 |
193 val prems = goal Hered.thy "[| t : HTT; t [= u |] ==> t = u"; |
191 val prems = goal Hered.thy "[| t : HTT; t [= u |] ==> t = u"; |
194 by (REPEAT (ares_tac (prems @ [conjI RS (eq_iff RS iffD2),HTT_po_op]) 1)); |
192 by (REPEAT (ares_tac (prems @ [conjI RS (eq_iff RS iffD2),HTT_po_op]) 1)); |