src/HOL/Tools/function_package/size.ML
changeset 24962 60d33fb8ea5d
parent 24770 695a8e087b9f
child 25017 e82ab4962f80
equal deleted inserted replaced
24961:5298ee9c3fe5 24962:60d33fb8ea5d
    22   val empty = Symtab.empty;
    22   val empty = Symtab.empty;
    23   val copy = I
    23   val copy = I
    24   val extend = I
    24   val extend = I
    25   fun merge _ = Symtab.merge (K true);
    25   fun merge _ = Symtab.merge (K true);
    26 );
    26 );
    27 
       
    28 fun specify_consts args thy =
       
    29   let
       
    30     val specs = map (fn (c, T, mx) =>
       
    31       Const (Sign.full_name thy (Syntax.const_name c mx), T)) args;
       
    32   in
       
    33     thy
       
    34     |> Sign.add_consts_authentic [] args
       
    35     |> Theory.add_finals_i false specs
       
    36   end;
       
    37 
    27 
    38 fun add_axioms label ts atts thy =
    28 fun add_axioms label ts atts thy =
    39   thy
    29   thy
    40   |> PureThy.add_axiomss_i [((label, ts), atts)];
    30   |> PureThy.add_axiomss_i [((label, ts), atts)];
    41 
    31 
   163     val used = map fst (fold Term.add_tfreesT recTs []);
   153     val used = map fst (fold Term.add_tfreesT recTs []);
   164 
   154 
   165     val size_names = DatatypeProp.indexify_names
   155     val size_names = DatatypeProp.indexify_names
   166       (map (fn T => name_of_typ T ^ size_suffix) (Library.drop (head_len, recTs)));
   156       (map (fn T => name_of_typ T ^ size_suffix) (Library.drop (head_len, recTs)));
   167 
   157 
   168     val thy' = thy
   158     val thy' = thy |> fold (fn (s, T) =>
   169       |> specify_consts (map (fn (s, T) =>
   159         snd o Theory.specify_const [] (Sign.base_name s, T --> HOLogic.natT, NoSyn))
   170         (Sign.base_name s, T --> HOLogic.natT, NoSyn))
   160       (size_names ~~ Library.drop (head_len, recTs))
   171           (size_names ~~ Library.drop (head_len, recTs)))
       
   172     val size_axs = make_size head_len descr' sorts recTs thy';
   161     val size_axs = make_size head_len descr' sorts recTs thy';
   173   in
   162   in
   174     thy'
   163     thy'
   175     |> add_axioms size_name_base size_axs []
   164     |> add_axioms size_name_base size_axs []
   176     ||> fold (fn (_, (name, _, _)) => instance_size_class name) descr'
   165     ||> fold (fn (_, (name, _, _)) => instance_size_class name) descr'