X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Ftactics%2FdestructTactic.ml;h=a8bfc007d42ac395c2c5995686bc6cbc181daf33;hb=42f2dc48b4fef5b404f406bf512d6a0cde35c067;hp=8164fc5f68a2165029697fc74b4fbff6e31060c9;hpb=55891f80b4f14251dfd5c9111f22f5edcbde2e11;p=helm.git diff --git a/components/tactics/destructTactic.ml b/components/tactics/destructTactic.ml index 8164fc5f6..a8bfc007d 100644 --- a/components/tactics/destructTactic.ml +++ b/components/tactics/destructTactic.ml @@ -247,7 +247,7 @@ let exists context = function | C.Rel i -> List.nth context (pred i) <> None | _ -> true -let rec recur_on_child_tac ~before = +let recur_on_child_tac ~before ~after = let recur_on_child status = let (proof, goal) = status in let _, metasenv, _subst, _, _, _ = proof in @@ -259,13 +259,12 @@ let rec recur_on_child_tac ~before = S.lift distance term, m, ug in let lterm = mk_lterm (Cic.Rel 1) in - let continuation = destruct ~first_time:false lterm in - let tactic = T.then_ ~start:before ~continuation in + let tactic = T.then_ ~start:before ~continuation:(after lterm) in PET.apply_tactic tactic status in PET.mk_tactic recur_on_child -and injection_tac ~lterm ~i ~continuation = +let injection_tac ~lterm ~i ~continuation ~recur = let give_name seed = function | C.Name _ as name -> name | C.Anonymous -> C.Name (incr seed; "y" ^ string_of_int !seed) @@ -429,7 +428,7 @@ and injection_tac ~lterm ~i ~continuation = let tactic = T.thens ~start: (P.cut_tac cutted) ~continuations:[ - recur_on_child_tac continuation; + recur_on_child_tac continuation recur; fill_cut_tac term ] in @@ -438,7 +437,7 @@ and injection_tac ~lterm ~i ~continuation = in PET.mk_tactic injection_tac -and subst_tac ~lterm ~direction ~where ~continuation = +let subst_tac ~lterm ~direction ~where ~continuation ~recur = let subst_tac status = let (proof, goal) = status in let _,metasenv,_subst,_,_, _ = proof in @@ -455,17 +454,18 @@ and subst_tac ~lterm ~direction ~where ~continuation = debug_print (lazy ("nella premessa: " ^ name)); let pattern = None, [name, PET.hole], None in let start = ET.rewrite_tac ~direction ~pattern term [] in - let ok_tactic = recur_on_child_tac continuation in + let ok_tactic = recur_on_child_tac continuation recur in T.if_ ~start ~continuation:ok_tactic ~fail:continuation in PET.apply_tactic tactic status in PET.mk_tactic subst_tac -and destruct ~first_time lterm = +let rec destruct ~first_time lterm = let are_convertible hd1 hd2 metasenv context = fst (CR.are_convertible ~metasenv context hd1 hd2 CU.empty_ugraph) in + let recur = destruct ~first_time:false in let destruct status = let (proof, goal) = status in let _,metasenv,_subst, _,_, _ = proof in @@ -492,10 +492,10 @@ and destruct ~first_time lterm = clear_term false (mk_lterm with_what) ] in - subst_tac ~direction ~lterm ~where:None ~continuation + subst_tac ~direction ~lterm ~where:None ~continuation ~recur | Some (C.Name name, _) :: tl when j < index && j <> k -> debug_print (lazy ("\nsubst programmata: cosa: " ^ string_of_int index ^ ", dove: " ^ string_of_int j)); - subst_tac ~direction ~lterm ~where:(Some name) + subst_tac ~direction ~lterm ~where:(Some name) ~recur ~continuation:(traverse_context false (succ j) tl) | _ :: tl -> traverse_context first_time (succ j) tl in @@ -519,7 +519,7 @@ and destruct ~first_time lterm = if are_convertible hd1 hd2 metasenv context then traverse_list first_time (succ i) tl1 tl2 else - injection_tac ~i ~lterm ~continuation: + injection_tac ~i ~lterm ~recur ~continuation: (traverse_list false (succ i) tl1 tl2) | _ -> assert false (* i 2 termini hanno in testa lo stesso costruttore, @@ -563,7 +563,7 @@ and destruct ~first_time lterm = PET.mk_tactic destruct (* destruct performs either injection or discriminate or subst *) -let destruct_tac xterm = +let destruct_tac xterms = let destruct status = let (proof, goal) = status in let _,metasenv,_subst,_,_, _ = proof in @@ -572,9 +572,11 @@ let destruct_tac xterm = let distance = List.length c - List.length context in S.lift distance term, m, ug in - let tactics = match xterm with - | Some term -> [destruct ~first_time:true (mk_lterm term)] - | None -> + let tactics = match xterms with + | Some terms -> + let map term = destruct ~first_time:false (mk_lterm term) in + List.map map terms + | None -> let rec mk_tactics first_time i tacs = function | [] -> List.rev tacs | Some _ :: tl ->