X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_tactics%2FnTactics.ml;h=fe7f176a0e5a3a8ed3a44e0d4c7e9a0228868da4;hb=e603c19e82c160362587cb0bc578287c87122b90;hp=e751cca58eee8af0eef424ce5f2b0bd6a4804d30;hpb=8bc5bc0e8375a85736f6a5df317d129d5efa8de4;p=helm.git diff --git a/helm/software/components/ng_tactics/nTactics.ml b/helm/software/components/ng_tactics/nTactics.ml index e751cca58..fe7f176a0 100644 --- a/helm/software/components/ng_tactics/nTactics.ml +++ b/helm/software/components/ng_tactics/nTactics.ml @@ -28,8 +28,8 @@ let print_tac print_status message status = ;; let dot_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | ([], _, [], _) :: _ as stack -> (* backward compatibility: do-nothing-dot *) @@ -43,12 +43,12 @@ let dot_tac status = (([ loc ], t, k, tag) :: s) | _ -> fail (lazy "can't use \".\" here") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let branch_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | (g, t, k, tag) :: s -> match init_pos g with (* TODO *) @@ -56,12 +56,12 @@ let branch_tac status = | loc :: loc_tl -> ([ loc ], [], [], `BranchTag) :: (loc_tl, t, k, tag) :: s in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let shift_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | (g, t, k, `BranchTag) :: (g', t', k', tag) :: s -> (match g' with | [] -> fail (lazy "no more goals to shift") @@ -70,12 +70,12 @@ let shift_tac status = :: (loc_tl, t', k', tag) :: s)) | _ -> fail (lazy "can't shift goals here") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let pos_tac i_s status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | ([ loc ], t, [],`BranchTag) :: (g', t', k', tag) :: s when is_fresh loc -> @@ -84,35 +84,35 @@ let pos_tac i_s status = :: (([ loc ] @+ g') @- l_js, t', k', tag) :: s) | _ -> fail (lazy "can't use relative positioning here") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let wildcard_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | ([ loc ] , t, [], `BranchTag) :: (g', t', k', tag) :: s when is_fresh loc -> (([loc] @+ g', t, [], `BranchTag) :: ([], t', k', tag) :: s) | _ -> fail (lazy "can't use wildcard here") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let merge_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | (g, t, k,`BranchTag) :: (g', t', k', tag) :: s -> ((t @+ filter_open g @+ g' @+ k, t', k', tag) :: s) | _ -> fail (lazy "can't merge goals here") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let focus_tac gs status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | s -> assert(gs <> []); let stack_locs = @@ -126,22 +126,22 @@ let focus_tac gs status = gs; (zero_pos gs, [], [], `FocusTag) :: deep_close gs s in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let unfocus_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | ([], [], [], `FocusTag) :: s -> s | _ -> fail (lazy "can't unfocus, some goals are still open") in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let skip_tac status = - let new_gstatus = - match status.gstatus with + let gstatus = + match status#stack with | [] -> assert false | (gl, t, k, tag) :: s -> let gl = List.map switch_of_loc gl in @@ -150,7 +150,7 @@ let skip_tac status = else ([],t,k,tag) :: s in - { status with gstatus = new_gstatus } + status#set_stack gstatus ;; let block_tac l status = @@ -158,8 +158,8 @@ let block_tac l status = ;; let compare_statuses ~past ~present = - let _,_,past,_,_ = past.pstatus in - let _,_,present,_,_ = present.pstatus in + let _,_,past,_,_ = past#obj in + let _,_,present,_,_ = present#obj in List.map fst (List.filter (fun (i,_) -> not(List.mem_assoc i past)) present), List.map fst (List.filter (fun (i,_) -> not (List.mem_assoc i present)) past) ;; @@ -181,12 +181,16 @@ let compare_statuses ~past ~present = let exec tac low_status g = let stack = [ [0,Open g], [], [], `NoTag ] in - let status = tac { gstatus = stack ; istatus = low_status } in - status.istatus + let status = + (new NTacStatus.status low_status#obj stack)#set_estatus + (low_status :> NEstatus.status) + in + let status = tac status in + (low_status#set_estatus (status :> NEstatus.status))#set_obj status#obj ;; let distribute_tac tac status = - match status.gstatus with + match status#stack with | [] -> assert false | (g, t, k, tag) :: s -> debug_print (lazy ("context length " ^string_of_int (List.length g))); @@ -210,7 +214,10 @@ let distribute_tac tac status = in aux s go gc loc_tl in - let s0, go0, gc0 = status.istatus, [], [] in + let s0 = + (new NTacStatus.status status#obj ())#set_estatus + (status :> NEstatus.status) in + let s0, go0, gc0 = s0, [], [] in let sn, gon, gcn = aux s0 go0 gc0 g in debug_print (lazy ("opened: " ^ String.concat " " (List.map string_of_int gon))); @@ -219,17 +226,45 @@ let distribute_tac tac status = let stack = (zero_pos gon, t @~- gcn, k @~- gcn, tag) :: deep_close gcn s in - { gstatus = stack; istatus = sn } + ((status#set_stack stack)#set_obj (sn :> lowtac_status)#obj)#set_estatus (sn :> NEstatus.status) ;; let atomic_tac htac = distribute_tac (exec htac) ;; +let try_tac tac status = + try + tac status + with NTacStatus.Error _ -> + status +;; + +let first_tac tacl status = + let res = + HExtlib.list_findopt + (fun tac _ -> try Some (tac status) with NTacStatus.Error _ -> None) tacl + in + match res with + | None -> raise (NTacStatus.Error (lazy("No tactic left"))) + | Some x -> x +;; + let exact_tac t = distribute_tac (fun status goal -> let goalty = get_goalty status goal in let status, t = disambiguate status t (Some goalty) (ctx_of goalty) in instantiate status goal t) ;; +let assumption_tac status = distribute_tac (fun status goal -> + let gty = get_goalty status goal in + let context = ctx_of gty in + let htac = + first_tac + (List.map (fun (name,_) -> exact_tac ("",0,(Ast.Ident (name,None)))) + context) + in + exec htac status goal) status +;; + let find_in_context name context = let rec aux acc = function | [] -> raise Not_found @@ -252,9 +287,9 @@ let clear_tac names = fail (lazy ("hypothesis '" ^ name ^ "' not found"))) names in - let n,h,metasenv,subst,o = status.pstatus in + let n,h,metasenv,subst,o = status#obj in let metasenv,subst,_ = NCicMetaSubst.restrict metasenv subst goal js in - { status with pstatus = n,h,metasenv,subst,o }) + status#set_obj (n,h,metasenv,subst,o)) ;; let generalize0_tac args = @@ -433,8 +468,7 @@ let elim_tac ~what ~where = let sort = HExtlib.unopt !sort in let ity = HExtlib.unopt !indtyinfo in let NReference.Ref (uri, _) = ity.reference in - let istatus, sort = term_of_cic_term status.istatus sort (ctx_of sort) in - let status = { status with istatus = istatus } 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" @@ -538,7 +572,7 @@ let assert0_tac (hyps,concl) = distribute_tac (fun status goal -> ;; let assert_tac seqs status = - match status.gstatus with + match status#stack with | [] -> assert false | (g,_,_,_) :: s -> assert (List.length g = List.length seqs); @@ -556,21 +590,23 @@ let assert_tac seqs status = let auto ~params:(l,_) status goal = let gty = get_goalty status goal in - let n,h,metasenv,subst,o = status.pstatus in + let n,h,metasenv,subst,o = status#obj in let status,t = term_of_cic_term status gty (ctx_of gty) in let status, l = List.fold_left (fun (status, l) t -> let status, t = disambiguate status t None (ctx_of gty) in let status, ty = typeof status (ctx_of t) t in - let status, t = term_of_cic_term status t (ctx_of gty) in + let status, t = term_of_cic_term status t (ctx_of gty) in let status, ty = term_of_cic_term status ty (ctx_of ty) in (status, (t,ty) :: l)) (status,[]) l in - let rdb = status.estatus.NEstatus.rstatus in - Paramod.nparamod rdb metasenv subst (ctx_of gty) (NCic.Rel ~-1,t) l; - status + let pt, metasenv, subst = + Paramod.nparamod status metasenv subst (ctx_of gty) (NCic.Rel ~-1,t) l + in + let status = status#set_obj (n,h,metasenv,subst,o) in + instantiate status goal (NTacStatus.mk_cic_term (ctx_of gty) pt) ;; let auto_tac ~params status =