]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/ng_cic_content/nTermCicContent.ml
let rec/corec and co/inductive are not printed!
[helm.git] / helm / software / components / ng_cic_content / nTermCicContent.ml
index 62d69f5d166dd979ac37bf7d99769895ef07efb0..3c17823b6c9160e25f298839d67c41703a395aba 100644 (file)
@@ -59,10 +59,10 @@ let idref register_ref =
 ;;
 
 (* 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 
@@ -93,7 +93,8 @@ let nast_of_cic0
        F.fprintf f ")"*)
     (* CSC: qua siamo grezzi *)
     | 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 +103,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 +116,26 @@ 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 ->
+       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,11 +156,11 @@ 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 s)) :: cv, rhs
-          | _, _ -> [], k ~context pat
+              (Ast.Ident (name,None), Some (k ~context:ctx s)) :: cv, rhs
+          | _, _ -> [], k ~context:ctx pat
         in
         let j = ref 0 in
         let patterns =
@@ -242,11 +264,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 +288,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 +410,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 +445,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 +523,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 +604,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
 ;;