Univ.ML
changeset 235 d24669439715
parent 202 c533bc92e882
equal deleted inserted replaced
234:80f45ad991cb 235:d24669439715
    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);