+let mk_tacnote str a =
+ if str = "" then mk_note "" :: a else mk_note "" :: mk_note str :: a
+
+let mk_notenote str a =
+ if str = "" then a else mk_note str :: a
+
+let mk_thnote str a =
+ if str = "" then a else mk_note "" :: mk_note str :: a
+
+let mk_pre_inductive types lpsno =
+ let map1 (lps1, cons) (name, arity) =
+ let lps2, arity = strip_lps lpsno arity in
+ merge_lps lps1 lps2, (name, arity) :: cons
+ in
+ let map2 (lps1, types) (_, name, kind, arity, cons) =
+ let lps2, arity = strip_lps lpsno arity in
+ let lps1, rev_cons = List.fold_left map1 (lps1, []) cons in
+ merge_lps lps1 lps2, (name, kind, arity, List.rev rev_cons) :: types
+ in
+ let map3 (name, xw) = arel_of_name name, xw in
+ let rev_lps, rev_types = List.fold_left map2 ([], []) types in
+ List.rev_map map3 rev_lps, List.rev rev_types
+
+let mk_inductive types lpsno =
+ let lpars, types = mk_pre_inductive types lpsno in
+ let obj = N.Inductive (lpars, types) in
+ G.Executable (floc, G.Command (floc, G.Obj (floc, obj)))
+
+let mk_record types lpsno fields =
+ match mk_pre_inductive types lpsno with
+ | lpars, [name, _, ty, [_, cty]] ->
+ let map (fields, cty) (name, coercion, arity) =
+ match cty with
+ | C.AProd (_, _, w, t) ->
+ (name, w, coercion, arity) :: fields, t
+ | _ ->
+ assert false
+ in
+ let rev_fields, _ = List.fold_left map ([], cty) fields in
+ let fields = List.rev rev_fields in
+ let obj = N.Record (lpars, name, ty, fields) in
+ G.Executable (floc, G.Command (floc, G.Obj (floc, obj)))
+ | _ -> assert false
+
+let mk_statement flavour name t v =
+ let name = match name with Some name -> name | None -> assert false in
+ let obj = N.Theorem (flavour, name, t, v, `Regular) in