(*prerr_endline (CicPp.ppterm outty ^ " <==> " ^ CicPp.ppterm outty');*)
;;
+let fix_outtype t =
+ let module C = Cic in
+ let rec aux context =
+ function
+ C.Rel _ as t -> t
+ | C.Var (uri,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map (function i,t -> i, (aux context t)) exp_named_subst in
+ C.Var (uri,exp_named_subst')
+ | C.Implicit _
+ | C.Meta _ -> assert false
+ | C.Sort _ as t -> t
+ | C.Cast (v,t) -> C.Cast (aux context v, aux context t)
+ | C.Prod (n,s,t) ->
+ C.Prod (n, aux context s, aux ((Some (n, C.Decl s))::context) t)
+ | C.Lambda (n,s,t) ->
+ C.Lambda (n, aux context s, aux ((Some (n, C.Decl s))::context) t)
+ | C.LetIn (n,s,ty,t) ->
+ C.LetIn
+ (n, aux context s, aux context ty,
+ aux ((Some (n, C.Def(s,ty)))::context) t)
+ | C.Appl l -> C.Appl (List.map (aux context) l)
+ | C.Const (uri,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.Const (uri,exp_named_subst')
+ | C.MutInd (uri,tyno,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.MutInd (uri, tyno, exp_named_subst')
+ | C.MutConstruct (uri,tyno,consno,exp_named_subst) ->
+ let exp_named_subst' =
+ List.map (function i,t -> i, (aux context t)) exp_named_subst
+ in
+ C.MutConstruct (uri, tyno, consno, exp_named_subst')
+ | C.MutCase (uri, tyno, outty, term, patterns) ->
+ let outty = fix_outty uri tyno term context outty in
+ C.MutCase (uri, tyno, aux context outty,
+ aux context term, List.map (aux context) patterns)
+ | C.Fix (funno, funs) ->
+ let tys,_ =
+ List.fold_left
+ (fun (types,len) (n,_,ty,_) ->
+ ((Some (C.Name n,(C.Decl (CicSubstitution.lift len ty)))))::types,
+ len+1
+ ) ([],0) funs
+ in
+ C.Fix (funno,
+ List.map
+ (fun (name, indidx, ty, bo) ->
+ (name, indidx, aux context ty, aux (tys@context) bo)
+ ) funs
+ )
+ | C.CoFix (funno, funs) ->
+ let tys,_ =
+ List.fold_left
+ (fun (types,len) (n,ty,_) ->
+ ((Some (C.Name n,(C.Decl (CicSubstitution.lift len ty)))))::types,
+ len+1
+ ) ([],0) funs
+ in
+ C.CoFix (funno,
+ List.map
+ (fun (name, ty, bo) ->
+ (name, aux context ty, aux (tys@context) bo)
+ ) funs
+ )
+ in
+ aux [] t
+;;
+
(* 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 *)
aux_ens curi octx ctx n_fix uri ens
(NCic.Const (Ref.reference_of_ouri curi (Ref.Con (tyno,consno))))
| Cic.MutCase (curi, tyno, outty, t, branches) ->
- let outty = fix_outty curi tyno t octx outty in
let r = Ref.reference_of_ouri curi (Ref.Ind tyno) in
let outty, fixpoints_outty = aux octx ctx n_fix uri outty in
let t, fixpoints_t = aux octx ctx n_fix uri t in
;;
let cook mode vars t =
+ let t = fix_outtype t in
let varsno = List.length vars in
let t = CicSubstitution.lift varsno t in
let rec aux n acc l =
| uri::uris ->
let bo,ty =
match fst (CicEnvironment.get_obj CicUniv.oblivion_ugraph uri) with
- Cic.Variable (_,bo,ty,_,_) -> bo,ty
+ Cic.Variable (_,bo,ty,_,_) ->
+ HExtlib.map_option fix_outtype bo, fix_outtype ty
| _ -> assert false in
let ty = CicSubstitution.subst_vars subst ty in
let bo = HExtlib.map_option (CicSubstitution.subst_vars subst) bo in