@@ -596,23 +596,18 @@ let rec to_constr constr_fun lfts v =
596
596
| FInd op -> mkIndU op
597
597
| FConstruct op -> mkConstructU op
598
598
| FCaseT (ci ,p ,c ,ve ,env ) ->
599
- mkCase (ci, constr_fun lfts (mk_clos env p),
600
- constr_fun lfts c,
601
- Array. map (fun b -> constr_fun lfts (mk_clos env b)) ve)
599
+ let fve = to_constr_array constr_fun lfts env 0 ve in
600
+ mkCase (ci, constr_fun lfts (mk_clos env p), constr_fun lfts c, fve)
602
601
| FFix ((op ,(lna ,tys ,bds )),e ) ->
603
602
let n = Array. length bds in
604
- let ftys = CArray.Fun1. map mk_clos e tys in
605
- let fbds = CArray.Fun1. map mk_clos (subs_liftn n e) bds in
606
- let lfts' = el_liftn n lfts in
607
- mkFix (op, (lna, CArray.Fun1. map constr_fun lfts ftys,
608
- CArray.Fun1. map constr_fun lfts' fbds))
603
+ let ftys = to_constr_array constr_fun lfts e 0 tys in
604
+ let fbds = to_constr_array constr_fun lfts e n bds in
605
+ mkFix (op, (lna, ftys, fbds))
609
606
| FCoFix ((op ,(lna ,tys ,bds )),e ) ->
610
607
let n = Array. length bds in
611
- let ftys = CArray.Fun1. map mk_clos e tys in
612
- let fbds = CArray.Fun1. map mk_clos (subs_liftn n e) bds in
613
- let lfts' = el_liftn (Array. length bds) lfts in
614
- mkCoFix (op, (lna, CArray.Fun1. map constr_fun lfts ftys,
615
- CArray.Fun1. map constr_fun lfts' fbds))
608
+ let ftys = to_constr_array constr_fun lfts e 0 tys in
609
+ let fbds = to_constr_array constr_fun lfts e n bds in
610
+ mkCoFix (op, (lna, ftys, fbds))
616
611
| FApp (f ,ve ) ->
617
612
mkApp (constr_fun lfts f,
618
613
CArray.Fun1. map constr_fun lfts ve)
@@ -640,6 +635,18 @@ let rec to_constr constr_fun lfts v =
640
635
to_constr constr_fun lfts unfv
641
636
| FLOCKED -> assert false (* mkVar(Id.of_string"_LOCK_")*)
642
637
638
+ and to_constr_array constr_fun lfts env n (v : constr array ) =
639
+ let len = Array. length v in
640
+ let ans = Array. make len mkProp in
641
+ let env = subs_liftn n env in
642
+ let lfts = el_liftn n lfts in
643
+ for i = 0 to len - 1 do
644
+ let c = Array. unsafe_get v i in
645
+ let c = constr_fun lfts (mk_clos env c) in
646
+ Array. unsafe_set ans i c
647
+ done ;
648
+ ans
649
+
643
650
(* This function defines the correspondance between constr and
644
651
fconstr. When we find a closure whose substitution is the identity,
645
652
then we directly return the constr to avoid possibly huge
@@ -1020,22 +1027,32 @@ and norm_head info m =
1020
1027
| FProd (na ,dom ,rng ) ->
1021
1028
mkProd(na, kl info dom, kl info rng)
1022
1029
| FCoFix ((n ,(na ,tys ,bds )),e ) ->
1023
- let ftys = CArray.Fun1. map mk_clos e tys in
1024
- let fbds =
1025
- CArray.Fun1. map mk_clos (subs_liftn (Array. length na) e) bds in
1026
- mkCoFix(n,(na, CArray.Fun1. map kl info ftys, CArray.Fun1. map kl info fbds))
1030
+ let ftys = norm_head_array info e 0 tys in
1031
+ let fbds = norm_head_array info e (Array. length na) bds in
1032
+ mkCoFix(n,(na, ftys, fbds))
1027
1033
| FFix ((n ,(na ,tys ,bds )),e ) ->
1028
- let ftys = CArray.Fun1. map mk_clos e tys in
1029
- let fbds =
1030
- CArray.Fun1. map mk_clos (subs_liftn (Array. length na) e) bds in
1031
- mkFix(n,(na, CArray.Fun1. map kl info ftys, CArray.Fun1. map kl info fbds))
1034
+ let ftys = norm_head_array info e 0 tys in
1035
+ let fbds = norm_head_array info e (Array. length na) bds in
1036
+ mkFix(n,(na, ftys, fbds))
1032
1037
| FEvar ((i ,args ),env ) ->
1033
- mkEvar(i, Array. map (fun a -> kl info (mk_clos env a)) args)
1038
+ let fargs = norm_head_array info env 0 args in
1039
+ mkEvar(i, fargs)
1034
1040
| FProj (p ,c ) ->
1035
1041
mkProj (p, kl info c)
1036
1042
| FLOCKED | FRel _ | FAtom _ | FCast _ | FFlex _ | FInd _ | FConstruct _
1037
1043
| FApp _ | FCaseT _ | FLIFT _ | FCLOS _ -> term_of_fconstr m
1038
1044
1045
+ and norm_head_array info env n (v : constr array ) =
1046
+ let len = Array. length v in
1047
+ let ans = Array. make len mkProp in
1048
+ let env = subs_liftn n env in
1049
+ for i = 0 to len - 1 do
1050
+ let c = Array. unsafe_get v i in
1051
+ let c = kl info (mk_clos env c) in
1052
+ Array. unsafe_set ans i c
1053
+ done ;
1054
+ ans
1055
+
1039
1056
(* Initialization and then normalization *)
1040
1057
1041
1058
(* weak reduction *)
0 commit comments