open NTacStatus
module Ast = CicNotationPt
-let auto_tac status =
+(* =================================== paramod =========================== *)
+let auto_paramod ~params:(l,_) status goal =
+ let gty = get_goalty status goal in
+ let n,h,metasenv,subst,o = status#obj in
+ let status,t = term_of_cic_term status gty (ctx_of gty) in
+ let status, l =
+ List.fold_left
+ (fun (status, l) t ->
+ let status, t = disambiguate status t None (ctx_of gty) in
+ let status, ty = typeof status (ctx_of t) t in
+ let status, t = term_of_cic_term status t (ctx_of gty) in
+ let status, ty = term_of_cic_term status ty (ctx_of ty) in
+ (status, (t,ty) :: l))
+ (status,[]) l
+ in
+ match
+ NCicParamod.nparamod status metasenv subst (ctx_of gty) (NCic.Rel ~-1,t) l
+ with
+ | [] -> raise (NTacStatus.Error (lazy "no proof found",None))
+ | (pt, metasenv, subst)::_ ->
+ let status = status#set_obj (n,h,metasenv,subst,o) in
+ instantiate status goal (NTacStatus.mk_cic_term (ctx_of gty) pt)
+;;
+
+let auto_paramod_tac ~params status =
+ NTactics.distribute_tac (auto_paramod ~params) status
+;;
+
+(* =================================== auto =========================== *)
+let auto_tac ~params status =
prerr_endline "I teoremi noti sono";
NDiscriminationTree.DiscriminationTree.iter status#auto_cache
(fun _ t ->
(NDiscriminationTree.TermSet.elements t));
status
;;
+
+(* ========================= dispatching of auto/auto_paramod ============ *)
+let auto_tac ~params:(_,flags as params) =
+ if List.mem_assoc "paramodulation" flags then
+ auto_paramod_tac ~params
+ else
+ auto_tac ~params
+;;
+
+(* EOF *)