equal
deleted
inserted
replaced
51 |
51 |
52 (** apfst -- can be used in similar type definitions **) |
52 (** apfst -- can be used in similar type definitions **) |
53 |
53 |
54 goalw Univ.thy [apfst_def] "apfst(f,<a,b>) = <f(a),b>"; |
54 goalw Univ.thy [apfst_def] "apfst(f,<a,b>) = <f(a),b>"; |
55 by (rtac split 1); |
55 by (rtac split 1); |
56 qed "apfst"; |
56 qed "apfst_conv"; |
57 |
57 |
58 val [major,minor] = goal Univ.thy |
58 val [major,minor] = goal Univ.thy |
59 "[| q = apfst(f,p); !!x y. [| p = <x,y>; q = <f(x),y> |] ==> R \ |
59 "[| q = apfst(f,p); !!x y. [| p = <x,y>; q = <f(x),y> |] ==> R \ |
60 \ |] ==> R"; |
60 \ |] ==> R"; |
61 by (rtac PairE 1); |
61 by (rtac PairE 1); |
62 by (rtac minor 1); |
62 by (rtac minor 1); |
63 by (assume_tac 1); |
63 by (assume_tac 1); |
64 by (rtac (major RS trans) 1); |
64 by (rtac (major RS trans) 1); |
65 by (etac ssubst 1); |
65 by (etac ssubst 1); |
66 by (rtac apfst 1); |
66 by (rtac apfst_conv 1); |
67 qed "apfstE"; |
67 qed "apfst_convE"; |
68 |
68 |
69 (** Push -- an injection, analogous to Cons on lists **) |
69 (** Push -- an injection, analogous to Cons on lists **) |
70 |
70 |
71 val [major] = goalw Univ.thy [Push_def] "Push(i,f)=Push(j,g) ==> i=j"; |
71 val [major] = goalw Univ.thy [Push_def] "Push(i,f)=Push(j,g) ==> i=j"; |
72 by (rtac (major RS fun_cong RS box_equals RS Suc_inject) 1); |
72 by (rtac (major RS fun_cong RS box_equals RS Suc_inject) 1); |
113 by (fast_tac set_cs 1); |
113 by (fast_tac set_cs 1); |
114 qed "Node_K0_I"; |
114 qed "Node_K0_I"; |
115 |
115 |
116 goalw Univ.thy [Node_def,Push_def] |
116 goalw Univ.thy [Node_def,Push_def] |
117 "!!p. p: Node ==> apfst(Push(i), p) : Node"; |
117 "!!p. p: Node ==> apfst(Push(i), p) : Node"; |
118 by (fast_tac (set_cs addSIs [apfst, nat_case_Suc RS trans]) 1); |
118 by (fast_tac (set_cs addSIs [apfst_conv, nat_case_Suc RS trans]) 1); |
119 qed "Node_Push_I"; |
119 qed "Node_Push_I"; |
120 |
120 |
121 |
121 |
122 (*** Distinctness of constructors ***) |
122 (*** Distinctness of constructors ***) |
123 |
123 |
125 |
125 |
126 goalw Univ.thy [Atom_def,Scons_def,Push_Node_def] "(M$N) ~= Atom(a)"; |
126 goalw Univ.thy [Atom_def,Scons_def,Push_Node_def] "(M$N) ~= Atom(a)"; |
127 by (rtac notI 1); |
127 by (rtac notI 1); |
128 by (etac (equalityD2 RS subsetD RS UnE) 1); |
128 by (etac (equalityD2 RS subsetD RS UnE) 1); |
129 by (rtac singletonI 1); |
129 by (rtac singletonI 1); |
130 by (REPEAT (eresolve_tac [imageE, Abs_Node_inject RS apfstE, |
130 by (REPEAT (eresolve_tac [imageE, Abs_Node_inject RS apfst_convE, |
131 Pair_inject, sym RS Push_neq_K0] 1 |
131 Pair_inject, sym RS Push_neq_K0] 1 |
132 ORELSE resolve_tac [Node_K0_I, Rep_Node RS Node_Push_I] 1)); |
132 ORELSE resolve_tac [Node_K0_I, Rep_Node RS Node_Push_I] 1)); |
133 qed "Scons_not_Atom"; |
133 qed "Scons_not_Atom"; |
134 bind_thm ("Atom_not_Scons", (Scons_not_Atom RS not_sym)); |
134 bind_thm ("Atom_not_Scons", (Scons_not_Atom RS not_sym)); |
135 |
135 |
164 (** Injectiveness of Push_Node **) |
164 (** Injectiveness of Push_Node **) |
165 |
165 |
166 val [major,minor] = goalw Univ.thy [Push_Node_def] |
166 val [major,minor] = goalw Univ.thy [Push_Node_def] |
167 "[| Push_Node(i,m)=Push_Node(j,n); [| i=j; m=n |] ==> P \ |
167 "[| Push_Node(i,m)=Push_Node(j,n); [| i=j; m=n |] ==> P \ |
168 \ |] ==> P"; |
168 \ |] ==> P"; |
169 by (rtac (major RS Abs_Node_inject RS apfstE) 1); |
169 by (rtac (major RS Abs_Node_inject RS apfst_convE) 1); |
170 by (REPEAT (resolve_tac [Rep_Node RS Node_Push_I] 1)); |
170 by (REPEAT (resolve_tac [Rep_Node RS Node_Push_I] 1)); |
171 by (etac (sym RS apfstE) 1); |
171 by (etac (sym RS apfst_convE) 1); |
172 by (rtac minor 1); |
172 by (rtac minor 1); |
173 by (etac Pair_inject 1); |
173 by (etac Pair_inject 1); |
174 by (etac (Push_inject1 RS sym) 1); |
174 by (etac (Push_inject1 RS sym) 1); |
175 by (rtac (inj_Rep_Node RS injD) 1); |
175 by (rtac (inj_Rep_Node RS injD) 1); |
176 by (etac trans 1); |
176 by (etac trans 1); |
250 val Numb_neq_Leaf = sym RS Leaf_neq_Numb; |
250 val Numb_neq_Leaf = sym RS Leaf_neq_Numb; |
251 |
251 |
252 |
252 |
253 (*** ndepth -- the depth of a node ***) |
253 (*** ndepth -- the depth of a node ***) |
254 |
254 |
255 val univ_simps = [apfst,Scons_not_Atom,Atom_not_Scons,Scons_Scons_eq]; |
255 val univ_simps = [apfst_conv,Scons_not_Atom,Atom_not_Scons,Scons_Scons_eq]; |
256 val univ_ss = nat_ss addsimps univ_simps; |
256 val univ_ss = nat_ss addsimps univ_simps; |
257 |
257 |
258 |
258 |
259 goalw Univ.thy [ndepth_def] "ndepth (Abs_Node(<%k.0, x>)) = 0"; |
259 goalw Univ.thy [ndepth_def] "ndepth (Abs_Node(<%k.0, x>)) = 0"; |
260 by (sstac [Node_K0_I RS Abs_Node_inverse, split] 1); |
260 by (sstac [Node_K0_I RS Abs_Node_inverse, split] 1); |