]> matita.cs.unibo.it Git - helm.git/commitdiff
auto with intro
authorEnrico Tassi <enrico.tassi@inria.fr>
Sun, 11 Oct 2009 13:54:47 +0000 (13:54 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Sun, 11 Oct 2009 13:54:47 +0000 (13:54 +0000)
13 files changed:
helm/software/components/acic_content/cicNotationPp.ml
helm/software/components/acic_content/cicNotationPt.ml
helm/software/components/acic_content/cicNotationUtil.ml
helm/software/components/cic_disambiguation/cicDisambiguate.ml
helm/software/components/disambiguation/disambiguate.ml
helm/software/components/ng_disambiguation/nCicDisambiguate.ml
helm/software/components/ng_tactics/nAuto.ml
helm/software/components/ng_tactics/nTacStatus.ml
helm/software/components/ng_tactics/nTacStatus.mli
helm/software/matita/nlibrary/depends
helm/software/matita/nlibrary/depends.dot
helm/software/matita/nlibrary/depends.png
helm/software/matita/tests/ng_auto.ma

index 896403d94ef397baf90d24fb36feeee91a205cf3..c2ee6a776cba5d8d223b99ec9bf3eecf7d77d1e9 100644 (file)
@@ -140,11 +140,13 @@ let rec pp_term ?(pp_parens = true) t =
     | Ast.Ident (name, Some []) | Ast.Ident (name, None)
     | Ast.Uri (name, Some []) | Ast.Uri (name, None) -> name
     | Ast.NRef nref -> NReference.string_of_reference nref
+    | Ast.NCic cic -> NCicPp.ppterm ~metasenv:[] ~context:[] ~subst:[] cic
     | Ast.Ident (name, Some substs)
     | Ast.Uri (name, Some substs) ->
         sprintf "%s \\subst [%s]" name (pp_substs substs)
     | Ast.Implicit `Vector -> "?"
     | Ast.Implicit `JustOne -> "…"
+    | Ast.Implicit (`Tagged name) -> "?"^name
     | Ast.Meta (index, substs) ->
         sprintf "%d[%s]" index
           (String.concat "; "
index 4e9da0424a8a6d7a9b4cb637b6f0a4f5ed2342b9..731a2ba7436f70b6c21f7b05ab0e0274118f9071 100644 (file)
@@ -94,6 +94,8 @@ type term =
   | Uri of string * subst list option (* as Ident, for long names *)
   | NRef of NReference.reference
 
+  | NCic of NCic.term
+
   (* Syntax pattern extensions *)
 
   | Literal of literal
index 0c8abce504694b5053f62a9feeb997c0bc6a1a4f..7eccd79017d309044abe9e35f17355b4d01872b4 100644 (file)
@@ -63,6 +63,7 @@ let visit_ast ?(special_k = fun _ -> assert false)
       | Ast.Variable _) as t -> special_k t
     | (Ast.Ident _
       | Ast.NRef _
+      | Ast.NCic _
       | Ast.Implicit _
       | Ast.Num _
       | Ast.Sort _
index 91839e2096b176b227a78de201fecca10250648a..853c38e4b762cb6114c8ccf77db8cddda098e0ef 100644 (file)
@@ -398,6 +398,7 @@ let interpretate_term ~mk_choice ?(create_dummy_ids=false) ~context ~env ~uri
     | CicNotationPt.Ident _
     | CicNotationPt.Uri _
     | CicNotationPt.NRef _ when is_path -> raise Disambiguate.PathNotWellFormed
+    | CicNotationPt.NCic _ -> assert false
     | CicNotationPt.NRef _ -> assert false
     | CicNotationPt.Ident (name,subst)
     | CicNotationPt.Uri (name, subst) as ast ->
index 52411d6ed2abf458ef8706691419713ffb6eb6bc..f3ba95765274fcd5788b1dad2112177fa9e49ba8 100644 (file)
@@ -311,6 +311,7 @@ let rec domain_of_term ?(loc = HExtlib.dummy_floc) ~context = function
             [ Node ([loc], Id name, terms) ]))
   | Ast.Uri _ -> []
   | Ast.NRef _ -> []
+  | Ast.NCic _ -> []
   | Ast.Implicit _ -> []
   | Ast.Num (num, i) -> [ Node ([loc], Num i, []) ]
   | Ast.Meta (index, local_context) ->
index d50eec79600b12358ecd7bc5af9d84f4ae7f4d47..f221a2b05a57a31596ab767c2a8438f1d40a919c 100644 (file)
@@ -332,6 +332,10 @@ let interpretate_term_and_interpretate_term_option
         with NRef.IllFormedReference _ ->
          CicNotationPt.fail loc "Ill formed reference")
     | CicNotationPt.NRef nref -> NCic.Const nref
+    | CicNotationPt.NCic t -> 
+           let context = (* to make metas_of_term happy *)
+             List.map (fun x -> x,NCic.Decl (NCic.Implicit `Type)) context in
+           assert(NCicUntrusted.metas_of_term [] context t = []); t
     | CicNotationPt.Implicit `Vector -> NCic.Implicit `Vector
     | CicNotationPt.Implicit `JustOne -> NCic.Implicit `Term
     | CicNotationPt.Implicit (`Tagged s) -> NCic.Implicit (`Tagged s)
