]> matita.cs.unibo.it Git - helm.git/commitdiff
exec and distribute implemented
authorEnrico Tassi <enrico.tassi@inria.fr>
Fri, 27 Mar 2009 12:11:01 +0000 (12:11 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Fri, 27 Mar 2009 12:11:01 +0000 (12:11 +0000)
helm/software/components/ng_tactics/nTactics.ml
helm/software/components/ng_tactics/nTactics.mli

index 4ce980b28e60ca2b14b77397ef9415713b62e7ff..baa7f38a99bd78d72fc751822842b164a1a5731b 100644 (file)
@@ -167,7 +167,37 @@ 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'
+
+   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 +231,73 @@ 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)
+(* attempt....
+type cic_term = NCic.conjecture
+type ast_term = 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 : low_status) (g : int) =
+ let _,_,metasenv,_,_ = status.pstatus in
+ List.assoc goal 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 apply t (status as orig,goal) =
+ let goal = get_goal status goal in
+ let status, t = disambiguate status t goal (Term goal) in
+ let subst, metasenv = 
+   (goal, (name, context, t, gty)):: subst,
+   List.filter(fun (x,_) -> x <> goal) metasenv
+ 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 +305,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) ;;
 
index 831704924ab46539d1d891c0144ac7afed8a9927..f9747e824de9a066b122df1083cf606c2b8d5ef4 100644 (file)
@@ -38,7 +38,8 @@ val focus_tac: int list -> tactic
 val unfocus_tac: tactic
 val skip_tac: tactic
 
-val fold_tactic: lowtactic -> tactic
+val distribute_tac: lowtactic -> tactic
+val block_tac: tactic list -> tactic
 
 val apply_tac: tactic_term -> tactic