X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_tactics%2FnTactics.ml;h=29683eea5c721f412b08e9c7ba584862bcade754;hb=e8164f9de889435794efac0fa83fc7b9b766428f;hp=f5ae3a721e4880a955d4be5463252cf4423e2a36;hpb=12f96bd48b460d06f9858a334ee7c52d6831712f;p=helm.git diff --git a/helm/software/components/ng_tactics/nTactics.ml b/helm/software/components/ng_tactics/nTactics.ml index f5ae3a721..29683eea5 100644 --- a/helm/software/components/ng_tactics/nTactics.ml +++ b/helm/software/components/ng_tactics/nTactics.ml @@ -22,7 +22,7 @@ module Ast = CicNotationPt let id_tac status = status ;; let print_tac print_status message status = - if print_status then pp_status status; + if print_status then pp_tac_status status; prerr_endline message; status ;; @@ -261,10 +261,13 @@ let repeat_tac t s = let try_tac tac status = + let try_tac status = try tac status with NTacStatus.Error _ -> status + in + atomic_tac try_tac status ;; let first_tac tacl status = @@ -371,7 +374,7 @@ let select0_tac ~where:(wanted,hyps,where) ~job = let status, instance = mk_meta status newgoalctx (`Decl newgoalty) `IsTerm in - instantiate status goal instance) + instantiate ~refine:false status goal instance) ;; let select_tac ~where ~job move_down_hyps = @@ -420,12 +423,12 @@ let generalize_tac ~where = ;; let cut_tac t = - block_tac [ + atomic_tac (block_tac [ exact_tac ("",0, Ast.Appl [Ast.Implicit `JustOne; Ast.Implicit `JustOne]); branch_tac; pos_tac [3]; exact_tac t; shift_tac; pos_tac [2]; skip_tac; - merge_tac ] + merge_tac ]) ;; let lapply_tac (s,n,t) = @@ -476,6 +479,7 @@ type indtyinfo = { lefts: NCic.term list; rights: NCic.term list; reference: NReference.reference; + term: NCic.term } ;; @@ -489,9 +493,10 @@ let analyze_indty_tac ~what indtyref = let status, (r,consno,lefts,rights) = analyse_indty status ty_what in let leftno = List.length lefts in let rightno = List.length rights in + let status,what = term_of_cic_term status what (ctx_of goalty) in indtyref := Some { rightno = rightno; leftno = leftno; consno = consno; - lefts = lefts; rights = rights; reference = r; + lefts = lefts; rights = rights; reference = r; term = what }; exec id_tac status goal) ;; @@ -523,8 +528,8 @@ let elim_tac ~what:(txt,len,what) ~where = (match !sort with NCic.Sort x -> x | _ -> assert false)) in let eliminator = - let _,_,w = what in - Ast.Appl [ Ast.Ident (name,None) ; Ast.Implicit `Vector ; w ] + let what = (HExtlib.unopt !indtyinfo).term in + Ast.Appl [ Ast.Ident (name,None) ; Ast.Implicit `Vector ; Ast.NCic what ] in exact_tac ("",0,eliminator) status) ]) ;; @@ -540,8 +545,9 @@ let rewrite_tac ~dir ~what:(_,_,what) ~where status = `LeftToRight -> "eq" ^ suffix ^ "_r" | `RightToLeft -> "eq" ^ suffix in + let what = Ast.Appl [what; Ast.Implicit `Vector] in block_tac - [ select_tac ~where ~job:(`Substexpand 1) true; + [ select_tac ~where ~job:(`Substexpand 2) true; exact_tac ("",0, Ast.Appl(Ast.Ident(name,None)::HExtlib.mk_list (Ast.Implicit `JustOne) 5@ @@ -556,6 +562,25 @@ let intro_tac name = if name = "_" then clear_tac [name] else id_tac ] ;; +let name_counter = ref 0;; +let intros_tac ?names_ref names s = + let names_ref, prefix = + match names_ref with | None -> ref [], "__" | Some r -> r, "H" + in + if names = [] then + repeat_tac + (fun s -> + incr name_counter; + (* TODO: generate better names *) + let name = prefix ^ string_of_int !name_counter in + let s = intro_tac name s in + names_ref := !names_ref @ [name]; + s) + s + else + block_tac (List.map intro_tac names) s +;; + let cases ~what status goal = let gty = get_goalty status goal in let status, what = disambiguate status (ctx_of gty) what None in @@ -575,9 +600,13 @@ let cases_tac ~what:(txt,len,what) ~where = atomic_tac (block_tac [ analyze_indty_tac ~what indtyinfo; - (fun s -> select_tac - ~where ~job:(`Substexpand ((HExtlib.unopt !indtyinfo).rightno+1))true s); - distribute_tac (cases ~what) ]) + (fun s -> + select_tac + ~where ~job:(`Substexpand ((HExtlib.unopt !indtyinfo).rightno+1))true + s); + (fun s -> + distribute_tac + (cases ~what:("",0,Ast.NCic (HExtlib.unopt !indtyinfo).term)) s); ]) ;; let case1_tac name = @@ -652,3 +681,26 @@ let assert_tac seqs status = ) status ;; +let inversion_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 (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); + sort_of_goal_tac sort; + (fun status -> + let ity = HExtlib.unopt !indtyinfo in + let NReference.Ref (uri, _) = ity.reference in + let name = + NUri.name_of_uri uri ^ "_inv_" ^ + snd (NCicElim.ast_of_sort + (match !sort with NCic.Sort x -> x | _ -> assert false)) + in + let eliminator = + let what = (HExtlib.unopt !indtyinfo).term in + Ast.Appl [ Ast.Ident (name,None) ; Ast.Implicit `Vector ; Ast.NCic what ] + in + exact_tac ("",0,eliminator) status) ]) +;;