index 37ac72eb987c76ab9e98eef2c135c7ed7273ad86..4193d41da75b58035ca3c5c0565a645f8e9eae51 100644 (file)
@@ -912,19 +912,72 @@ let auto_tac ~(dbd:HSql.dbd) ~params:(univ,params) ~automation_cache (proof, goa
 ;;
 *)
 
-module CacheElem : Set.OrderedType =
- struct
-  type t = 
-   | Failed_in of int * NCic.term     (* depth, goal type *)
-   | Succeded of Cic.term * Cic.term  (* proof, proof type *)
-   | UnderInspection of Cic.term      (* avoid looping *)
 
-  let compare = Pervasives.compare
- end
+type th_cache = (NCic.context * InvRelDiscriminationTree.t) list
 
-module CacheSet = Set.Make(CacheElem)
-module Cache = 
-  Discrimination_tree.Make(NDiscriminationTree.NCicIndexable)(CacheSet)
+let mk_th_cache status gl = 
+  List.fold_left 
+    (fun (status, acc) g ->
+       let gty = get_goalty status g in
+       let ctx = ctx_of gty in
+       if List.mem_assq ctx acc then status, acc else
+         let idx = InvRelDiscriminationTree.empty in
+         let status,_,idx = 
+           List.fold_left (fun (status, i, idx) _ -> 
+              let t = mk_cic_term ctx (NCic.Rel i) in
+              let status, ty = typeof status ctx t in
+              let _, ty, _ = saturate status ty in
+              let idx = InvRelDiscriminationTree.index idx ty t in
+              status, i+1, idx)
+             (status, 1, idx) ctx
+          in
+         status, (ctx, idx) :: acc)
+    (status,[]) gl
+;;
+
+let add_to_th t ty c = 
+  let key_c = ctx_of t in
+  if not (List.mem_assq key_c c) then
+      (key_c ,InvRelDiscriminationTree.index 
+               InvRelDiscriminationTree.empty ty t ) :: c 
+  else
+    let rec replace = function
+      | [] -> []
+      | (x, idx) :: tl when x == key_c -> 
+          (x, InvRelDiscriminationTree.index idx ty t) :: tl
+      | x :: tl -> x :: replace tl
+    in 
+      replace c
+;;
+
+let search_in_th gty th = 
+  let c = ctx_of gty in
+  let rec aux acc = function
+   | [] -> Ncic_termSet.elements acc
+   | (_::tl) as k ->
+       try 
+         let idx = List.assq k th in
+         let acc = Ncic_termSet.union acc 
+           (InvRelDiscriminationTree.retrieve_unifiables idx gty)
+         in
+         aux acc tl
+       with Not_found -> aux acc tl
+  in
+    aux Ncic_termSet.empty c
+;;
+
+let pp_th status = 
+  List.iter 
+    (fun ctx, idx ->
+       prerr_endline "-----------------------------------------------";
+       prerr_endline (NCicPp.ppcontext ~metasenv:[] ~subst:[] ctx);
+       prerr_endline "||====>  ";
+       InvRelDiscriminationTree.iter idx
+          (fun k set ->
+             prerr_endline ("K: " ^ NCicInverseRelIndexable.string_of_path k);
+             Ncic_termSet.iter 
+             (fun t -> prerr_endline ("\t"^ppterm status t)) set))
+;;
 
 type cache_examination_result =
   [ `Failed_in of int
@@ -952,7 +1005,7 @@ type 'a elem =
 type 'a auto_status = 
   (* list of computations that may lead to the solution: all op list will
    * end with the same (S(g,_)) *)
-  'a elem list * Cache.t
+  'a elem list * th_cache
 
 type 'a auto_result = 
   | Gaveup 
@@ -995,26 +1048,26 @@ let rec mk_irl n = function
   | _ :: tl -> NCic.Rel n :: mk_irl (n+1) tl
 ;;
 
-let get_candidates status signature gty =
+let get_candidates status cache_th signature gty =
   let universe = status#auto_cache in
   let context = ctx_of gty in
-  let _, gty = term_of_cic_term status gty context in
+  let _, raw_gty = term_of_cic_term status gty context in
   let cands = 
-    NDiscriminationTree.DiscriminationTree.retrieve_unifiables universe gty
+    NDiscriminationTree.DiscriminationTree.retrieve_unifiables universe raw_gty
   in
   let cands = 
     List.filter (only signature context) 
       (NDiscriminationTree.TermSet.elements cands)
   in
-  (* XXX we have to use the trie for the context *)
-  HExtlib.filter_map (fun name,_ -> 
-    if name <> "_" then Some (Ast.Ident (name,None)) else None) context 
+  List.map (fun t -> 
+     let _status, t = term_of_cic_term status t context in Ast.NCic t) 
+     (search_in_th gty cache_th)
   @ 
   List.map (function NCic.Const r -> Ast.NRef r | _ -> assert false) cands
 ;;
 
 let applicative_case signature status flags g gty cache = 
-  let candidates = get_candidates status signature gty in
+  let candidates = get_candidates status cache signature gty in
   debug_print (lazy ("candidates: " ^ string_of_int (List.length candidates)));
   let elems = 
     List.fold_left 
@@ -1058,7 +1111,7 @@ let equational_and_applicative_case
    List.map (fun c,s,gl -> c,s,List.map (fun i -> i,depth-1,P) gl) elems 
  in
  let elems = sort_new_elems elems in
- elems
+ elems, cache
 ;;
 
 let calculate_goal_ty (goalno,_,_) status = 
@@ -1085,6 +1138,42 @@ let remove_s_from_fl (id,_,_) (fl : fail list) =
     aux fl
 ;;
 
+let rec guess_name name ctx = 
+  if name = "_" then guess_name "auto" ctx else
+  if not (List.mem_assoc name ctx) then name else
+  guess_name (name^"'") ctx
+;;
+
+let intro_case status gno gty depth cache name =
+   let status = NTactics.focus_tac [gno] status in
+   let status = NTactics.intro_tac (guess_name name (ctx_of gty)) status in
+   let open_goals = head_goals status#stack in
+   assert (List.length open_goals  = 1);
+   let open_goal = List.hd open_goals in
+   let status, cache =
+     let ngty = get_goalty status open_goal in
+     let ctx = ctx_of ngty in
+     let t = mk_cic_term ctx (NCic.Rel 1) in
+     let status, ty = typeof status ctx t in
+     let _status, ty, _args = saturate status ty in
+     status, add_to_th t ty cache 
+   in
+   debug_print (lazy (" intro: "^ string_of_int open_goal));
+(*    pp_th status cache; *)
+   incr candidate_no;
+    (* XXX calculate the sort *)
+   [(!candidate_no,Ast.Implicit `JustOne),status,[open_goal,depth,P]],
+   cache
+;;
+                      
+let do_something signature flags s gno depth gty cache =
+  let _s, raw_gty = term_of_cic_term s gty (ctx_of gty) in
+  match raw_gty with
+  | NCic.Prod (name,_,_) -> intro_case s gno gty depth cache name
+  | _ -> 
+      equational_and_applicative_case signature flags s gno depth gty cache
+;;
+
 let auto_main flags signature elems cache =
   let rec aux (elems, cache : 'a auto_status) =
 (* processa le hint dell'utente *)
@@ -1137,6 +1226,7 @@ let auto_main flags signature elems cache =
             debug_print (lazy ("SUCCESS: SIDE EFFECT: " ^ string_of_int gno));
             aux ((s,size,don,todo, fl)::orlist, cache)
         | Some gty ->
+            let s, gty = apply_subst s (ctx_of gty) gty in
             debug_print (lazy ("EXAMINE: "^ ppterm s gty));
             match cache_examine cache gty with
             | `Failed_in d when d >= depth -> 
@@ -1164,9 +1254,8 @@ let auto_main flags signature elems cache =
                         string_of_int gno ^ "("^ string_of_int size ^ "): "^
                         ppterm s gty));
                     (* elems are possible computations for proving gty *)
-                    let elems =
-                      equational_and_applicative_case 
-                        signature flags s gno depth gty cache 
+                    let elems, cache = 
+                      do_something signature flags s gno depth gty cache
                     in
                     if elems = [] then
                       (* this goal has failed *)
@@ -1205,10 +1294,15 @@ let auto_main flags signature elems cache =
     (aux (elems, cache) : 'a auto_result)
 ;;
 
-let auto_tac ~params status =
-  let cache = Cache.empty in
+let int name l def = 
+  try int_of_string (List.assoc name l)
+  with Failure _ | Not_found -> def
+;;
+
+let auto_tac ~params:(_univ,flags) status =
   let goals = head_goals status#stack in
-  let depth = 3 in 
+  let status, cache = mk_th_cache status goals in
+  let depth = int "depth" flags 3 in 
   (* XXX fix sort *)
   let goals = List.map (fun i -> D(i,depth,P)) goals in
   let elems = [status,0,[],goals,[]] in
index d55f7439f385c847370433ed570e594c7b6dc3cf..ce7ca8216d7b81edc56cbbf8316c67943cfe4c87 100644 (file)
@@ -130,6 +130,14 @@ let typeof status ctx t =
   status, (ctx, ty)
 ;;
 let typeof a b c = wrap "typeof" (typeof a b) c;;
+
+let saturate status (ctx,t) =
+  let n,h,metasenv,subst,k = status#obj in
+  let t, metasenv, args = NCicMetaSubst.saturate metasenv subst ctx t 0 in
+  let status = status#set_obj (n,h,metasenv,subst,k) in
+  status, (ctx,t), List.map (fun x -> ctx,x) args
+;;
+let saturate a b = wrap "saturate" (saturate a) b;;
   
 let whd status ?delta ctx t =
   let status, (_,t) = relocate status ctx t in
index 15a78866998e10cb006312ad7be3fe2fef88684d..0dd5acdc01cc472f0e04d1f081168552902a01cb 100644 (file)
@@ -56,6 +56,8 @@ val refine:
 val apply_subst:
  #pstatus as 'status -> NCic.context -> cic_term -> 'status * cic_term
 val fix_sorts: cic_term -> cic_term
+val saturate :
+ #pstatus as 'status -> cic_term -> 'status * cic_term * cic_term list
 
 val get_goalty: #pstatus -> int -> cic_term
 val mk_meta: 
index c5d90654b8341b896871c91bf5b349447660dd0c..9d21d98382217ed039e4d02bc4e87399dc28058f 100644 (file)
@@ -8,6 +8,7 @@ sets/setoids.ma logic/connectives.ma properties/relations.ma
 logic/connectives.ma logic/pts.ma
 datatypes/pairs.ma logic/pts.ma
 algebra/abelian_magmas.ma algebra/magmas.ma
+topology/igft-setoid.ma sets/sets.ma
 nat/plus.ma algebra/abelian_magmas.ma algebra/unital_magmas.ma nat/big_ops.ma
 nat/minus.ma nat/order.ma
 algebra/magmas.ma sets/sets.ma
index b987610afd2155ea6a6699cedda2f4fd5d82cae8..8af49c5d8097cfecaa39699b25c119ea493d203e 100644 (file)
@@ -27,6 +27,8 @@ digraph g {
   "datatypes/pairs.ma" -> "logic/pts.ma" [];
   "algebra/abelian_magmas.ma" [];
   "algebra/abelian_magmas.ma" -> "algebra/magmas.ma" [];
+  "topology/igft-setoid.ma" [];
+  "topology/igft-setoid.ma" -> "sets/sets.ma" [];
   "nat/plus.ma" [];
   "nat/plus.ma" -> "algebra/abelian_magmas.ma" [];
   "nat/plus.ma" -> "algebra/unital_magmas.ma" [];
index e3fb6c2526f0a057baccbc502a14ac563a6a77c3..fc6f14ecde4bc4a59c17a72853afd90be9c1e05f 100644 (file)
Binary files a/helm/software/matita/nlibrary/depends.png and b/helm/software/matita/nlibrary/depends.png differ
index b2a4206678b0fa639fee9c3843c38e7fa35f0cb6..2438c547037d2c6f73eb402daf64857c00dbb4ab 100644 (file)
@@ -41,5 +41,12 @@ naxiom is_nat_0 : is_nat zero.
 naxiom is_nat_S : ∀x.is_nat x → is_nat (succ x).
 
 nlemma bar : ∀P:T → CProp[0].P (succ zero) → (λx.And (is_nat x) (P x)) ?.
-##[ #P; #H; nwhd; ##] nauto.  
+##[ #P; #H; nwhd; napply And_intro; ##] nauto.  
+nqed.
+
+naxiom A : CProp[0].
+naxiom pA : A.
+
+nlemma baz : ∀P,Q:CProp[0].(A → P) → (And A P → Q) → Q.
+nauto depth=4;
 nqed.  
\ No newline at end of file