X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_tactics%2FnTactics.ml;h=f9916befc851b48a2eeca70d6aa7d476fc819740;hb=a3ee89dab26307ce1cedc8041ede995a97d51446;hp=110e882af2b02c51752ef2411e41f1c60c5047e4;hpb=79659e9015f1f7079b1e7ef846288de60019093a;p=helm.git diff --git a/helm/software/components/ng_tactics/nTactics.ml b/helm/software/components/ng_tactics/nTactics.ml index 110e882af..f9916befc 100644 --- a/helm/software/components/ng_tactics/nTactics.ml +++ b/helm/software/components/ng_tactics/nTactics.ml @@ -274,9 +274,6 @@ let select0_tac ~where:(wanted,hyps,where) ~job = let path = match where with None -> NCic.Implicit `Term | Some where -> where in - let status, newgoalty = - select_term status ~found ~postprocess goalty (wanted,path) - in let status, newgoalctx = List.fold_right (fun (name,d as entry) (status,ctx) -> @@ -299,6 +296,16 @@ let select0_tac ~where:(wanted,hyps,where) ~job = Not_found -> status, entry::ctx ) (ctx_of goalty) (status,[]) in + let status, newgoalty = + select_term status ~found ~postprocess goalty (wanted,path) in + (* WARNING: the next two lines simply change the context of newgoalty + from the old to the new one. Otherwise mk_meta will do that herself, + calling relocate that calls delift. However, newgoalty is now + ?[out_scope] and thus the delift would trigger the special unification + case, which is wrong now :-( *) + let status,newgoalty = term_of_cic_term status newgoalty (ctx_of goalty) in + let newgoalty = mk_cic_term newgoalctx newgoalty in + let status, instance = mk_meta status newgoalctx (`Decl newgoalty) in @@ -329,25 +336,37 @@ let generalize_tac ~where = select_tac ~where ~job:(`Collect l) true; print_tac true "ha selezionato?"; (fun s -> distribute_tac (fun status goal -> - if !l = [] then fail (lazy "No term to generalize"); - let goalty = get_goalty status goal in - let canon = List.hd !l in - let status = + let goalty = get_goalty status goal in + let status,canon,rest = + match !l with + [] -> + (match where with + _,_,(None,_,_) -> fail (lazy "No term to generalize") + | txt,txtlen,(Some what,_,_) -> + let status, what = + disambiguate status (txt,txtlen,what) None (ctx_of goalty) + in + status,what,[] + ) + | he::tl -> status,he,tl in + let status = List.fold_left - (fun s t -> unify s (ctx_of goalty) canon t) status (List.tl !l) - in - let status, canon = term_of_cic_term status canon (ctx_of goalty) in - instantiate status goal - (mk_cic_term (ctx_of goalty) (NCic.Appl [NCic.Implicit `Term ; canon ])) + (fun s t -> unify s (ctx_of goalty) canon t) status rest in + let status, canon = term_of_cic_term status canon (ctx_of goalty) in + instantiate status goal + (mk_cic_term (ctx_of goalty) (NCic.Appl [NCic.Implicit `Term ; canon ])) ) s) ] ;; -let eval_tac ~reduction ~where = +let reduce_tac ~reduction ~where = let change status t = match reduction with + | `Normalize perform_delta -> + normalize status + ?delta:(if perform_delta then None else Some max_int) (ctx_of t) t | `Whd perform_delta -> - whd status - ?delta:(if perform_delta then None else Some max_int) (ctx_of t) t + whd status + ?delta:(if perform_delta then None else Some max_int) (ctx_of t) t in let where = GrafiteDisambiguate.disambiguate_npattern where in select0_tac ~where ~job:(`ChangeWith change) @@ -363,23 +382,11 @@ let change_tac ~where ~with_what = select0_tac ~where ~job:(`ChangeWith change) ;; -let letin_tac ~where:(_,_,(m,hyp,gp)) ~what:(_,_,w) name = - assert(m = None); - let where = Some w, [], - match gp with - | None -> Some Ast.Implicit - | Some where -> - Some - (List.fold_left - (fun t _ -> - Ast.Binder(`Pi,(Ast.Ident("_",None),Some Ast.UserInput),t)) - where hyp) - in - block_tac [ - generalize0_tac (List.map (fun (name,_) -> Ast.Ident (name,None)) hyp); - exact_tac ("",0,Ast.LetIn((Ast.Ident (name,None),None),w,Ast.Implicit)); - change_tac ~where:("",0,where) ~with_what:("",0,Ast.Ident (name,None)) - ] +let letin_tac ~where ~what:(_,_,w) name = + block_tac [ + select_tac ~where ~job:(`Substexpand 1) true; + exact_tac ("",0,Ast.LetIn((Ast.Ident (name,None),None),w,Ast.Implicit)); + ] ;; let apply_tac = exact_tac;; @@ -494,7 +501,7 @@ let case1_tac name = cases_tac ~where:("",0,(None,[],None)) ~what:("",0,Ast.Ident (name,None)); - if name = "_clearme" then clear_tac ["_clearme"] else id_tac ] + if name = "_clearme" then clear_tac ["_clearme"] else id_tac ] ;; let assert0_tac (hyps,concl) = distribute_tac (fun status goal -> @@ -515,7 +522,7 @@ let assert0_tac (hyps,concl) = distribute_tac (fun status goal -> let status,_ = List.fold_right2 (fun (id1,e1) ((id2,e2) as item) (status,ctx) -> - assert (id1=id2); + assert (id1=id2 || (prerr_endline (id1 ^ " vs " ^ id2); false)); match e1,e2 with `Decl t1, NCic.Decl t2 -> let status = eq status ctx t1 t2 in @@ -546,3 +553,15 @@ let assert_tac seqs status = [merge_tac]) ) status ;; + +let auto ~params status goal = + let gty = get_goalty status goal in + let n,h,metasenv,subst,o = status.pstatus in + let status,t = term_of_cic_term status gty (ctx_of gty) in + Paramod.nparamod metasenv subst (ctx_of gty) t; + status +;; + +let auto_tac ~params status = + distribute_tac (auto ~params) status +;;