]> matita.cs.unibo.it Git - helm.git/commitdiff
tentative subst-sexpand and change
authorEnrico Tassi <enrico.tassi@inria.fr>
Mon, 30 Mar 2009 16:13:40 +0000 (16:13 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Mon, 30 Mar 2009 16:13:40 +0000 (16:13 +0000)
helm/software/components/binaries/transcript/.depend
helm/software/components/binaries/transcript/.depend.opt
helm/software/components/grafite/grafiteAst.ml
helm/software/components/grafite/grafiteAstPp.ml
helm/software/components/grafite_engine/grafiteEngine.ml
helm/software/components/grafite_parser/grafiteParser.ml
helm/software/components/ng_tactics/nTactics.ml
helm/software/components/ng_tactics/nTactics.mli
helm/software/components/syntax_extensions/.depend

index 8121968e98a26e1c58cd7e25d809ffdd284e44d9..660edb2f59b7408e9cc7acdc1fedca119c02be07 100644 (file)
@@ -1,10 +1,5 @@
 v8Parser.cmi: types.cmo 
 grafite.cmi: types.cmo 
-engine.cmi: 
-types.cmo: 
-types.cmx: 
-options.cmo: 
-options.cmx: 
 v8Parser.cmo: types.cmo options.cmo v8Parser.cmi 
 v8Parser.cmx: types.cmx options.cmx v8Parser.cmi 
 v8Lexer.cmo: v8Parser.cmi options.cmo 
index b64d148de2aa649f3a052a87e532dff7840e9c5b..5e2c3e23cb9144f654cabb4f8763947c572dcc3e 100644 (file)
@@ -1,10 +1,5 @@
 v8Parser.cmi: types.cmx 
 grafite.cmi: types.cmx 
-engine.cmi: 
-types.cmo: 
-types.cmx: 
-options.cmo: 
-options.cmx: 
 v8Parser.cmo: types.cmx options.cmx v8Parser.cmi 
 v8Parser.cmx: types.cmx options.cmx v8Parser.cmi 
 v8Lexer.cmo: v8Parser.cmi options.cmx 
index 7593fe53abf36f0a9439070737a9640d5b0cd8e2..7b4411d02a23111fb64d98db310e1be8d523edea 100644 (file)
@@ -48,6 +48,7 @@ type 'term just =
 
 type ntactic =
    | NApply of loc * CicNotationPt.term
+   | NChange of loc * CicNotationPt.term * CicNotationPt.term
    | NId of loc
 
 type ('term, 'lazy_term, 'reduction, 'ident) tactic =
index 5785a10719f6afa269eab400db1f7540922986a7..3ab738ab789a579cc41611e42e15bc90f43d22e4 100644 (file)
@@ -91,6 +91,8 @@ let pp_just ~term_pp =
 
 let pp_ntactic ~map_unicode_to_tex = function
   | NApply (_,t) -> "napply " ^ CicNotationPp.pp_term t
+  | NChange (_,what,wwhat) -> "nchange " ^ CicNotationPp.pp_term what 
+      ^ " " ^ CicNotationPp.pp_term wwhat
   | NId _ -> "nid"
 ;;
 
index 0b87b40be23f2b43f8ee695bf710cc19918f8dcc..b8310f3fca7a1d930d5673010d7971038f62f0f3 100644 (file)
@@ -586,6 +586,8 @@ let eval_ng_punct (_text, _prefix_len, punct) =
 let eval_ng_tac (text, prefix_len, tac) =
   match tac with
   | GrafiteAst.NApply (_loc, t) -> NTactics.apply_tac (text,prefix_len,t) 
+  | GrafiteAst.NChange (_loc, w,ww) -> 
+      NTactics.change_tac (text,prefix_len,w) (text,prefix_len,ww) 
   | GrafiteAst.NId _ -> fun x -> x
 ;;
 
index b9c33232e70b61fb00d763594395d848efa7569c..6c5175890581aedd33c2c24794b4cf459fcef1b7 100644 (file)
@@ -181,8 +181,9 @@ EXTEND
   ];
   using: [ [ using = OPT [ IDENT "using"; t = tactic_term -> t ] -> using ] ];
   ntactic: [
-    [ IDENT "napply"; t = tactic_term ->
-        GrafiteAst.NApply (loc, t)
+    [ IDENT "napply"; t = tactic_term -> GrafiteAst.NApply (loc, t)
+    | IDENT "nchange"; what = tactic_term; with_what = tactic_term -> 
+        GrafiteAst.NChange (loc, what, with_what)
     ]
   ];
   tactic: [
index dd09178c2d70cc27073d183ad73abcd516c0a812..4f6a726dfaf809535fe1c3633d42a9442c017e05 100644 (file)
@@ -233,14 +233,26 @@ let distribute_tac tac status =
        { gstatus = stack; istatus = sn }
 ;;
 
-(*
-
 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 is_prefix l1 l2 =
+    let rec aux = function
+      | [],[] -> true
+      | x::xs, y::ys -> x=y && aux (xs,ys)
+      | _ -> false
+    in
+      aux (List.rev l1, List.rev l2)
+  in
+  if ctx = context then term else 
+  if is_prefix ctx context then 
+    (name, context, 
+      NCicSubstitution.lift (List.length context - List.length ctx) t)
+  else
+    assert false
 ;;
 
 let disambiguate (status : lowtac_status) (t : ast_term)  
@@ -259,6 +271,62 @@ let disambiguate (status : lowtac_status) (t : ast_term)
  { lstatus = lexicon_status; pstatus = new_pstatus }, (None, context, t) 
 ;;
 
+let select_term low_status (name,context,term) (path, matched) =
+  let eq context (status as old_status) t1 t2 =
+    let _,_,t2 = relocate t2 context in
+    if t2 = t1 then true, status else false, old_status 
+  in
+  let match_term m =
+    let rec aux ctx status t =
+      let b, status = eq ctx status t m in
+      if b then 
+        let n,h,metasenv,subst,o = status.pstatus in
+        let ty = NCicTypeChecker.typeof ~subst ~metasenv ctx t in
+        let metasenv, instance, ty = 
+          NCicMetaSubst.mk_meta ~name:"expanded" metasenv ctx (`WithType ty)
+        in
+        let metasenv, subst = 
+          NCicUnification.unify (NCicUnifHint.db ()) metasenv subst ctx 
+            t instance
+        in
+        let status = { status with pstatus = n,h,metasenv,subst,o } in
+        status, instance
+      else NCicUntrusted.map_term_fold_a (fun e c -> e::c) ctx aux status t
+     in 
+       aux
+  in 
+  let rec select status ctx pat cic = 
+    match pat, cic with
+    | NCic.Prod (_,s1,t1), NCic.Prod (n,s2,t2) ->
+        let status, s = select status ctx s1 s2 in
+        let ctx = (n, NCic.Decl s2) :: ctx in
+        let status, t = select status ctx t1 t2 in
+        status, NCic.Prod (n,s,t)
+    | NCic.Appl l1, NCic.Appl l2 ->
+        let status, l = 
+           List.fold_left2
+             (fun (status,l) x y -> 
+              let status, x = select status ctx x y in
+              status, l @ [x])
+             (status,[]) l1 l2
+        in
+        status, NCic.Appl l
+    | NCic.Implicit `Hole, t -> status, t
+    | NCic.Implicit `Term, t -> 
+        let status, matched = disambiguate status matched None (Ctx ctx) in
+        match_term matched ctx status t
+    | _,t -> status, t
+  in
+  let status, term = select low_status context path term in
+  let _,_,_,subst,_ = status.pstatus in
+  let selections = 
+    HExtlib.filter_map 
+      (function (i,(Some "expanded",c,_,_)) -> Some i | _ -> None) 
+      subst
+  in
+  status, (name, context, term), selections
+;;
+
 let get_goal (status : lowtac_status) (g : int) =
  let _,_,metasenv,_,_ = status.pstatus in
  List.assoc g metasenv
@@ -281,13 +349,50 @@ let instantiate status i t =
  { status with pstatus = (name,height,metasenv,subst,obj) }
 ;;
 
+let mkmeta name status (_,ctx,ty) =
+  let n,h,metasenv,s,o = status.pstatus in
+  let metasenv, instance, _ = 
+    NCicMetaSubst.mk_meta ?name metasenv ctx (`WithType ty)
+  in
+  let status = { status with pstatus = n,h,metasenv,s,o } in
+  status, (name,ctx,instance)
+;;
+
 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 change what (*where*) with_what (status as orig, goal) =
+ let (name,_,_ as goalty) = get_goal status goal in
+ let status, newgoalty, selections = 
+   select_term status goalty 
+     (NCic.Prod ("_",NCic.Implicit `Hole,NCic.Implicit `Term), what)
+ in
+
+ let n,h,metasenv,subst,o = status.pstatus in
+ let subst, newm = 
+   List.partition (fun i,_ -> not (List.mem i selections)) subst 
+ in
+ let metasenv = List.map (fun (i,(n,c,_,t)) -> i,(n,c,t)) newm @ metasenv in
+ let status = { status with pstatus = n,h,metasenv,subst,o } in
+
+ let status =  (* queste sono apply, usa un tatticale! *)
+   List.fold_left 
+     (fun status i -> 
+       let x = get_goal status i in
+       let status, with_what = 
+         disambiguate status with_what (Some x) (Term x) 
+       in
+       instantiate status i with_what) 
+     status selections
+ in
+ let status, m = mkmeta name status newgoalty in
+ let status = instantiate status goal m in
+ return ~orig status
+;;
 
 let apply t (status,goal) =
  let uri,height,(metasenv as old_metasenv), subst,obj = status.pstatus in
@@ -314,4 +419,5 @@ let apply t (status,goal) =
 ;;
 
 let apply_tac t = distribute_tac (apply t) ;;
+let change_tac w ww = distribute_tac (change w ww) ;;
 
index f9747e824de9a066b122df1083cf606c2b8d5ef4..29b7613a502878ef702cfc9b3378e75192f04ded 100644 (file)
@@ -42,6 +42,7 @@ val distribute_tac: lowtactic -> tactic
 val block_tac: tactic list -> tactic
 
 val apply_tac: tactic_term -> tactic
+val change_tac: tactic_term -> tactic_term -> tactic
 
 
 val pp_tac_status: tac_status -> unit
index 25e67131fca0487c4390d310d8307722b5058067..f3c6a8bd17a7351e99ce8e59905fda76a37cbf08 100644 (file)
@@ -1,5 +1,2 @@
-utf8Macro.cmi: 
-utf8MacroTable.cmo: 
-utf8MacroTable.cmx: 
 utf8Macro.cmo: utf8MacroTable.cmo utf8Macro.cmi 
 utf8Macro.cmx: utf8MacroTable.cmx utf8Macro.cmi