src/ZF/List.ML
changeset 525 e62519a8497d
parent 516 1957113f0d7d
child 760 f0200e91b272
equal deleted inserted replaced
524:b1bf18e83302 525:e62519a8497d
    22     EVERY [res_inst_tac [("x",a)] list.induct i,
    22     EVERY [res_inst_tac [("x",a)] list.induct i,
    23 	   rename_last_tac a ["1"] (i+2),
    23 	   rename_last_tac a ["1"] (i+2),
    24 	   ares_tac prems i];
    24 	   ares_tac prems i];
    25 
    25 
    26 goal List.thy "list(A) = {0} + (A * list(A))";
    26 goal List.thy "list(A) = {0} + (A * list(A))";
    27 by (rtac (list.unfold RS trans) 1);
    27 let open list;  val rew = rewrite_rule con_defs in  
    28 bws list.con_defs;
    28 by (fast_tac (sum_cs addSIs (equalityI :: map rew intrs)
    29 br equalityI 1;
    29                      addEs [rew elim]) 1)
    30 by (fast_tac sum_cs 1);
    30 end;
    31 by (fast_tac (sum_cs addIs datatype_intrs
       
    32 		     addDs [list.dom_subset RS subsetD]) 1);
       
    33 val list_unfold = result();
    31 val list_unfold = result();
    34 
    32 
    35 (**  Lemmas to justify using "list" in other recursive type definitions **)
    33 (**  Lemmas to justify using "list" in other recursive type definitions **)
    36 
    34 
    37 goalw List.thy list.defs "!!A B. A<=B ==> list(A) <= list(B)";
    35 goalw List.thy list.defs "!!A B. A<=B ==> list(A) <= list(B)";
    46 by (rtac (A_subset_univ RS univ_mono) 2);
    44 by (rtac (A_subset_univ RS univ_mono) 2);
    47 by (fast_tac (ZF_cs addSIs [zero_in_univ, Inl_in_univ, Inr_in_univ,
    45 by (fast_tac (ZF_cs addSIs [zero_in_univ, Inl_in_univ, Inr_in_univ,
    48 			    Pair_in_univ]) 1);
    46 			    Pair_in_univ]) 1);
    49 val list_univ = result();
    47 val list_univ = result();
    50 
    48 
       
    49 (*These two theorems are unused -- useful??*)
    51 val list_subset_univ = standard ([list_mono, list_univ] MRS subset_trans);
    50 val list_subset_univ = standard ([list_mono, list_univ] MRS subset_trans);
    52 
    51 
    53 goal List.thy "!!l A B. [| l: list(A);  A <= univ(B) |] ==> l: univ(B)";
    52 goal List.thy "!!l A B. [| l: list(A);  A <= univ(B) |] ==> l: univ(B)";
    54 by (REPEAT (ares_tac [list_subset_univ RS subsetD] 1));
    53 by (REPEAT (ares_tac [list_subset_univ RS subsetD] 1));
    55 val list_into_univ = result();
    54 val list_into_univ = result();