diff options
Diffstat (limited to 'pretyping')
| -rw-r--r-- | pretyping/termops.ml | 7 | ||||
| -rw-r--r-- | pretyping/termops.mli | 4 | ||||
| -rw-r--r-- | pretyping/vnorm.ml | 11 |
3 files changed, 17 insertions, 5 deletions
diff --git a/pretyping/termops.ml b/pretyping/termops.ml index d6926dac30..5813cd416d 100644 --- a/pretyping/termops.ml +++ b/pretyping/termops.ml @@ -222,6 +222,13 @@ let it_mkNamedProd_or_LetIn init = it_named_context_quantifier mkNamedProd_or_Le let it_mkNamedProd_wo_LetIn init = it_named_context_quantifier mkNamedProd_wo_LetIn ~init let it_mkNamedLambda_or_LetIn init = it_named_context_quantifier mkNamedLambda_or_LetIn ~init +let it_mkLambda_or_LetIn_from_no_LetIn c decls = + let rec aux k decls c = match decls with + | [] -> c + | (na,Some b,t)::decls -> mkLetIn (na,b,t,aux (k-1) decls (liftn 1 k c)) + | (na,None,t)::decls -> mkLambda (na,t,aux (k-1) decls c) + in aux (List.length decls) (List.rev decls) c + (* *) (* strips head casts and flattens head applications *) diff --git a/pretyping/termops.mli b/pretyping/termops.mli index e01b3f4556..1e3d2e4e9f 100644 --- a/pretyping/termops.mli +++ b/pretyping/termops.mli @@ -58,6 +58,10 @@ val it_mkNamedProd_or_LetIn : types -> named_context -> types val it_mkNamedProd_wo_LetIn : types -> named_context -> types val it_mkNamedLambda_or_LetIn : constr -> named_context -> constr +(* Ad hoc version reinserting letin, assuming the body is defined in + the context where the letins are expanded *) +val it_mkLambda_or_LetIn_from_no_LetIn : constr -> rel_context -> constr + val it_named_context_quantifier : (named_declaration -> 'a -> 'a) -> init:'a -> named_context -> 'a diff --git a/pretyping/vnorm.ml b/pretyping/vnorm.ml index 758686aa94..37b86d1ba6 100644 --- a/pretyping/vnorm.ml +++ b/pretyping/vnorm.ml @@ -116,7 +116,8 @@ let build_branches_type env (mind,_ as _ind) mib mip u params dep p = a 0) et les lambda correspondant aux realargs *) let build_one_branch i cty = let typi = type_constructor mind mib u cty params in - let decl,indapp = decompose_prod_assum typi in + let decl,indapp = Reductionops.splay_prod env Evd.empty typi in + let decl_with_letin,_ = decompose_prod_assum typi in let ((ind,u),cargs) = find_rectype_a env indapp in let nparams = Array.length params in let carity = snd (rtbl.(i)) in @@ -130,7 +131,7 @@ let build_branches_type env (mind,_ as _ind) mib mip u params dep p = mkApp(papp,[|dep_cstr|]) else papp in - decl, codom + decl, decl_with_letin, codom in Array.mapi build_one_branch mip.mind_nf_lc let build_case_type dep p realargs c = @@ -199,9 +200,9 @@ and nf_stk env c t stk = (* calcul des branches *) let bsw = branch_of_switch (nb_rel env) sw in let mkbranch i (n,v) = - let decl,codom = btypes.(i) in - let b = nf_val (push_rel_context decl env) v codom in - it_mkLambda_or_LetIn b decl + let decl,decl_with_letin,codom = btypes.(i) in + let b = nf_val (Termops.push_rels_assum decl env) v codom in + Termops.it_mkLambda_or_LetIn_from_no_LetIn b decl_with_letin in let branchs = Array.mapi mkbranch bsw in let tcase = build_case_type dep p realargs c in |
