TmOracle: Replace negative term equalities by refutable PmAltCons
The `PmExprEq` business was a huge hack and was at the same time vastly too powerful and not powerful enough to encode negative term equalities, i.e. facts of the form "forall y. x ≁ Just y". This patch introduces the concept of 'refutable shapes': What matters for the pattern match checker is being able to encode knowledge of the form "x can no longer be the literal 5" or "x can no longer be Just y, for any y". We encode this knowledge in the form of a `PmRefutEnv`, storing a set of newly introduced `PmAltCon`s (literals and `ConLike`s) for each variable denoting equations of the above form. So, say we have `x ≁ Just ∈ refuts` in the term oracle context and try to solve an equality like `x ~ Just 5`. The entry in the refutable environment will immediately lead to a contradiction. This machinery makes the whole `PmExprEq` business completely unnecessary, getting rid of a lot of (mostly dead) code. Note that the PmAltConLike case is currently unnecessary. This is bound to change in a follow-up patch. If we began to use PmAltConLike, we'd even profit from nicer error messages as is currently the case for negative literal equalities. See the Note [Refutable shapes] in TmOracle for a place to start.
parent
a5fdd185
No related branches found
No related tags found
Pipeline #5969 canceled
Stage: lint
Stage: build
Stage: full-build
Stage: cleanup
Stage: packaging
Stage: hackage
Showing
- compiler/deSugar/Check.hs 18 additions, 18 deletionscompiler/deSugar/Check.hs
- compiler/deSugar/PmExpr.hs 39 additions, 60 deletionscompiler/deSugar/PmExpr.hs
- compiler/deSugar/TmOracle.hs 125 additions, 111 deletionscompiler/deSugar/TmOracle.hs
- compiler/utils/ListSetOps.hs 17 additions, 1 deletioncompiler/utils/ListSetOps.hs
Loading
Please register or sign in to comment