-
Notifications
You must be signed in to change notification settings - Fork 736
Fix restrict_universe_context #7495
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| if [ "$CI_PULL_REQUEST" = "7495" ] || [ "$CI_BRANCH" = "fix-restrict" ]; then | ||
|
|
||
| # this branch contains a commit not present on coq-master that triggers | ||
| # the universe restriction bug #7472 | ||
| Elpi_CI_BRANCH=overlay-7495 | ||
| Elpi_CI_GITURL=https://github.com/LPCIC/coq-elpi.git | ||
|
|
||
| fi |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -503,7 +503,7 @@ let insert_edge strict ucan vcan g = | |
| let () = cleanup_universes g in | ||
| raise e | ||
|
|
||
| let add_universe vlev strict g = | ||
| let add_universe_gen vlev g = | ||
| try | ||
| let _arcv = UMap.find vlev g.entries in | ||
| raise AlreadyDeclared | ||
|
|
@@ -520,8 +520,14 @@ let add_universe vlev strict g = | |
| } | ||
| in | ||
| let entries = UMap.add vlev (Canonical v) g.entries in | ||
| let g = { entries; index = g.index - 1; n_nodes = g.n_nodes + 1; n_edges = g.n_edges } in | ||
| insert_edge strict (get_set_arc g) v g | ||
| { entries; index = g.index - 1; n_nodes = g.n_nodes + 1; n_edges = g.n_edges }, v | ||
|
|
||
| let add_universe vlev strict g = | ||
| let g, v = add_universe_gen vlev g in | ||
| insert_edge strict (get_set_arc g) v g | ||
|
|
||
| let add_universe_unconstrained vlev g = | ||
| fst (add_universe_gen vlev g) | ||
|
|
||
| exception Found_explanation of explanation | ||
|
|
||
|
|
@@ -696,6 +702,9 @@ let enforce_univ_lt u v g = | |
| error_inconsistency Lt u v (get_explanation false v u g) | ||
|
|
||
| let empty_universes = | ||
| { entries = UMap.empty; index = 0; n_nodes = 0; n_edges = 0 } | ||
|
|
||
| let initial_universes = | ||
| let set_arc = Canonical { | ||
| univ = Level.set; | ||
| ltle = LMap.empty; | ||
|
|
@@ -718,9 +727,6 @@ let empty_universes = | |
| let empty = { entries; index = (-2); n_nodes = 2; n_edges = 0 } in | ||
| enforce_univ_lt Level.prop Level.set empty | ||
|
|
||
| (* Prop = Set is forbidden here. *) | ||
| let initial_universes = empty_universes | ||
|
|
||
| let is_initial_universes g = UMap.equal (==) g.entries initial_universes.entries | ||
|
|
||
| let enforce_constraint cst g = | ||
|
|
@@ -780,6 +786,42 @@ let constraints_of_universes g = | |
| let csts = UMap.fold constraints_of g.entries Constraint.empty in | ||
| csts, UF.partition uf | ||
|
|
||
| (* domain g.entries = kept + removed *) | ||
| let constraints_for ~kept g = | ||
| (* rmap: partial map from canonical universes to kept universes *) | ||
| let rmap, csts = LSet.fold (fun u (rmap,csts) -> | ||
| let arcu = repr g u in | ||
| if LSet.mem arcu.univ kept then | ||
| LMap.add arcu.univ arcu.univ rmap, enforce_eq_level u arcu.univ csts | ||
| else | ||
| match LMap.find arcu.univ rmap with | ||
| | v -> rmap, enforce_eq_level u v csts | ||
| | exception Not_found -> LMap.add arcu.univ u rmap, csts) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here I'm a bit worried: rmap is in the process of being built, so we depend on the fold order somehow? Otherwise, it looks to me that indeed, constraints_for will for sure not return constraints mentioning anything else than the kept universes.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The fold order impacts which kept universe is canonical when the ugraph considers a removed universe to be canonical.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @SkySkimmer could you confirm or infirm my worry?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the worry exactly? ie what can go wrong?
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good, thanks for the explanation. |
||
| kept (LMap.empty,Constraint.empty) | ||
| in | ||
| let rec add_from u csts todo = match todo with | ||
| | [] -> csts | ||
| | (v,strict)::todo -> | ||
| let v = repr g v in | ||
| (match LMap.find v.univ rmap with | ||
| | v -> | ||
| let d = if strict then Lt else Le in | ||
| let csts = Constraint.add (u,d,v) csts in | ||
| add_from u csts todo | ||
| | exception Not_found -> | ||
| (* v is not equal to any kept universe *) | ||
| let todo = LMap.fold (fun v' strict' todo -> | ||
| (v',strict || strict') :: todo) | ||
| v.ltle todo | ||
| in | ||
| add_from u csts todo) | ||
| in | ||
| LSet.fold (fun u csts -> | ||
| let arc = repr g u in | ||
| LMap.fold (fun v strict csts -> add_from u csts [v,strict]) | ||
| arc.ltle csts) | ||
| kept csts | ||
|
|
||
| (** [sort_universes g] builds a totally ordered universe graph. The | ||
| output graph should imply the input graph (and the implication | ||
| will be strict most of the time), but is not necessarily minimal. | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, we add u = u so that the LMap.find on kept canonical universes works.