(** creates an opaque tactic from a status->proof*goal list function *)
let mk_tactic t = t
+type reduction = Cic.context -> Cic.term -> Cic.term
+
+type lazy_term =
+ Cic.context -> Cic.metasenv -> CicUniv.universe_graph ->
+ Cic.term * Cic.metasenv * CicUniv.universe_graph
+
+let const_lazy_term t =
+ (fun _ metasenv ugraph -> t, metasenv, ugraph)
+
+type lazy_reduction =
+ Cic.context -> Cic.metasenv -> CicUniv.universe_graph ->
+ reduction * Cic.metasenv * CicUniv.universe_graph
+
+let const_lazy_reduction red =
+ (fun _ metasenv ugraph -> red, metasenv, ugraph)
+
+type pattern = lazy_term option * (string * Cic.term) list * Cic.term
+
+let conclusion_pattern t =
+ let t' =
+ match t with
+ | None -> None
+ | Some t -> Some (fun _ m u -> t, m, u)
+ in
+ t',[],Cic.Implicit (Some `Hole)
+
(** tactic failure *)
exception Fail of string
universe graph if the tactic Fails
*)
let apply_tactic t status =
- let saved_univ = CicUniv.get_working() in
- try
- t status
- with Fail s -> CicUniv.set_working saved_univ; raise (Fail s)
+ t status
(** constraint: the returned value will always be constructed by Cic.Name **)
type mk_fresh_name_type =
Cic.metasenv -> Cic.context -> Cic.name -> typ:Cic.term -> Cic.name
+
+let goals_of_proof (_,metasenv,_,_) = List.map (fun (g,_,_) -> g) metasenv
+