]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_cic_content/nTermCicContent.ml
parameter sintax added to axiom statement
[helm.git] / helm / software / components / ng_cic_content / nTermCicContent.ml
index 01e6fd48255fc97039a06407a5d03d6088951664..5cfda009c26bb564af3a45205860d931c320befb 100644 (file)
@@ -58,11 +58,37 @@ let idref register_ref =
     Ast.AttributedTerm (`IdRef id, t)
 ;;
 
+let level_of_uri u = 
+  let name = NUri.name_of_uri u in
+  assert(String.length name > String.length "Type");
+  String.sub name 4 (String.length name - 4)
+;;
+
+let destroy_nat =
+  let is_nat_URI = NUri.eq (NUri.uri_of_string
+  "cic:/matita/ng/arithmetics/nat/nat.ind") in
+  let is_zero = function
+    | NCic.Const (NReference.Ref (uri, NReference.Con (0, 1, 0))) when
+       is_nat_URI uri -> true
+    | _ -> false
+  in
+  let is_succ = function
+    | NCic.Const (NReference.Ref (uri, NReference.Con (0, 2, 0))) when
+       is_nat_URI uri -> true
+    | _ -> false
+  in
+  let rec aux acc = function
+    | NCic.Appl [he ; tl] when is_succ he -> aux (acc + 1) tl
+    | t when is_zero t -> Some acc
+    | _ -> None
+  in
+   aux 0
+
 (* CODICE c&p da NCicPp *)
-let nast_of_cic0
+let nast_of_cic0 status
  ~(idref:
     ?reference:NReference.reference -> CicNotationPt.term -> CicNotationPt.term)
- ~output_type ~subst k ~context =
+ ~output_type ~metasenv ~subst k ~context =
   function
     | NCic.Rel n ->
        (try 
@@ -81,19 +107,16 @@ let nast_of_cic0
         idref (Ast.Meta
          (n, List.map (fun x -> Some (k ~context (NCicSubstitution.lift s x))) l))
     | NCic.Sort NCic.Prop -> idref (Ast.Sort `Prop)
-    | NCic.Sort NCic.Type _ -> idref (Ast.Sort `Set)
-    (* CSC: | C.Sort (C.Type []) -> F.fprintf f "Type0"
-    | C.Sort (C.Type [false, u]) -> F.fprintf f "%s" (NUri.name_of_uri u)
-    | C.Sort (C.Type [true, u]) -> F.fprintf f "S(%s)" (NUri.name_of_uri u)
-    | C.Sort (C.Type l) -> 
-       F.fprintf f "Max(";
-       aux ctx (C.Sort (C.Type [List.hd l]));
-       List.iter (fun x -> F.fprintf f ",";aux ctx (C.Sort (C.Type [x])))
-        (List.tl l);
-       F.fprintf f ")"*)
-    (* CSC: qua siamo grezzi *)
+    | NCic.Sort NCic.Type [] -> idref (Ast.Sort `Set)
+    | NCic.Sort NCic.Type ((`Type,u)::_) -> 
+              idref(Ast.Sort (`NType (level_of_uri u)))
+    | NCic.Sort NCic.Type ((`CProp,u)::_) -> 
+              idref(Ast.Sort (`NCProp (level_of_uri u)))
+    | NCic.Sort NCic.Type ((`Succ,u)::_) -> 
+              idref(Ast.Sort (`NType (level_of_uri u ^ "+1")))
     | NCic.Implicit `Hole -> idref (Ast.UserInput)
-    | NCic.Implicit _ -> idref (Ast.Implicit)
+    | NCic.Implicit `Vector -> idref (Ast.Implicit `Vector)
+    | NCic.Implicit _ -> idref (Ast.Implicit `JustOne)
     | NCic.Prod (n,s,t) ->
         let n = if n.[0] = '_' then "_" else n in
         let binder_kind = `Forall in
@@ -102,9 +125,11 @@ let nast_of_cic0
     | NCic.Lambda (n,s,t) ->
         idref (Ast.Binder (`Lambda,(Ast.Ident (n,None), Some (k ~context s)),
          k ~context:((n,NCic.Decl s)::context) t))
+    | NCic.LetIn (n,s,ty,NCic.Rel 1) ->
+        idref (Ast.Cast (k ~context ty, k ~context s))
     | NCic.LetIn (n,s,ty,t) ->
-        idref (Ast.LetIn ((Ast.Ident (n,None), Some (k ~context ty)), k ~context s,
-         k ~context:((n,NCic.Decl s)::context) t))
+        idref (Ast.LetIn ((Ast.Ident (n,None), Some (k ~context s)), k ~context
+          ty, k ~context:((n,NCic.Decl s)::context) t))
     | NCic.Appl (NCic.Meta (n,lc) :: args) when List.mem_assoc n subst -> 
        let _,_,t,_ = List.assoc n subst in
        let hd = NCicSubstitution.subst_meta lc t in
