X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_cic_content%2FnTermCicContent.ml;h=3c17823b6c9160e25f298839d67c41703a395aba;hb=07713b63c109a99c2b9dc7265571bcdd3dd6ed0d;hp=da8061fde197d56c3d482c071d75276ffa74cae1;hpb=11b2157bacf59cfc561c2ef6f92ee41ee2c1a006;p=helm.git diff --git a/helm/software/components/ng_cic_content/nTermCicContent.ml b/helm/software/components/ng_cic_content/nTermCicContent.ml index da8061fde..3c17823b6 100644 --- a/helm/software/components/ng_cic_content/nTermCicContent.ml +++ b/helm/software/components/ng_cic_content/nTermCicContent.ml @@ -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,13 +410,10 @@ let instantiate_appl_pattern aux appl_pattern *) -let nmap_sequent ~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 ids_to_refs = Hashtbl.create 211 in - let register_ref = Hashtbl.add ids_to_refs in let nast_of_cic = - nast_of_cic1 ~idref:(idref register_ref) ~output_type:`Term - ~subst in + nast_of_cic1 status ~idref ~output_type:`Term ~metasenv ~subst in let context',_ = List.fold_right (fun item (res,context) -> @@ -422,6 +442,168 @@ let nmap_sequent ~subst (i,(n,context,ty):int * NCic.conjecture) = })::res,item::context ) context ([],[]) in - ("-1",i,context',nast_of_cic ~context ty), ids_to_refs + ("-1",i,context',nast_of_cic ~context ty) +;; + +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 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 + Ast.AttributedTerm (`IdRef id, _) -> id + | _ -> assert false +;; + +let gen_id prefix seed = + let res = prefix ^ string_of_int !seed in + incr seed ; + res +;; + +let build_def_item seed context metasenv id n t ty = + let module K = Content in +(* + try + let sort = Hashtbl.find ids_to_inner_sorts id in + if sort = `Prop then + (let p = + (acic2content seed context metasenv ?name:(name_of n) ~ids_to_inner_sorts ~ids_to_inner_types t) + in + `Proof p;) + else +*) + `Definition + { K.def_name = Some n; + K.def_id = gen_id definition_prefix seed; + K.def_aref = id; + K.def_term = t; + K.def_type = ty + } +(* + with + Not_found -> assert false +*) + +let build_decl_item seed id n s = + let module K = Content in +(* + let sort = + try + Some (Hashtbl.find ids_to_inner_sorts (Cic2acic.source_id_of_id id)) + with Not_found -> None + in + match sort with + | Some `Prop -> + `Hypothesis + { K.dec_name = name_of n; + K.dec_id = gen_id declaration_prefix seed; + K.dec_inductive = false; + K.dec_aref = id; + K.dec_type = s + } + | _ -> +*) + `Declaration + { K.dec_name = Some n; + K.dec_id = gen_id declaration_prefix seed; + K.dec_inductive = false; + K.dec_aref = id; + K.dec_type = s + } ;; +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 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 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.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, + `Def (K.Const,ty, + build_def_item seed [] [] (get_id bo) (NUri.name_of_uri uri) bo ty)) + | NCic.Constant (_,_,None,ty,_) -> + let ty = nast_of_cic ~context:[] ty in + (gen_id object_prefix seed, [], conjectures, + `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)) + in + res,ids_to_refs +;;