type body = C.annterm option
type types = C.anninductiveType list
type lpsno = int
+type fields = (string * bool * int) list
type step = Note of note
+ | Record of types * lpsno * fields * note
| Inductive of types * lpsno * note
| Statement of flavour * name * what * body * note
| Qed of note
| Intros of count option * name list * note
| Cut of name * what * note
| LetIn of name * what * note
+ | LApply of name * what * note
| Rewrite of how * what * where * pattern * note
| Elim of what * using option * pattern * note
| Cases of what * pattern * note
let mk_thnote str a =
if str = "" then a else mk_note "" :: mk_note str :: a
-let mk_inductive types lpsno =
+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 map3 (name, xw) = arel_of_name name, xw in
let rev_lps, rev_types = List.fold_left map2 ([], []) types in
- let lpars, types = List.rev_map map3 rev_lps, List.rev rev_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) in
let tactic = G.LetIn (floc, what, name) in
mk_tactic tactic punctation
+let mk_lapply name what punctation =
+ let tactic = G.LApply (floc, false, None, [], what, name) in
+ mk_tactic tactic punctation
+
let mk_rewrite direction what where pattern punctation =
let direction = if direction then `RightToLeft else `LeftToRight in
let pattern, rename = match where with
let rec render_step sep a = function
| Note s -> mk_notenote s a
| Statement (f, n, t, v, s) -> mk_statement f n t v :: mk_thnote s a
- | Inductive (lps, ts, s) -> mk_inductive lps ts :: mk_thnote s a
+ | Inductive (ts, lps, s) -> mk_inductive ts lps :: mk_thnote s a
+ | Record (ts, lps, fs, s) -> mk_record ts lps fs :: mk_thnote s a
| Qed s -> mk_qed :: mk_tacnote s a
| Exact (t, s) -> mk_exact t sep :: mk_tacnote s a
| Id s -> mk_id sep :: mk_tacnote s a
| Intros (c, ns, s) -> mk_intros c ns sep :: mk_tacnote s a
| Cut (n, t, s) -> mk_cut n t sep :: mk_tacnote s a
| LetIn (n, t, s) -> mk_letin n t sep :: mk_tacnote s a
+ | LApply (n, t, s) -> mk_lapply n t sep :: mk_tacnote s a
| Rewrite (b, t, w, e, s) -> mk_rewrite b t w e sep :: mk_tacnote s a
| Elim (t, xu, e, s) -> mk_elim t xu e sep :: mk_tacnote s a
| Cases (t, e, s) -> mk_cases t e sep :: mk_tacnote s a
let rec count_node a = function
| Note _
+ | Record _
| Inductive _
| Statement _
| Qed _
| Exact (t, _)
| Cut (_, t, _)
| LetIn (_, t, _)
+ | LApply (_, t, _)
| Apply (t, _) -> count a (H.cic t)
| Rewrite (_, t, _, p, _)
| Elim (t, _, p, _)
| Note s
| Statement (_, _, _, _, s)
| Inductive (_, _, s)
+ | Record (_, _, _, s)
| Qed s
| Exact (_, s)
| Id s
| Intros (_, _, s)
| Cut (_, _, s)
| LetIn (_, _, s)
+ | LApply (_, _, s)
| Rewrite (_, _, _, _, s)
| Elim (_, _, _, s)
| Cases (_, _, s)