* http://cs.unibo.it/helm/.
*)
+(* $Id$ *)
+
open ProofEngineHelpers
open ProofEngineTypes
in
context, t, (C.Meta (newmeta,irl))
else
- raise (Fail "intro(s): not enough products or let-ins")
+ raise (Fail (lazy "intro(s): not enough products or let-ins"))
in
collect_context context howmany ty
| Some (n,Cic.Def (s,None)) ->
Some (n,Cic.Def ((subst_in canonical_context' s),None))
| None -> None
- | Some (_,Cic.Def (_,Some _)) -> assert false
+ | Some (n,Cic.Def (bo,Some ty)) ->
+ Some
+ (n,
+ Cic.Def
+ (subst_in canonical_context' bo,
+ Some (subst_in canonical_context' ty)))
in
entry'::canonical_context'
) canonical_context []
Cic.Prod (n,s,t) -> 1 + count_prods (Some (n,Cic.Decl s)::context) t
| _ -> 0
-let apply_tac_verbose ~term (proof, goal) =
+let apply_tac_verbose_with_subst ~term (proof, goal) =
(* Assumption: The term "term" must be closed in the current context *)
let module T = CicTypeChecker in
let module R = CicReduction in
in
let metasenv' = metasenv@newmetasenvfragment in
let termty,_ =
- CicTypeChecker.type_of_aux' metasenv' context term' CicUniv.empty_ugraph in
+ CicTypeChecker.type_of_aux' metasenv' context term' CicUniv.empty_ugraph
+ in
let termty =
CicSubstitution.subst_vars exp_named_subst_diff termty in
let goal_arity = count_prods context ty in
in
let bo' = apply_subst t in
let newmetasenv'' = new_uninstantiatedmetas@old_uninstantiatedmetas in
-(* prerr_endline ("me: " ^ CicMetaSubst.ppmetasenv newmetasenv'' subst); *)
let subst_in =
(* if we just apply the subtitution, the type is irrelevant:
we may use Implicit, since it will be dropped *)
let (newproof, newmetasenv''') =
subst_meta_and_metasenv_in_proof proof metano subst_in newmetasenv''
in
- (subst_in,
- (newproof,
- List.map (function (i,_,_) -> i) new_uninstantiatedmetas))
+ (((metano,(context,bo',Cic.Implicit None))::subst)(* subst_in *), (* ALB *)
+ (newproof,
+ List.map (function (i,_,_) -> i) new_uninstantiatedmetas))
-let apply_tac ~term status = snd (apply_tac_verbose ~term status)
-let apply_tac_verbose ~term status =
+(* ALB *)
+let apply_tac_verbose_with_subst ~term status =
try
- apply_tac_verbose ~term status
+(* apply_tac_verbose ~term status *)
+ apply_tac_verbose_with_subst ~term status
(* TODO cacciare anche altre eccezioni? *)
with
- | CicUnification.UnificationFailure _ as e ->
- raise (Fail (Printexc.to_string e))
- | CicTypeChecker.TypeCheckerFailure _ as e ->
- raise (Fail (Printexc.to_string e))
+ | CicUnification.UnificationFailure msg
+ | CicTypeChecker.TypeCheckerFailure msg ->
+ raise (Fail msg)
+
+(* ALB *)
+let apply_tac_verbose ~term status =
+ let subst, status = apply_tac_verbose_with_subst ~term status in
+ (CicMetaSubst.apply_subst subst), status
+
+let apply_tac ~term status = snd (apply_tac_verbose ~term status)
(* TODO per implementare i tatticali e' necessario che tutte le tattiche
sollevino _solamente_ Fail *)
apply_tac ~term status
(* TODO cacciare anche altre eccezioni? *)
with
- | CicUnification.UnificationFailure _ as e ->
- raise (Fail (Printexc.to_string e))
- | CicTypeChecker.TypeCheckerFailure _ as e ->
- raise (Fail (Printexc.to_string e))
+ | CicUnification.UnificationFailure msg
+ | CicTypeChecker.TypeCheckerFailure msg ->
+ raise (Fail msg)
in
mk_tactic (apply_tac ~term)
(newproof, [])
end
else
- raise (Fail "The type of the provided term is not the one expected.")
+ raise (Fail (lazy "The type of the provided term is not the one expected."))
in
mk_tactic (exact_tac ~term)
in
C.Appl (eliminator_ref :: make_tl term (args_no - 1))
in
- let metasenv', term_to_refine' =
- CicMkImplicit.expand_implicits metasenv' [] context term_to_refine in
let refined_term,_,metasenv'',_ =
- CicRefine.type_of_aux' metasenv' context term_to_refine'
+ CicRefine.type_of_aux' metasenv' context term_to_refine
CicUniv.empty_ugraph
in
let new_goals =