Safe Haskell | None |
---|---|
Language | Haskell2010 |
Higher-order rewriting
- class Bind r where
- newtype VAR a = Var Name
- data LAM a = Lam Name a
- data APP a = App a a
- fresh :: (LAM :<: f, Functor f, Foldable f) => Term f -> Name
- mkLam :: (Rep r, VAR :<: PF r, LAM :<: PF r, Functor (PF r), Foldable (PF r)) => (VAR a -> Var r a) -> (Var r a -> r b) -> r (a -> b)
- app :: APP :<: f => Term (f :&: Set Name) -> Term (f :&: Set Name) -> Term (f :&: Set Name)
- type OneToOne a b = (Map a b, Map b a)
- oEmpty :: OneToOne a b
- oMember :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> Bool
- oMemberEither :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> Bool
- oLookupL :: Ord a => a -> OneToOne a b -> Maybe b
- oInsert :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> OneToOne a b
- getAnn :: Term (f :&: a) -> a
- type AlphaEnv = OneToOne Name Name
- matchM :: forall f a. (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Functor f, Foldable f, EqF f) => LHS f a -> Term (f :&: Set Name) -> ReaderT AlphaEnv (WriterT (Subst (f :&: Set Name)) Maybe) ()
- alphaEq :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => Term f -> Term f -> Bool
- solveTermAlpha :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => [Term (f :&: a)] -> Maybe (Term (f :&: a))
- solveSubstAlpha :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => Subst (f :&: a) -> Maybe (Subst (f :&: a))
- match :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Functor f, Foldable f, EqF f) => LHS f a -> Term (f :&: Set Name) -> Maybe (Subst (f :&: Set Name))
- annFreeVars :: (VAR :<: f, LAM :<: f, Functor f, Foldable f) => f (Term (f :&: Set Name)) -> Term (f :&: Set Name)
- substitute :: forall f g a. (VAR :<: f, LAM :<: f, Traversable f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> Subst g -> RHS f a -> Maybe (Term g)
- rewrite :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> Rule (LHS f) (RHS f) -> Term (f :&: Set Name) -> Maybe (Term (f :&: Set Name))
- applyFirst :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> [Rule (LHS f) (RHS f)] -> Term (f :&: Set Name) -> Term (f :&: Set Name)
- bottomUp :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> [Rule (LHS f) (RHS f)] -> Term f -> Term (f :&: Set Name)
Documentation
Representations supporting variable binding
Functor representing object variables
Functor representing lambda abstraction
Functor representing application
App a a |
mkLam :: (Rep r, VAR :<: PF r, LAM :<: PF r, Functor (PF r), Foldable (PF r)) => (VAR a -> Var r a) -> (Var r a -> r b) -> r (a -> b) Source
Generic lambda abstraction
app :: APP :<: f => Term (f :&: Set Name) -> Term (f :&: Set Name) -> Term (f :&: Set Name) Source
Application operator, to use as argument to functions like applyFirst
, bottomUp
, etc.
oMember :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> Bool Source
Test if a mapping is in a one-to-one map
oMemberEither :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> Bool Source
Test if either side of a mapping is in a one-to-one map
oInsert :: (Ord a, Ord b) => (a, b) -> OneToOne a b -> OneToOne a b Source
Insert a one-to-one mapping
matchM :: forall f a. (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Functor f, Foldable f, EqF f) => LHS f a -> Term (f :&: Set Name) -> ReaderT AlphaEnv (WriterT (Subst (f :&: Set Name)) Maybe) () Source
Higher-order matching. Results in a list of candidate mappings.
alphaEq :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => Term f -> Term f -> Bool Source
Alpha-equivalence
solveTermAlpha :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => [Term (f :&: a)] -> Maybe (Term (f :&: a)) Source
Check if all terms are alpha-equivalent, and if so, return one of them
solveSubstAlpha :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, EqF f) => Subst (f :&: a) -> Maybe (Subst (f :&: a)) Source
Turn a list of candidate mappings into a substitution. Succeeds iff. all mappings for the same variable are alpha-equivalent.
match :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Functor f, Foldable f, EqF f) => LHS f a -> Term (f :&: Set Name) -> Maybe (Subst (f :&: Set Name)) Source
Higher-order matching. Succeeds if the pattern matches and all occurrences of a given meta-variable are matched against equal terms.
annFreeVars :: (VAR :<: f, LAM :<: f, Functor f, Foldable f) => f (Term (f :&: Set Name)) -> Term (f :&: Set Name) Source
Annotate a node with its set of free variables
:: (VAR :<: f, LAM :<: f, Traversable f, g ~ (f :&: Set Name)) | |
=> (Term g -> Term g -> Term g) | Application operator |
-> Subst g | |
-> RHS f a | |
-> Maybe (Term g) |
Capture-avoiding substitution. Succeeds iff. each meta-variable in RHS
has a mapping in the
substitution.
:: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) | |
=> (Term g -> Term g -> Term g) | Application operator |
-> Rule (LHS f) (RHS f) | |
-> Term (f :&: Set Name) | |
-> Maybe (Term (f :&: Set Name)) |
Apply a rule. Succeeds iff. both matching and substitution succeeds.
:: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) | |
=> (Term g -> Term g -> Term g) | Application operator |
-> [Rule (LHS f) (RHS f)] | |
-> Term (f :&: Set Name) | |
-> Term (f :&: Set Name) |
Apply the first succeeding rule from a list of rules. If no rule succeeds the term is returned unchanged.