Refactor lattice flipping for modes #3949
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently in
solver.ml
there isSolver_mono
which can handle monotone morphisms. Based on that, there are two polarized solversPositive
andNegative
, used for comonadic and monadic axes respectively. The intention is such that user code (mode.ml
) doesn't need to think about the flipping. This has two issues:mode.ml
still needs to think about the flipping in some definitions but not all of them. This mixture, and the fact that bothmode.ml
andsolver.ml
handles flipping, makes the code more confusing.Positive.t
andNegative.t
are different types and complicates type polymorphism. In particular,Value.Axis.t
is a complicated GADT.So we remove both
Positive
andNegative
, and letmode.ml
to be the only file that cares about flipping. We move some code such that the flipping are concentrated to fewer places.The downside is that code that uses
mode
might see(Uniqueness.Const.t, allowed * disallowed) mode
instead of(disallowed * allowed) Uniqueness.t
. The two types are the same, but ideally we want to show the latter.Review
Please review by commit.