| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Haskus.Utils.Solver
Description
Simple Constraint solver
Synopsis
- data PredState
- type PredOracle p = Map p PredState
- makeOracle :: Ord p => [(p, PredState)] -> PredOracle p
- oraclePredicates :: Ord p => PredOracle p -> [(p, PredState)]
- emptyOracle :: PredOracle p
- predIsSet :: Ord p => PredOracle p -> p -> Bool
- predIsUnset :: Ord p => PredOracle p -> p -> Bool
- predIsUndef :: Ord p => PredOracle p -> p -> Bool
- predIs :: Ord p => PredOracle p -> p -> PredState -> Bool
- predState :: Ord p => PredOracle p -> p -> PredState
- data Constraint e p
- = Predicate p
- | Not (Constraint e p)
- | And [Constraint e p]
- | Or [Constraint e p]
- | Xor [Constraint e p]
- | CBool Bool
- simplifyConstraint :: Constraint e p -> Constraint e p
- constraintReduce :: (Ord p, Eq p, Eq e) => PredOracle p -> Constraint e p -> Constraint e p
- data Rule e p a
- = Terminal a
- | NonTerminal [(Constraint e p, Rule e p a)]
- | Fail e
- orderedNonTerminal :: [(Constraint e p, Rule e p a)] -> Rule e p a
- mergeRules :: Rule e p a -> Rule e p b -> Rule e p (a, b)
- evalsTo :: (Ord (Pred a), Eq a, Eq (PredTerm a), Eq (Pred a), Predicated a) => a -> PredTerm a -> Constraint e (Pred a)
- data MatchResult e nt t
- = NoMatch
- | Match t
- | DontMatch nt
- | MatchFail [e]
- | MatchDiverge [nt]
- class Predicated a where
- createPredicateTable :: (Ord (Pred a), Eq (Pred a), Eq a, Predicated a, Predicated a, Pred a ~ Pred a) => a -> (PredOracle (Pred a) -> Bool) -> Bool -> Either (PredTerm a) [(PredOracle (Pred a), PredTerm a)]
- initP :: nt -> t -> MatchResult e nt (nt, t)
- applyP :: Predicated ntb => MatchResult e (ntb -> nt) (ntb -> nt, PredTerm ntb -> t) -> MatchResult e ntb (PredTerm ntb) -> MatchResult e nt (nt, t)
- resultP :: MatchResult e nt (nt, t) -> MatchResult e nt t
Oracle
Predicate state
Instances
| Eq PredState Source # | |
| Ord PredState Source # | |
| Show PredState Source # | |
type PredOracle p = Map p PredState Source #
Predicate oracle
makeOracle :: Ord p => [(p, PredState)] -> PredOracle p Source #
Create an oracle from a list
oraclePredicates :: Ord p => PredOracle p -> [(p, PredState)] Source #
Get a list of predicates from an oracle
emptyOracle :: PredOracle p Source #
Oracle that always answer Undef
predIsUnset :: Ord p => PredOracle p -> p -> Bool Source #
Ask an oracle if a predicate is unset
predIsUndef :: Ord p => PredOracle p -> p -> Bool Source #
Ask an oracle if a predicate is undefined
Constraint
data Constraint e p Source #
Constructors
| Predicate p | |
| Not (Constraint e p) | |
| And [Constraint e p] | |
| Or [Constraint e p] | |
| Xor [Constraint e p] | |
| CBool Bool |
Instances
simplifyConstraint :: Constraint e p -> Constraint e p Source #
Simplify a constraint
constraintReduce :: (Ord p, Eq p, Eq e) => PredOracle p -> Constraint e p -> Constraint e p Source #
Reduce a constraint
Rule
Constructors
| Terminal a | |
| NonTerminal [(Constraint e p, Rule e p a)] | |
| Fail e |
Instances
| Functor (Rule e p) Source # | |
| (Eq a, Eq p, Eq e) => Eq (Rule e p a) Source # | |
| (Ord a, Ord p, Ord e) => Ord (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver | |
| (Show a, Show p, Show e) => Show (Rule e p a) Source # | |
| (Ord p, Eq e, Eq a, Eq p) => Predicated (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver Methods liftTerminal :: PredTerm (Rule e p a) -> Rule e p a Source # reducePredicates :: PredOracle (Pred (Rule e p a)) -> Rule e p a -> MatchResult (PredErr (Rule e p a)) (Rule e p a) (PredTerm (Rule e p a)) Source # getTerminals :: Rule e p a -> [PredTerm (Rule e p a)] Source # | |
| type PredErr (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver | |
| type Pred (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver | |
| type PredTerm (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver | |
orderedNonTerminal :: [(Constraint e p, Rule e p a)] -> Rule e p a Source #
NonTerminal whose constraints are evaluated in order
Earlier constraints must be proven false for the next ones to be considered
evalsTo :: (Ord (Pred a), Eq a, Eq (PredTerm a), Eq (Pred a), Predicated a) => a -> PredTerm a -> Constraint e (Pred a) Source #
Constraint checking that a predicated value evaluates to some terminal
data MatchResult e nt t Source #
Reduction result
Constructors
| NoMatch | |
| Match t | |
| DontMatch nt | |
| MatchFail [e] | |
| MatchDiverge [nt] |
Instances
Predicated data
class Predicated a where Source #
Predicated data
data T
data NT
type family RuleT e p a s :: * where
RuleT e p a T = a
RuleT e p a NT = Rule e p a
data PD t = PD
{ p1 :: RuleT () Bool Int t
, p2 :: RuleT () Bool String t
}
deriving instance Eq (PD T)
deriving instance Show (PD T)
deriving instance Ord (PD T)
deriving instance Eq (PD NT)
deriving instance Show (PD NT)
deriving instance Ord (PD NT)
instance Predicated (PD NT) where
type PredErr (PD NT) = ()
type Pred (PD NT) = Bool
type PredTerm (PD NT) = PD T
liftTerminal (PD a b) = PD (liftTerminal a) (liftTerminal b)
reducePredicates oracle (PD a b) =
initP PD PD
|> (applyP reducePredicates oracle a)
|> (applyP reducePredicates oracle b)
|> resultP
getTerminals (PD as bs) = [ PD a b | a <- getTerminals as
, b <- getTerminals bs
]
getPredicates (PD a b) = concat
[ getPredicates a
, getPredicates b
]
Minimal complete definition
Associated Types
Error type
Predicate type
Terminal type
Methods
liftTerminal :: PredTerm a -> a Source #
Build a non terminal from a terminal
reducePredicates :: PredOracle (Pred a) -> a -> MatchResult (PredErr a) a (PredTerm a) Source #
Reduce predicates
getTerminals :: a -> [PredTerm a] Source #
Get possible resulting terminals
getPredicates :: a -> [Pred a] Source #
Get used predicates
Instances
| (Ord p, Eq e, Eq p) => Predicated (Constraint e p) Source # | |
Defined in Haskus.Utils.Solver Associated Types type PredErr (Constraint e p) :: * Source # type Pred (Constraint e p) :: * Source # type PredTerm (Constraint e p) :: * Source # Methods liftTerminal :: PredTerm (Constraint e p) -> Constraint e p Source # reducePredicates :: PredOracle (Pred (Constraint e p)) -> Constraint e p -> MatchResult (PredErr (Constraint e p)) (Constraint e p) (PredTerm (Constraint e p)) Source # getTerminals :: Constraint e p -> [PredTerm (Constraint e p)] Source # getPredicates :: Constraint e p -> [Pred (Constraint e p)] Source # | |
| (Ord p, Eq e, Eq a, Eq p) => Predicated (Rule e p a) Source # | |
Defined in Haskus.Utils.Solver Methods liftTerminal :: PredTerm (Rule e p a) -> Rule e p a Source # reducePredicates :: PredOracle (Pred (Rule e p a)) -> Rule e p a -> MatchResult (PredErr (Rule e p a)) (Rule e p a) (PredTerm (Rule e p a)) Source # getTerminals :: Rule e p a -> [PredTerm (Rule e p a)] Source # | |
createPredicateTable :: (Ord (Pred a), Eq (Pred a), Eq a, Predicated a, Predicated a, Pred a ~ Pred a) => a -> (PredOracle (Pred a) -> Bool) -> Bool -> Either (PredTerm a) [(PredOracle (Pred a), PredTerm a)] Source #
Create a table of predicates that return a terminal
initP :: nt -> t -> MatchResult e nt (nt, t) Source #
Initialise a reduction result (typically with two functions/constructors)
applyP :: Predicated ntb => MatchResult e (ntb -> nt) (ntb -> nt, PredTerm ntb -> t) -> MatchResult e ntb (PredTerm ntb) -> MatchResult e nt (nt, t) Source #
Compose reduction results
We reuse the MatchResult data type: * a "terminal" on the left can be used to build either a terminal or a non terminal * a "non terminal" on the left can only be used to build a non terminal
resultP :: MatchResult e nt (nt, t) -> MatchResult e nt t Source #
Fixup result (see initP and applyP)