in
aux a l
+let is_atomic = function
+ | C.ASort _
+ | C.AConst _
+ | C.AMutInd _
+ | C.AMutConstruct _
+ | C.AVar _
+ | C.ARel _
+ | C.AMeta _
+ | C.AImplicit _ -> true
+ | _ -> false
+
(****************************************************************************)
type name = string
| Rewrite of how * what * where * note
| Elim of what * using option * note
| Apply of what * note
+ | Whd of count * note
| Branch of step list list * note
(* annterm constructors *****************************************************)
let floc = H.dummy_floc
+let hole = C.AImplicit ("", Some `Hole)
+
let mk_note str = G.Comment (floc, G.Note (floc, str))
let mk_theorem name t =
mk_tactic tactic
let mk_rewrite direction what where =
- let hole = C.AImplicit ("", Some `Hole) in
let direction = if direction then `RightToLeft else `LeftToRight in
let pattern, rename = match where with
| None -> (None, [], Some hole), []
let tactic = G.Apply (floc, t) in
mk_tactic tactic
+let mk_whd i =
+ let pattern = None, [], Some hole in
+ let tactic = G.Reduce (floc, `Whd, pattern) in
+ mk_tactic tactic
+
let mk_dot = G.Executable (floc, G.Tactical (floc, G.Dot floc, None))
let mk_sc = G.Executable (floc, G.Tactical (floc, G.Semicolon floc, None))
| Rewrite (b, t, w, s) -> mk_note s :: cont sep (mk_rewrite b t w :: a)
| Elim (t, xu, s) -> mk_note s :: cont sep (mk_elim t xu :: a)
| Apply (t, s) -> mk_note s :: cont sep (mk_apply t :: a)
+ | Whd (c, s) -> mk_note s :: cont sep (mk_whd c :: a)
| Branch ([], s) -> a
- | Branch ([ps], s) -> render_steps a ps
+ | Branch ([ps], s) -> render_steps sep a ps
| Branch (pss, s) ->
let a = mk_ob :: a in
- let body = mk_cb :: list_rev_map_concat render_steps mk_vb a pss in
+ let body = mk_cb :: list_rev_map_concat (render_steps None) mk_vb a pss in
mk_note s :: cont sep body
-and render_steps a = function
+and render_steps sep a = function
| [] -> a
- | [p] -> render_step None a p
- | (Note _ | Theorem _ | Qed _ as p) :: ps ->
- render_steps (render_step None a p) ps
- | p :: ((Branch ([], _) :: _) as ps) ->
- render_steps (render_step None a p) ps
+ | [p] -> render_step sep a p
+ | p :: Branch ([], _) :: ps ->
+ render_steps sep a (p :: ps)
| p :: ((Branch (_ :: _ :: _, _) :: _) as ps) ->
- render_steps (render_step (Some mk_sc) a p) ps
+ render_steps sep (render_step (Some mk_sc) a p) ps
| p :: ps ->
- render_steps (render_step (Some mk_dot) a p) ps
+ render_steps sep (render_step (Some mk_dot) a p) ps
+
+let render_steps a = render_steps None a
(* counting *****************************************************************)