aboutsummaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorMatthieu Sozeau2015-09-23 16:11:56 +0200
committerMatthieu Sozeau2015-10-02 15:54:10 +0200
commit26628315688e07c43b9881872a737454e93fe4c9 (patch)
tree36dfc2e0a04a5901c840990bc0bd989e1d7feff7 /library
parente841deb4750d43ab19f91907476d75fc73860c5a (diff)
Univs: minimization, adapt to graph invariants.
We are forced to declare universes that are global and appear in the local constraints as we start from an empty universe graph.
Diffstat (limited to 'library')
-rw-r--r--library/universes.ml22
1 files changed, 21 insertions, 1 deletions
diff --git a/library/universes.ml b/library/universes.ml
index 0544585dce..0133f5deb6 100644
--- a/library/universes.ml
+++ b/library/universes.ml
@@ -843,7 +843,25 @@ let normalize_context_set ctx us algs =
let csts =
(* We first put constraints in a normal-form: all self-loops are collapsed
to equalities. *)
- let g = Univ.merge_constraints csts Univ.empty_universes in
+ let g = Univ.LSet.fold (fun v g -> Univ.add_universe v false g)
+ ctx Univ.empty_universes
+ in
+ let g =
+ Univ.Constraint.fold (fun (l, d, r) g ->
+ let g =
+ if not (Level.is_small l || LSet.mem l ctx) then
+ try Univ.add_universe l true g
+ with Univ.AlreadyDeclared -> g
+ else g
+ in
+ let g =
+ if not (Level.is_small r || LSet.mem r ctx) then
+ try Univ.add_universe r true g
+ with Univ.AlreadyDeclared -> g
+ else g
+ in g) csts g
+ in
+ let g = Univ.Constraint.fold Univ.enforce_constraint csts g in
Univ.constraints_of_universes g
in
let noneqs =
@@ -852,6 +870,8 @@ let normalize_context_set ctx us algs =
else (* We ignore the trivial Prop/Set <= i constraints. *)
if d == Le && Univ.Level.is_small l then
noneqs
+ else if Level.is_small l && d == Lt && not (LSet.mem r ctx) then
+ noneqs
else Constraint.add cstr noneqs)
csts Constraint.empty
in