aboutsummaryrefslogtreecommitdiffhomepage
path: root/kernel
diff options
context:
space:
mode:
authorGravatar Gaëtan Gilbert <gaetan.gilbert@skyskimmer.net>2017-11-10 15:05:21 +0100
committerGravatar Gaëtan Gilbert <gaetan.gilbert@skyskimmer.net>2018-02-11 22:28:39 +0100
commit6c2d10b93b819f0735a43453c78566795de8ba5a (patch)
tree14dffe59d0edfacf547b3912352f14420df047b8 /kernel
parent1ed0836a7e0c8e05b0288f85e344ef5249d5d228 (diff)
Use specialized function for inductive subtyping inference.
This ensures by construction that we never infer constraints outside the variance model.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/reduction.ml24
-rw-r--r--kernel/reduction.mli3
2 files changed, 16 insertions, 11 deletions
diff --git a/kernel/reduction.ml b/kernel/reduction.ml
index 083692e91..208a62ced 100644
--- a/kernel/reduction.ml
+++ b/kernel/reduction.ml
@@ -227,6 +227,10 @@ let get_cumulativity_constraints cv_pb cumi u u' =
Univ.Variance.leq_constraints (Univ.ACumulativityInfo.variance cumi)
u u' Univ.Constraint.empty
+let inductive_cumulativity_arguments (mind,ind) =
+ mind.Declarations.mind_nparams +
+ mind.Declarations.mind_packets.(ind).Declarations.mind_nrealargs
+
let convert_inductives_gen cmp_instances cmp_cumul cv_pb (mind,ind) nargs u1 u2 s =
match mind.Declarations.mind_universes with
| Declarations.Monomorphic_ind _ ->
@@ -235,10 +239,7 @@ let convert_inductives_gen cmp_instances cmp_cumul cv_pb (mind,ind) nargs u1 u2
| Declarations.Polymorphic_ind _ ->
cmp_instances u1 u2 s
| Declarations.Cumulative_ind cumi ->
- let num_param_arity =
- mind.Declarations.mind_nparams +
- mind.Declarations.mind_packets.(ind).Declarations.mind_nrealargs
- in
+ let num_param_arity = inductive_cumulativity_arguments (mind,ind) in
if not (Int.equal num_param_arity nargs) then
cmp_instances u1 u2 s
else
@@ -249,6 +250,13 @@ let convert_inductives cv_pb ind nargs u1 u2 (s, check) =
convert_inductives_gen (check.compare_instances ~flex:false) check.compare_cumul_instances
cv_pb ind nargs u1 u2 s, check
+let constructor_cumulativity_arguments (mind, ind, ctor) =
+ let nparamsctxt =
+ mind.Declarations.mind_nparams +
+ mind.Declarations.mind_packets.(ind).Declarations.mind_nrealargs
+ (* Context.Rel.length mind.Declarations.mind_params_ctxt *) in
+ nparamsctxt + mind.Declarations.mind_packets.(ind).Declarations.mind_consnrealargs.(ctor - 1)
+
let convert_constructors_gen cmp_instances cmp_cumul (mind, ind, cns) nargs u1 u2 s =
match mind.Declarations.mind_universes with
| Declarations.Monomorphic_ind _ ->
@@ -257,13 +265,7 @@ let convert_constructors_gen cmp_instances cmp_cumul (mind, ind, cns) nargs u1 u
| Declarations.Polymorphic_ind _ ->
cmp_instances u1 u2 s
| Declarations.Cumulative_ind cumi ->
- let num_cnstr_args =
- let nparamsctxt =
- mind.Declarations.mind_nparams +
- mind.Declarations.mind_packets.(ind).Declarations.mind_nrealargs
- (* Context.Rel.length mind.Declarations.mind_params_ctxt *) in
- nparamsctxt + mind.Declarations.mind_packets.(ind).Declarations.mind_consnrealargs.(cns - 1)
- in
+ let num_cnstr_args = constructor_cumulativity_arguments (mind,ind,cns) in
if not (Int.equal num_cnstr_args nargs) then
cmp_instances u1 u2 s
else
diff --git a/kernel/reduction.mli b/kernel/reduction.mli
index d064b3687..0e6a2b819 100644
--- a/kernel/reduction.mli
+++ b/kernel/reduction.mli
@@ -50,6 +50,9 @@ type 'a infer_conversion_function = env -> UGraph.t -> 'a -> 'a -> Univ.Constrai
val get_cumulativity_constraints : conv_pb -> Univ.ACumulativityInfo.t ->
Univ.Instance.t -> Univ.Instance.t -> Univ.Constraint.t
+val inductive_cumulativity_arguments : (Declarations.mutual_inductive_body * int) -> int
+val constructor_cumulativity_arguments : (Declarations.mutual_inductive_body * int * int) -> int
+
val sort_cmp_universes : env -> conv_pb -> Sorts.t -> Sorts.t ->
'a * 'a universe_compare -> 'a * 'a universe_compare