X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Ftactics%2FsubstTactic.ml;h=feff68f3fb8186f4ab4644ff2b07cce1b0e7accc;hb=66929b8edb58d468a134b648466f3e9c45ba5c0e;hp=ef2a297e1cfc81e32d9b42e84d294421eb4fd73e;hpb=b54b2b352753b1c784d06118fc689c1ee9f9feaf;p=helm.git diff --git a/helm/software/components/tactics/substTactic.ml b/helm/software/components/tactics/substTactic.ml index ef2a297e1..feff68f3f 100644 --- a/helm/software/components/tactics/substTactic.ml +++ b/helm/software/components/tactics/substTactic.ml @@ -40,7 +40,7 @@ module TC = CicTypeChecker let lift_rewrite_tac ~context ~direction ~pattern equality = let lift_rewrite_tac status = let (proof, goal) = status in - let (_, metasenv, _, _, _) = proof in + let (_, metasenv, _subst, _, _, _) = proof in let _, new_context, _ = CicUtil.lookup_meta goal metasenv in let n = List.length new_context - List.length context in let equality = S.lift n equality in @@ -51,7 +51,7 @@ let lift_rewrite_tac ~context ~direction ~pattern equality = let lift_destruct_tac ~context ~what = let lift_destruct_tac status = let (proof, goal) = status in - let (_, metasenv, _, _, _) = proof in + let (_, metasenv, _subst, _, _, _) = proof in let _, new_context, _ = CicUtil.lookup_meta goal metasenv in let n = List.length new_context - List.length context in let what = S.lift n what in @@ -67,6 +67,11 @@ let msg3 = lazy "Subst: no progress" let rec subst_tac ~try_tactic ~hyp = let hole = C.Implicit (Some `Hole) in let meta = C.Implicit None in + let rec ind = function + | C.MutInd _ -> true + | C.Appl (t :: tl) -> ind t + | _ -> false + in let rec constr = function | C.MutConstruct _ -> true | C.Appl (t :: tl) -> constr t @@ -74,7 +79,7 @@ let rec subst_tac ~try_tactic ~hyp = in let subst_tac status = let (proof, goal) = status in - let (_, metasenv, _, _, _) = proof in + let (_, metasenv, _subst, _, _, _) = proof in let _, context, _ = CicUtil.lookup_meta goal metasenv in let what = match PEH.get_rel context hyp with | Some t -> t @@ -105,7 +110,7 @@ let rec subst_tac ~try_tactic ~hyp = [lift_destruct_tac ~context ~what; PESR.clear ~hyps:[hyp]] in let whd_g () = - let whd_pattern = C.Appl [meta; meta; hole; hole] in + let whd_pattern = C.Appl [meta; hole; hole; hole] in let pattern = None, [hyp, whd_pattern], None in [RT.whd_tac ~pattern; subst_tac ~try_tactic ~hyp] in @@ -114,8 +119,8 @@ let rec subst_tac ~try_tactic ~hyp = when LO.is_eq_URI uri -> subst_g `LeftToRight i t | (C.Appl [(C.MutInd (uri, 0, [])); _; t; C.Rel i]) when LO.is_eq_URI uri -> subst_g `RightToLeft i t - | (C.Appl [(C.MutInd (uri, 0, [])); _; t1; t2]) - when LO.is_eq_URI uri && constr t1 && constr t2 -> destruct_g () + | (C.Appl [(C.MutInd (uri, 0, [])); t; t1; t2]) + when LO.is_eq_URI uri && ind t && constr t1 && constr t2 -> destruct_g () | (C.Appl [(C.MutInd (uri, 0, [])); _; t1; t2]) when LO.is_eq_URI uri -> whd_g () | _ -> raise (PET.Fail msg1) @@ -143,7 +148,7 @@ let subst_tac = | _ -> None in let (proof, goal) = status in - let (_, metasenv, _, _, _) = proof in + let (_, metasenv, _subst, _, _, _) = proof in let _, context, _ = CicUtil.lookup_meta goal metasenv in let tactics = HEL.list_rev_map_filter map context in let result = PET.apply_tactic (T.seq ~tactics) status in