| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Rerefined.Simplify.Core
Description
Core predicate simplification algorithm.
This is related to an NP-complete problem (see Boolean satisfiability problem). We focus on immediate, operation-reducing simplifications, and hope that the input is formed in such a way that our rules match.
In short, the simplifier is largely contextless. It inspects (usually) a single layer/depth at a time. So we can consistently simplify things like logical identities. But don't expect simplifications hard to spot with the naked eye.
Implementation pitfalls:
- not extensible: only works for built-in logical & relational predicates
- no protection against non-termination e.g. if a pair of transformations loop
- very tedious to write. that's life
Internal module. Exports may change without warning. Try not to use.
Synopsis
- type family SimplifyStep p :: Maybe Type where ...
- type family SimplifyAnd l r :: Maybe Type where ...
- type family OrElseAndL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseAndR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyOr l r :: Maybe Type where ...
- type family OrElseOrL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseOrR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyNand l r :: Maybe Type where ...
- type family OrElseNandL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseNandR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyNor l r :: Maybe Type where ...
- type family OrElseNorL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseNorR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyXor l r :: Maybe Type where ...
- type family OrElseXorL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseXorR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyIf l r :: Maybe Type where ...
- type family OrElseIfL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseIfR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyIff l r :: Maybe Type where ...
- type family OrElseIffL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
- type family OrElseIffR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ...
- type family SimplifyNot p :: Maybe Type where ...
- type family OrElseNot (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ...
Documentation
type family SimplifyStep p :: Maybe Type where ... Source #
Try to perform a single simplification step on the given predicate.
Returns Nothing if we were unable to simplify.
Equations
| SimplifyStep (Not p) = SimplifyNot p | |
| SimplifyStep (And l r) = SimplifyAnd l r | |
| SimplifyStep (Or l r) = SimplifyOr l r | |
| SimplifyStep (Nand l r) = SimplifyNand l r | |
| SimplifyStep (Nor l r) = SimplifyNor l r | |
| SimplifyStep (Iff l r) = SimplifyIff l r | |
| SimplifyStep (Xor l r) = SimplifyXor l r | |
| SimplifyStep (If l r) = SimplifyIf l r | |
| SimplifyStep (CompareLength op n) = SimplifyCompareLength op n | |
| SimplifyStep p = 'Nothing :: Maybe Type |
type family SimplifyAnd l r :: Maybe Type where ... Source #
Equations
| SimplifyAnd p Fail = 'Just Fail | |
| SimplifyAnd Fail p = 'Just Fail | |
| SimplifyAnd p Succeed = 'Just p | |
| SimplifyAnd Succeed p = 'Just p | |
| SimplifyAnd p p = 'Just p | |
| SimplifyAnd (Or x y) (Or x z) = 'Just (Or x (And y z)) | |
| SimplifyAnd (CompareLength lop ln) (CompareLength rop rn) = SimplifyCompareLengthAnd lop ln rop rn | |
| SimplifyAnd l r = OrElseAndL r (SimplifyStep l) (OrElseAndR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseAndL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseAndL (r :: k1) ('Nothing :: Maybe k) cont = cont | |
| OrElseAndL (r :: k1) ('Just l' :: Maybe k) cont = 'Just (And l' r) |
type family OrElseAndR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseAndR (l :: k) ('Nothing :: Maybe k1) cont = cont | |
| OrElseAndR (l :: k) ('Just r' :: Maybe k1) cont = 'Just (And l r') |
type family SimplifyOr l r :: Maybe Type where ... Source #
Equations
| SimplifyOr Succeed p = 'Just Succeed | |
| SimplifyOr p Succeed = 'Just Succeed | |
| SimplifyOr Fail p = 'Just p | |
| SimplifyOr p Fail = 'Just p | |
| SimplifyOr p p = 'Just p | |
| SimplifyOr (And x y) (And x z) = 'Just (And x (Or y z)) | |
| SimplifyOr (CompareLength lop ln) (CompareLength rop rn) = SimplifyCompareLengthOr lop ln rop rn | |
| SimplifyOr l r = OrElseOrL r (SimplifyStep l) (OrElseOrR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseOrL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
type family OrElseOrR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
type family SimplifyNand l r :: Maybe Type where ... Source #
Equations
| SimplifyNand Fail p = 'Just Succeed | |
| SimplifyNand p Fail = 'Just Succeed | |
| SimplifyNand Succeed p = 'Just (Not p) | |
| SimplifyNand p Succeed = 'Just (Not p) | |
| SimplifyNand p p = 'Just (Not p) | |
| SimplifyNand l r = OrElseNandL r (SimplifyStep l) (OrElseNandR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseNandL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseNandL (r :: k1) ('Nothing :: Maybe k) cont = cont | |
| OrElseNandL (r :: k1) ('Just l' :: Maybe k) cont = 'Just (Nand l' r) |
type family OrElseNandR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseNandR (l :: k) ('Nothing :: Maybe k1) cont = cont | |
| OrElseNandR (l :: k) ('Just r' :: Maybe k1) cont = 'Just (Nand l r') |
type family SimplifyNor l r :: Maybe Type where ... Source #
Equations
| SimplifyNor Succeed p = 'Just Fail | |
| SimplifyNor p Succeed = 'Just Fail | |
| SimplifyNor Fail p = 'Just (Not p) | |
| SimplifyNor p Fail = 'Just (Not p) | |
| SimplifyNor p p = 'Just (Not p) | |
| SimplifyNor l r = OrElseNorL r (SimplifyStep l) (OrElseNorR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseNorL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseNorL (r :: k1) ('Nothing :: Maybe k) cont = cont | |
| OrElseNorL (r :: k1) ('Just l' :: Maybe k) cont = 'Just (Nor l' r) |
type family OrElseNorR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseNorR (l :: k) ('Nothing :: Maybe k1) cont = cont | |
| OrElseNorR (l :: k) ('Just r' :: Maybe k1) cont = 'Just (Nor l r') |
type family SimplifyXor l r :: Maybe Type where ... Source #
Equations
| SimplifyXor Fail p = 'Just p | |
| SimplifyXor p Fail = 'Just p | |
| SimplifyXor Succeed p = 'Just (Not p) | |
| SimplifyXor p Succeed = 'Just (Not p) | |
| SimplifyXor p p = 'Just Fail | |
| SimplifyXor l r = OrElseXorL r (SimplifyStep l) (OrElseXorR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseXorL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseXorL (r :: k1) ('Nothing :: Maybe k) cont = cont | |
| OrElseXorL (r :: k1) ('Just l' :: Maybe k) cont = 'Just (Xor l' r) |
type family OrElseXorR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseXorR (l :: k) ('Nothing :: Maybe k1) cont = cont | |
| OrElseXorR (l :: k) ('Just r' :: Maybe k1) cont = 'Just (Xor l r') |
type family SimplifyIf l r :: Maybe Type where ... Source #
Equations
| SimplifyIf Fail p = 'Just Succeed | |
| SimplifyIf p Fail = 'Just Succeed | |
| SimplifyIf Succeed p = 'Just p | |
| SimplifyIf p Succeed = 'Just p | |
| SimplifyIf p p = 'Just Succeed | |
| SimplifyIf l r = OrElseIfL r (SimplifyStep l) (OrElseIfR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseIfL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
type family OrElseIfR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
type family SimplifyIff l r :: Maybe Type where ... Source #
Equations
| SimplifyIff Succeed p = 'Just p | |
| SimplifyIff p Succeed = 'Just p | |
| SimplifyIff Fail p = 'Just (Not p) | |
| SimplifyIff p Fail = 'Just (Not p) | |
| SimplifyIff p p = 'Just Succeed | |
| SimplifyIff l r = OrElseIffL r (SimplifyStep l) (OrElseIffR l (SimplifyStep r) ('Nothing :: Maybe Type)) |
type family OrElseIffL (r :: k1) (mp :: Maybe k) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseIffL (r :: k1) ('Nothing :: Maybe k) cont = cont | |
| OrElseIffL (r :: k1) ('Just l' :: Maybe k) cont = 'Just (Iff l' r) |
type family OrElseIffR (l :: k) (mp :: Maybe k1) (cont :: Maybe Type) :: Maybe Type where ... Source #
Equations
| OrElseIffR (l :: k) ('Nothing :: Maybe k1) cont = cont | |
| OrElseIffR (l :: k) ('Just r' :: Maybe k1) cont = 'Just (Iff l r') |
type family SimplifyNot p :: Maybe Type where ... Source #
Equations
| SimplifyNot (Not p) = 'Just p | |
| SimplifyNot Succeed = 'Just Fail | |
| SimplifyNot Fail = 'Just Succeed | |
| SimplifyNot (CompareLength op n) = 'Just (CompareLength (FlipRelOp op) n) | |
| SimplifyNot (CompareValue op sign n) = 'Just (CompareValue (FlipRelOp op) sign n) | |
| SimplifyNot p = OrElseNot (SimplifyStep p) ('Nothing :: Maybe Type) |