@@ -113,7 +138,30 @@ let nast_of_cic0
            (match hd with
            | NCic.Appl l -> NCic.Appl (l@args)
            | _ -> NCic.Appl (hd :: args)))
-    | NCic.Appl args -> idref (Ast.Appl (List.map (k ~context) args))
+    | NCic.Appl args as t ->
+       (match destroy_nat t with
+         | Some n -> idref (Ast.Num (string_of_int n, -1))
+         | None ->
+            let args =
+             if not !Acic2content.hide_coercions then args
+             else
+              match
+               NCicCoercion.match_coercion status ~metasenv ~context ~subst t
+              with
+               | None -> args
+               | Some (_,sats,cpos) -> 
+(* CSC: sats e' il numero di pi, ma non so cosa farmene! voglio il numero di
+   argomenti da saltare, come prima! *)
+                  if cpos < List.length args - 1 then
+                   List.nth args (cpos + 1) ::
+                    try snd (HExtlib.split_nth (cpos+sats+2) args)
+                    with Failure _->[]
+                  else
+                   args
+            in
+             (match args with
+                 [arg] -> idref (k ~context arg)
+               | _ -> idref (Ast.Appl (List.map (k ~context) args))))
     | NCic.Match (NReference.Ref (uri,_) as r,outty,te,patterns) ->
         let name = NUri.name_of_uri uri in
 (* CSC
@@ -134,7 +182,7 @@ let nast_of_cic0
        let rec eat_branch n ctx ty pat =
           match (ty, pat) with
          | NCic.Prod (name, s, t), _ when n > 0 ->
-             eat_branch (pred n) ((name,NCic.Decl s)::ctx) t pat 
+             eat_branch (pred n) ctx t pat 
           | NCic.Prod (_, _, t), NCic.Lambda (name, s, t') ->
               let cv, rhs = eat_branch 0 ((name,NCic.Decl s)::ctx) t t' in
               (Ast.Ident (name,None), Some (k ~context:ctx s)) :: cv, rhs
@@ -242,11 +290,11 @@ let instantiate32 idrefs env symbol args =
   if args = [] then head
   else Ast.Appl (head :: List.map instantiate_arg args)
 
-let rec nast_of_cic1 ~idref ~output_type ~subst ~context term = 
+let rec nast_of_cic1 status ~idref ~output_type ~metasenv ~subst ~context term =
   match (get_compiled32 ()) term with
   | None ->
-     nast_of_cic0 ~idref ~output_type ~subst
-      (nast_of_cic1 ~idref ~output_type ~subst) ~context term 
+     nast_of_cic0 status ~idref ~output_type ~metasenv ~subst
+      (nast_of_cic1 status ~idref ~output_type ~metasenv ~subst) ~context term 
   | Some (env, ctors, pid) -> 
       let idrefs =
        List.map
@@ -266,7 +314,8 @@ let rec nast_of_cic1 ~idref ~output_type ~subst ~context term =
        List.map
         (fun (name, term) ->
           name,
-           nast_of_cic1 ~idref ~output_type ~subst ~context term
+           nast_of_cic1 status ~idref ~output_type ~subst ~metasenv ~context
+            term
         ) env
       in
       let _, symbol, args, _ =
@@ -387,9 +436,10 @@ let instantiate_appl_pattern
   aux appl_pattern
 *)
 
-let nmap_sequent0 ~idref ~subst (i,(n,context,ty):int * NCic.conjecture) =
+let nmap_sequent0 status ~idref ~metasenv ~subst (i,(n,context,ty)) =
  let module K = Content in
- let nast_of_cic = nast_of_cic1 ~idref ~output_type:`Term ~subst in
+ let nast_of_cic =
+  nast_of_cic1 status ~idref ~output_type:`Term ~metasenv ~subst in
  let context',_ =
   List.fold_right
    (fun item (res,context) ->
@@ -421,16 +471,19 @@ let nmap_sequent0 ~idref ~subst (i,(n,context,ty):int * NCic.conjecture) =
   ("-1",i,context',nast_of_cic ~context ty)
 ;;
 
-let nmap_sequent ~subst metasenv =
+let nmap_sequent status ~metasenv ~subst conjecture =
  let module K = Content in
  let ids_to_refs = Hashtbl.create 211 in
  let register_ref = Hashtbl.add ids_to_refs in
-  nmap_sequent0 ~idref:(idref register_ref) ~subst metasenv, ids_to_refs
+  nmap_sequent0 status ~idref:(idref register_ref) ~metasenv ~subst conjecture,
+  ids_to_refs
 ;;
 
 let object_prefix = "obj:";;
 let declaration_prefix = "decl:";;
 let definition_prefix = "def:";;
+let inductive_prefix = "ind:";;
+let joint_prefix = "joint:";;
 
 let get_id =
  function
@@ -496,24 +549,76 @@ let build_decl_item seed id n s =
       }
 ;;
 
-let nmap_obj (uri,_,metasenv,subst,kind) =
+let nmap_obj status (uri,_,metasenv,subst,kind) =
   let module K = Content in
   let ids_to_refs = Hashtbl.create 211 in
   let register_ref = Hashtbl.add ids_to_refs in
   let idref = idref register_ref in
   let nast_of_cic =
-   nast_of_cic1 ~idref ~output_type:`Term ~subst in
+   nast_of_cic1 status ~idref ~output_type:`Term ~metasenv ~subst in
   let seed = ref 0 in
   let conjectures =
    match metasenv with
       [] -> None
     | _ -> (*Some (List.map (map_conjectures seed) metasenv)*)
       (*CSC: used to be the previous line, that uses seed *)
-      Some (List.map (nmap_sequent0 ~idref ~subst) metasenv)
+      Some (List.map (nmap_sequent0 status ~idref ~metasenv ~subst) metasenv)
   in
+let  build_constructors seed l =
+      List.map 
+       (fun (_,n,ty) ->
+           let ty = nast_of_cic ~context:[] ty in
+           { K.dec_name = Some n;
+             K.dec_id = gen_id declaration_prefix seed;
+             K.dec_inductive = false;
+             K.dec_aref = "";
+             K.dec_type = ty
+           }) l
+in
+let build_inductive b seed = 
+      fun (_,n,ty,cl) ->
+        let ty = nast_of_cic ~context:[] ty in
+        `Inductive
+          { K.inductive_id = gen_id inductive_prefix seed;
+            K.inductive_name = n;
+            K.inductive_kind = b;
+            K.inductive_type = ty;
+            K.inductive_constructors = build_constructors seed cl
+           }
+in
+let build_fixpoint b seed = 
+      fun (_,n,_,ty,t) ->
+        let t = nast_of_cic ~context:[] t in
+        let ty = nast_of_cic ~context:[] ty in
+        `Definition
+          { K.def_id = gen_id inductive_prefix seed;
+            K.def_name = Some n;
+            K.def_aref = "";
+            K.def_type = ty;
+            K.def_term = t;
+           }
+in
   let res =
    match kind with
-      NCic.Constant (_,_,Some bo,ty,_) ->
+    | NCic.Fixpoint (is_rec, ifl, _) -> 
+         (gen_id object_prefix seed, [], conjectures,
+            `Joint
+              { K.joint_id = gen_id joint_prefix seed;
+                K.joint_kind = 
+                   if is_rec then 
+                        `Recursive (List.map (fun (_,_,i,_,_) -> i) ifl)
+                   else `CoRecursive;
+                K.joint_defs = List.map (build_fixpoint is_rec seed) ifl
+              }) 
+    | NCic.Inductive (is_ind, lno, itl, _) ->
+         (gen_id object_prefix seed, [], conjectures,
+            `Joint
+              { K.joint_id = gen_id joint_prefix seed;
+                K.joint_kind = 
+                   if is_ind then `Inductive lno else `CoInductive lno;
+                K.joint_defs = List.map (build_inductive is_ind seed) itl
+              }) 
+    | NCic.Constant (_,_,Some bo,ty,_) ->
        let ty = nast_of_cic ~context:[] ty in
        let bo = nast_of_cic ~context:[] bo in
         (gen_id object_prefix seed, [], conjectures,
@@ -525,39 +630,6 @@ let nmap_obj (uri,_,metasenv,subst,kind) =
            `Decl (K.Const,
              (*CSC: ??? get_id ty here used to be the id of the axiom! *)
              build_decl_item seed (get_id ty) (NUri.name_of_uri uri) ty))
-(*
-    | C.AInductiveDefinition (id,l,params,nparams,_) ->
-         (gen_id object_prefix seed, params, conjectures,
-            `Joint
-              { K.joint_id = gen_id joint_prefix seed;
-                K.joint_kind = `Inductive nparams;
-                K.joint_defs = List.map (build_inductive seed) l
-              }) 
-
-and
-    build_inductive seed = 
-     let module K = Content in
-      fun (_,n,b,ty,l) ->
-        `Inductive
-          { K.inductive_id = gen_id inductive_prefix seed;
-            K.inductive_name = n;
-            K.inductive_kind = b;
-            K.inductive_type = ty;
-            K.inductive_constructors = build_constructors seed l
-           }
-
-and 
-    build_constructors seed l =
-     let module K = Content in
-      List.map 
-       (fun (n,t) ->
-           { K.dec_name = Some n;
-             K.dec_id = gen_id declaration_prefix seed;
-             K.dec_inductive = false;
-             K.dec_aref = "";
-             K.dec_type = t
-           }) l
-*)
  in
   res,ids_to_refs
 ;;