X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_tactics%2FnTactics.ml;h=dd09178c2d70cc27073d183ad73abcd516c0a812;hb=9bfe6aa2b2c3cdc09b1c9445789329d74bfef7d7;hp=4ce980b28e60ca2b14b77397ef9415713b62e7ff;hpb=42f25c258b0b199ee96dd8eaa3d44c86eb6916ab;p=helm.git diff --git a/helm/software/components/ng_tactics/nTactics.ml b/helm/software/components/ng_tactics/nTactics.ml index 4ce980b28..dd09178c2 100644 --- a/helm/software/components/ng_tactics/nTactics.ml +++ b/helm/software/components/ng_tactics/nTactics.ml @@ -167,7 +167,39 @@ let skip_tac status = { status with gstatus = new_gstatus } ;; -let fold_tactic tac status = +let block_tac l status = + List.fold_left (fun status tac -> tac status) status l +;; + +let compare_menv ~past ~present = + 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) +;; + +(* Exec and distribute_tac form a retraction pair: + 1) exec (distribute_tac low_tac) (s,i) = low_tac (s,i) + 2) tac [s]::G = G1::...::Gn::G' && G' is G with some goals closed => + distribute_tac (exec tac) [s]::G = (G1@...Gn)::G' + 3) tac G = distribute_tac (exec tac) G if + tac = distribute_tac lowtac + + Note that executing an high tactic on a set of goals may be stronger + than executing the same tactic on those goals, but once at a time + (e.g. the tactic could perform a global analysis of the set of goals) +*) + +let exec tac (low_status,g) = + let stack = [ [0,Open g], [], [], `NoTag ] in + let _,_,old_metasenv,_,_ = low_status.pstatus in + let status = tac { gstatus = stack ; istatus = low_status } in + let _,_,metasenv,_,_ = status.istatus.pstatus in + let open_goals, closed_goals = + compare_menv ~past:old_metasenv ~present:metasenv + in + status.istatus, open_goals, closed_goals +;; + +let distribute_tac tac status = match status.gstatus with | [] -> assert false | (g, t, k, tag) :: s -> @@ -201,25 +233,79 @@ let fold_tactic tac status = { gstatus = stack; istatus = sn } ;; -let compare_menv ~past ~present = - 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) +(* + +type cic_term = NCic.conjecture +type ast_term = string * int * CicNotationPt.term +type position = Ctx of NCic.context | Term of cic_term + +let relocate (name,ctx,t as term) context = + if ctx = context then term else assert false +;; + +let disambiguate (status : lowtac_status) (t : ast_term) + (ty : cic_term option) (where : position) = + let uri,height,metasenv,subst,obj = status.pstatus in + let context = match where with Ctx c -> c | Term (_,c,_) -> c in + let expty = + match ty with + | None -> None | Some ty -> let _,_,x = relocate ty context in Some x + in + let metasenv, subst, lexicon_status, t = + GrafiteDisambiguate.disambiguate_nterm expty + status.lstatus context metasenv subst t + in + let new_pstatus = uri,height,metasenv,subst,obj in + { lstatus = lexicon_status; pstatus = new_pstatus }, (None, context, t) +;; + +let get_goal (status : lowtac_status) (g : int) = + let _,_,metasenv,_,_ = status.pstatus in + List.assoc g metasenv +;; + +let return ~orig status = + let _,_,past,_,_ = orig.pstatus in + let _,_,present,_,_ = status.pstatus in + let open_goals, closed_goals = compare_menv ~past ~present in + status, open_goals, closed_goals +;; + +let instantiate status i t = + let name,height,metasenv,subst,obj = status.pstatus in + let _, context, ty = List.assoc i metasenv in + let _,_,t = relocate t context in + let m = NCic.Meta (i,(0,NCic.Irl (List.length context))) in + let db = NCicUnifHint.db () in (* XXX fixme *) + let metasenv, subst = NCicUnification.unify db metasenv subst context m t in + { status with pstatus = (name,height,metasenv,subst,obj) } +;; + +let apply t (status as orig, goal) = + let goalty = get_goal status goal in + let status, t = disambiguate status t (Some goalty) (Term goalty) in + let status = instantiate status goal t in + return ~orig status ;; +*) let apply t (status,goal) = let uri,height,(metasenv as old_metasenv), subst,obj = status.pstatus in let name,context,gty = List.assoc goal metasenv in let metasenv, subst, lexicon_status, t = - GrafiteDisambiguate.disambiguate_nterm (Some gty) status.lstatus context metasenv subst t + GrafiteDisambiguate.disambiguate_nterm (Some gty) + status.lstatus context metasenv subst t in let subst, metasenv = (goal, (name, context, t, gty)):: subst, List.filter(fun (x,_) -> x <> goal) metasenv in - let open_goals, closed_goals = compare_menv ~past:old_metasenv ~present:metasenv in + let open_goals, closed_goals = + compare_menv ~past:old_metasenv ~present:metasenv in let new_pstatus = uri,height,metasenv,subst,obj in - prerr_endline ("termine disambiguato: " ^ NCicPp.ppterm ~context ~metasenv ~subst t); + prerr_endline ("termine disambiguato: " ^ + NCicPp.ppterm ~context ~metasenv ~subst t); prerr_endline ("menv:" ^ NCicPp.ppmetasenv ~subst metasenv); prerr_endline ("subst:" ^ NCicPp.ppsubst subst ~metasenv); prerr_endline "fine napply"; @@ -227,5 +313,5 @@ let apply t (status,goal) = { lstatus = lexicon_status; pstatus = new_pstatus }, open_goals, closed_goals ;; -let apply_tac t = fold_tactic (apply t) ;; +let apply_tac t = distribute_tac (apply t) ;;