let simpl = reduction_tactic ProofEngineReduction.simpl
let whd_in_scratch = reduction_tactic_in_scratch CicReduction.whd
-let reduce_in_scratch =
- reduction_tactic_in_scratch ProofEngineReduction.reduce
-let simpl_in_scratch =
- reduction_tactic_in_scratch ProofEngineReduction.simpl
-
-(* It is just the opposite of whd. The code should probably be merged. *)
-let fold term =
- let curi,metasenv,pbo,pty =
- match !proof with
- None -> assert false
- | Some (curi,metasenv,bo,ty) -> curi,metasenv,bo,ty
- in
- let metano,context,ty =
- match !goal with
- None -> assert false
- | Some metano -> List.find (function (m,_,_) -> m=metano) metasenv
- in
- let term' = CicReduction.whd context term in
- (* We don't know if [term] is a subterm of [ty] or a subterm of *)
- (* the type of one metavariable. So we replace it everywhere. *)
- (*CSC: ma si potrebbe ovviare al problema. Ma non credo *)
- (*CSC: che si guadagni nulla in fatto di efficienza. *)
- let replace =
- ProofEngineReduction.replace ~equality:(=) ~what:term' ~with_what:term
- in
- let ty' = replace ty in
- let context' =
- List.map
- (function
- Some (n,Cic.Decl t) -> Some (n,Cic.Decl (replace t))
- | Some (n,Cic.Def t) -> Some (n,Cic.Def (replace t))
- | None -> None
- ) context
- in
- let metasenv' =
- List.map
- (function
- (n,_,_) when n = metano -> (metano,context',ty')
- | _ as t -> t
- ) metasenv
- in
- proof := Some (curi,metasenv',pbo,pty) ;
- goal := Some metano
+let reduce_in_scratch = reduction_tactic_in_scratch ProofEngineReduction.reduce
+let simpl_in_scratch = reduction_tactic_in_scratch ProofEngineReduction.simpl
(************************************************************)
(* Tactics defined elsewhere *)
let clearbody hyp = apply_tactic (ProofEngineStructuralRules.clearbody ~hyp)
let clear hyp = apply_tactic (ProofEngineStructuralRules.clear ~hyp)
+ (* reduction tactics *)
+
+let fold term =
+ apply_tactic (ReductionTactics.fold_tac ~also_in_hypotheses:true ~term)
+
(* other tactics *)
let elim_type term = apply_tactic (Ring.elim_type_tac ~term)
let reduce_tac = reduction_tac ~reduction:ProofEngineReduction.reduce ;;
let whd_tac = reduction_tac ~reduction:CicReduction.whd ;;
-let fold_tac ~term ~status:(proof,goal) =
+let fold_tac ~also_in_hypotheses ~term ~status:(proof,goal) =
let curi,metasenv,pbo,pty = proof in
let metano,context,ty = List.find (function (m,_,_) -> m=goal) metasenv in
let term' = CicReduction.whd context term in
ProofEngineReduction.replace ~equality:(=) ~what:term' ~with_what:term
in
let ty' = replace ty in
- let context' =
- List.map
- (function
- Some (n,Cic.Decl t) -> Some (n,Cic.Decl (replace t))
- | Some (n,Cic.Def t) -> Some (n,Cic.Def (replace t))
- | None -> None
- ) context
- in
- let metasenv' =
+ let metasenv' =
+ let context' =
+ if also_in_hypotheses then
+ List.map
+ (function
+ Some (n,Cic.Decl t) -> Some (n,Cic.Decl (replace t))
+ | Some (n,Cic.Def t) -> Some (n,Cic.Def (replace t))
+ | None -> None
+ ) context
+ else
+ context
+ in
List.map
(function
(n,_,_) when n = metano -> (metano,context',ty')
| _ as t -> t
) metasenv
- in
- (curi,metasenv',pbo,pty), [metano]
+
+ in
+ (curi,metasenv',pbo,pty), [metano]
;;