[false, NUri.uri_of_string ("cic:/matita/pts/Type"^string_of_int n^".univ")]
;;
-let cprop = [false, NUri.uri_of_string ("cic:/matita/pts/CProp.univ")];;
+let mk_cprop n =
+ if n = 0 then
+ [false, NUri.uri_of_string ("cic:/matita/pts/CProp.univ")]
+ else
+ [false, NUri.uri_of_string ("cic:/matita/pts/CProp"^string_of_int n^".univ")]
+;;
+
+let is_proof_irrelevant context ty =
+ match
+ CicReduction.whd context
+ (fst (CicTypeChecker.type_of_aux' [] context ty CicUniv.oblivion_ugraph))
+ with
+ Cic.Sort Cic.Prop -> true
+ | Cic.Sort _ -> false
+ | _ -> assert false
+;;
+
+exception InProp;;
+
+let get_relevance ty =
+ let rec aux context ty =
+ match CicReduction.whd context ty with
+ Cic.Prod (n,s,t) ->
+ not (is_proof_irrelevant context s)::aux (Some (n,Cic.Decl s)::context) t
+ | _ -> []
+ in aux [] ty
+(* | ty -> if is_proof_irrelevant context ty then raise InProp else []
+ in
+ try aux [] ty
+ with InProp -> []*)
+;;
(* porcatissima *)
type reference = Ref of NUri.uri * NReference.spec
(t,[]) ctx
;;
+let osplat mk_pi ctx t =
+ List.fold_left
+ (fun t c ->
+ match c with
+ | Some (name, Cic.Def (bo,ty)) -> Cic.LetIn (name, ty, bo, t)
+ | Some (name, Cic.Decl ty) when mk_pi -> Cic.Prod (name, ty, t)
+ | Some (name, Cic.Decl ty) -> Cic.Lambda (name, ty, t)
+ | None -> assert false)
+ t ctx
+;;
+
let context_tassonomy ctx =
let rec split inner acc acc1 = function
| Ce _ :: tl when inner -> split inner (acc+1) (acc1+1) tl
1 + !h
;;
-(* we are lambda-lifting also variables that do not occur *)
-(* ctx does not distinguish successive blocks of cofix, since there may be no
- * lambda separating them *)
-let convert_term uri t =
(* k=true if we are converting a term to be pushed in a ctx or if we are
converting the type of a fix;
k=false if we are converting a term to be put in the body of a fix;
let rno_fixno = ref 0 in
let fl, fixpoints,_ =
List.fold_right2
- (fun (name,rno,_,bo) ty (l,fixpoints,idx) ->
+ (fun (name,rno,oty,bo) ty (l,fixpoints,idx) ->
let bo, fixpoints_bo = aux false boctx bctx n_fl buri bo in
let splty,fixpoints_splty = splat true ctx ty in
let splbo,fixpoints_splbo = splat false ctx bo in
let rno = rno + free_decls in
if idx = fixno then rno_fixno := rno;
- (([],name,rno,splty,splbo)::l),
+ ((get_relevance (osplat true octx oty),name,rno,splty,splbo)::l),
fixpoints_bo@fixpoints_splty@fixpoints_splbo@fixpoints,idx+1)
fl tys ([],fixpoints_tys,0)
in
let ty, fixpoints_ty = aux k octx ctx n_fix uri ty in
NCic.LetIn ("cast", ty, t, NCic.Rel 1), fixpoints_t @ fixpoints_ty
| Cic.Sort Cic.Prop -> NCic.Sort NCic.Prop,[]
- | Cic.Sort Cic.CProp -> NCic.Sort (NCic.Type cprop),[]
+ | Cic.Sort (Cic.CProp u) ->
+ NCic.Sort (NCic.Type (mk_cprop (CicUniv.get_rank u))),[]
| Cic.Sort (Cic.Type u) ->
NCic.Sort (NCic.Type (mk_type (CicUniv.get_rank u))),[]
| Cic.Sort Cic.Set -> NCic.Sort (NCic.Type (mk_type 0)),[]
match ens with
[] -> he,objs
| _::_ -> NCic.Appl (he::ens),objs
- in
+;;
+
+(* we are lambda-lifting also variables that do not occur *)
+(* ctx does not distinguish successive blocks of cofix, since there may be no
+ * lambda separating them *)
+let convert_term uri t =
aux false [] [] 0 uri t
;;
aux varsno [] vars
;;
-let is_proof_irrelevant context ty =
- match
- CicReduction.whd context
- (fst (CicTypeChecker.type_of_aux' [] context ty CicUniv.oblivion_ugraph))
- with
- Cic.Sort Cic.Prop -> true
- | Cic.Sort _ -> false
- | _ -> assert false
-;;
-
-exception InProp;;
-
-let get_relevance ty =
- let rec aux context ty =
- match CicReduction.whd context ty with
- Cic.Prod (n,s,t) ->
- not (is_proof_irrelevant context s)::aux (Some (n,Cic.Decl s)::context) t
- | ty -> if is_proof_irrelevant context ty then raise InProp else []
- in
- try aux [] ty
- with InProp -> []
-;;
-
let convert_obj_aux uri = function
| Cic.Constant (name, None, ty, vars, _) ->
let ty = cook `Pi vars ty in
(*prerr_endline ("H(" ^ UriManager.string_of_uri uri ^ ") = " ^ string_of_int * (get_height uri));*)
fixpoints @ [obj]
;;
+
+(*
+let convert_context uri =
+ let name_of = function Cic.Name s -> s | _ -> "_" in
+ List.fold_right
+ (function
+ | (Some (s, Cic.Decl t) as e) -> fun (nc,auxc,oc) ->
+ let t, _ = aux true oc auxc 0 uri t in
+ (name_of s, NCic.Decl t) :: nc,
+ Ce (lazy ((name_of s, NCic.Decl t),[])) :: auxc, e :: oc
+ | (Some (Cic.Name s, Cic.Def (t,ty)) as e) -> fun (nc,auxc,oc) ->
+ let t, _ = aux true oc auxc 0 uri t in
+ let t, _ = aux true oc auxc 0 uri ty in
+ (name_of s, NCic.Def (t,ty)) :: nc,
+ Ce (lazy ((name_of s, NCic.Def (t,ty)),[])) :: auxc, e :: oc
+ | None -> nc, , e :: oc
+;;
+
+let convert_term uri ctx t =
+ aux false [] [] 0 uri t
+;;
+*)