[false, NUri.uri_of_string ("cic:/matita/pts/Type"^string_of_int n^".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
let reference_of_ouri u indinfo =
| Fix l -> `Fix (Lazy.force l)
;;
+let count_vars vars =
+ List.length
+ (List.filter (fun v ->
+ match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph v) with
+ Cic.Variable (_,Some _,_,_,_) -> false
+ | Cic.Variable (_,None,_,_,_) -> true
+ | _ -> assert false) vars)
+;;
+
+
(***** A function to restrict the context of a term getting rid of unsed
variables *******)
| ((_,objs,None)::tl, Cic.Lambda(name,oso,ota), NCic.Lambda(name',so,ta)) ->
split_lambdas_and_letins ((Some(name,(Cic.Decl oso)))::octx)
(Ce (lazy ((name',NCic.Decl so),objs))::ctx) tl (ota,ta)
- | ((_,objs,Some r)::tl,Cic.Lambda(name,oso,ota),NCic.Lambda(name',so,ta)) ->
+ | ((_,_,Some r)::tl,Cic.Lambda(name,oso,ota),NCic.Lambda(name',so,ta)) ->
split_lambdas_and_letins ((Some(name,(Cic.Decl oso)))::octx)
(Fix (lazy (r,name',so))::ctx) tl (ota,ta)
| ((_,objs,None)::tl,Cic.LetIn(name,obo,oty,ota),NCic.LetIn(nam',bo,ty,ta))->
(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
;;
let splat_args ctx t n_fix rels =
- let bound, free, _, primo_ce_dopo_fix = context_tassonomy ctx in
+ let bound, _, _, primo_ce_dopo_fix = context_tassonomy ctx in
if ctx = [] then t
else
let rec aux = function
0, Cic.Sort _ -> 0
| 0, Cic.Prod (name,so,ty) ->
1 + count_prods 0 (Some (name, Cic.Decl so)::context) ty
- | n, Cic.Prod (name,so,ty) ->
+ | _, Cic.Prod (name,so,ty) ->
count_prods (leftno - 1) (Some (name, Cic.Decl so)::context) ty
| _,_ -> assert false
in
begin
match obj, ref with
| (_,_,_,_,NCic.Fixpoint (true,fl,_)) ,
- NReference.Ref (y,NReference.Fix _) ->
+ NReference.Ref (_,NReference.Fix _) ->
ignore(List.fold_left (fun i (_,name,rno,_,_) ->
let ref = NReference.mk_fix i rno ref in
Hashtbl.add cache name (ref,obj);
i+1
) 0 fl)
| (_,_,_,_,NCic.Fixpoint (false,fl,_)) ,
- NReference.Ref (y,NReference.CoFix _) ->
- ignore(List.fold_left (fun i (_,name,rno,_,_) ->
+ NReference.Ref (_,NReference.CoFix _) ->
+ ignore(List.fold_left (fun i (_,name,_,_,_) ->
let ref = NReference.mk_cofix i ref in
Hashtbl.add cache name (ref,obj);
i+1
| Cic.MutConstruct (uri,_,_,exp_named_subst) ->
h := max !h (get_height uri);
List.iter (function (_,t) -> aux t) exp_named_subst
- | Cic.Meta (i,l) -> List.iter (function None -> () | Some t -> aux t) l
+ | Cic.Meta (_,l) -> List.iter (function None -> () | Some t -> aux t) l
| Cic.Cast (t1,t2)
| Cic.Prod (_,t1,t2)
| Cic.Lambda (_,t1,t2) -> aux t1; aux t2
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.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)),[]
| Cic.MutInd (curi, tyno, ens) ->
let is_inductive, lno =
match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph curi) with
- Cic.InductiveDefinition ([],_,lno,_) -> true, lno
- | Cic.InductiveDefinition ((_,b,_,_)::_,_,lno,_) -> b, lno
+ Cic.InductiveDefinition ([],vars,lno,_) -> true, lno + count_vars vars
+ | Cic.InductiveDefinition ((_,b,_,_)::_,vars,lno,_) -> b, lno + count_vars vars
| _ -> assert false
in
aux_ens k curi octx ctx n_fix uri ens
| Cic.MutConstruct (curi, tyno, consno, ens) ->
let lno =
match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph curi) with
- Cic.InductiveDefinition (_,_,lno,_) -> lno
+ Cic.InductiveDefinition (_,vars,lno,_) -> lno + count_vars vars
| _ -> assert false
in
aux_ens k curi octx ctx n_fix uri ens
| Cic.MutCase (curi, tyno, outty, t, branches) ->
let is_inductive,lno =
match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph curi) with
- Cic.InductiveDefinition ([],_,lno,_) -> true, lno
- | Cic.InductiveDefinition ((_,b,_,_)::_,_,lno,_) -> b, lno
+ Cic.InductiveDefinition ([],vars,lno,_) -> true, lno + count_vars vars
+ | Cic.InductiveDefinition ((_,b,_,_)::_,vars,lno,_) -> b, lno + count_vars vars
| _ -> assert false in
let r = reference_of_ouri curi (Ref.Ind (is_inductive,tyno,lno)) in
let outty, fixpoints_outty = aux k octx ctx n_fix uri outty in
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
(get_relevance ty, name, nty, cl)::itl, fix_ty @ fix_cl @ acc)
itl ([],[])
in
- NCic.Inductive(ind, leftno + List.length
- (List.filter (fun v ->
- match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph v) with
- Cic.Variable (_,Some _,_,_,_) -> false
- | Cic.Variable (_,None,_,_,_) -> true
- | _ -> assert false)
- vars)
- , itl, (`Provided, `Regular)),
+ NCic.Inductive(ind, leftno + count_vars vars, itl, (`Provided, `Regular)),
fix_itl
| Cic.Variable _
| Cic.CurrentProof _ -> assert false