X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_tactics%2FnTactics.ml;h=1644186a1a558cca45538aa560b96387e9038e98;hb=dc7c02d8d8678d250a99dd6d012adcd69da63b75;hp=0ba8e4b4416a9b803e3b9e5c1df361191b13990a;hpb=b91d9e60b0a5f450d2725d4b9bb3ed7f81ef6d3a;p=helm.git diff --git a/helm/software/components/ng_tactics/nTactics.ml b/helm/software/components/ng_tactics/nTactics.ml index 0ba8e4b44..1644186a1 100644 --- a/helm/software/components/ng_tactics/nTactics.ml +++ b/helm/software/components/ng_tactics/nTactics.ml @@ -87,6 +87,26 @@ let pos_tac i_s status = status#set_stack gstatus ;; +let case_tac lab status = + let gstatus = + match status#stack with + | [] -> assert false + | ([ loc ], t, [],`BranchTag) :: (g', t', k', tag) :: s + when is_fresh loc -> + let l_js = + List.filter + (fun curloc -> + let _,_,metasenv,_,_ = status#obj in + match NCicUtils.lookup_meta (goal_of_loc curloc) metasenv with + attrs,_,_ when List.mem (`Name lab) attrs -> true + | _ -> false) ([loc] @+ g') in + ((l_js, t , [],`BranchTag) + :: (([ loc ] @+ g') @- l_js, t', k', tag) :: s) + | _ -> fail (lazy "can't use relative positioning here") + in + status#set_stack gstatus +;; + let wildcard_tac status = let gstatus = match status#stack with @@ -477,33 +497,31 @@ let analyze_indty_tac ~what indtyref = exec id_tac status goal) ;; +let sort_of_goal_tac sortref = distribute_tac (fun status goal -> + let goalty = get_goalty status goal in + let status,sort = typeof status (ctx_of goalty) goalty in + let sort = fix_sorts sort in + let status, sort = term_of_cic_term status sort (ctx_of goalty) in + sortref := sort; + status) +;; + let elim_tac ~what:(txt,len,what) ~where = let what = txt, len, Ast.Appl [what; Ast.Implicit `Vector] in let indtyinfo = ref None in - let sort = ref None in - let compute_goal_sort_tac = distribute_tac (fun status goal -> - let goalty = get_goalty status goal in - let status, goalsort = typeof status (ctx_of goalty) goalty in - let goalsort = fix_sorts goalsort in - sort := Some goalsort; - exec id_tac status goal) - in + let sort = ref (NCic.Rel 1) in atomic_tac (block_tac [ analyze_indty_tac ~what indtyinfo; (fun s -> select_tac ~where ~job:(`Substexpand ((HExtlib.unopt !indtyinfo).rightno+1)) true s); - compute_goal_sort_tac; + sort_of_goal_tac sort; (fun status -> - let sort = HExtlib.unopt !sort in let ity = HExtlib.unopt !indtyinfo in let NReference.Ref (uri, _) = ity.reference in - let status, sort = term_of_cic_term status sort (ctx_of sort) in - let name = NUri.name_of_uri uri ^ - match sort with - | NCic.Sort NCic.Prop -> "_ind" - | NCic.Sort NCic.Type u -> - "_rect_" ^ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] sort - | _ -> assert false + let name = + NUri.name_of_uri uri ^ "_" ^ + snd (NCicElim.ast_of_sort + (match !sort with NCic.Sort x -> x | _ -> assert false)) in let eliminator = let _,_,w = what in @@ -512,23 +530,11 @@ let elim_tac ~what:(txt,len,what) ~where = exact_tac ("",0,eliminator) status) ]) ;; -let sort_of_goal_tac sortref = distribute_tac (fun status goal -> - let goalty = get_goalty status goal in - let status,sort = typeof status (ctx_of goalty) goalty in - let status,sort = term_of_cic_term status sort (ctx_of goalty) in - sortref := sort; - status) -;; - let rewrite_tac ~dir ~what:(_,_,what) ~where status = let sortref = ref (NCic.Rel 1) in let status = sort_of_goal_tac sortref status in - let suffix = - match !sortref with - | NCic.Sort NCic.Prop -> "_ind" - | NCic.Sort NCic.Type u -> - "_rect_" ^ NCicPp.ppterm ~metasenv:[] ~subst:[] ~context:[] !sortref - | _ -> assert false + let suffix = "_" ^ snd (NCicElim.ast_of_sort + (match !sortref with NCic.Sort x -> x | _ -> assert false)) in let name = match dir with