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)
- type Aliases = (Map Name Name, Name)
- initAliases :: Set Name -> Aliases
- rename :: Name -> Aliases -> (Name, Aliases)
- renameNaive :: Name -> Aliases -> (Name, Aliases)
- lookAlias :: Name -> Aliases -> Maybe Name
- substitute :: forall f g a. (VAR :<: f, LAM :<: f, VAR :<: PF (RHS f), LAM :<: PF (RHS 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), VAR :<: PF (RHS f), LAM :<: PF (RHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> Rule (LHS f) (RHS f) -> Term g -> Maybe (Term g)
- applyFirst :: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), VAR :<: PF (RHS f), LAM :<: PF (RHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) => (Term g -> Term g -> Term g) -> [Rule (LHS f) (RHS f)] -> Term g -> Term g
- prepare :: (VAR :<: f, LAM :<: f, Functor f, Foldable f) => Term f -> Term (f :&: Set Name)
- stripAnn :: Functor f => Term (f :&: a) -> Term f
- rewriteWith :: (VAR :<: f, LAM :<: f, Functor f, Foldable f, g ~ (f :&: Set Name)) => (Term g -> Term g) -> Term f -> Term f
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
initAliases :: Set Name -> Aliases Source
Set up an initial alias environment from a set of reserved names
renameNaive :: Name -> Aliases -> (Name, Aliases) Source
Naive renaming. Use instead of rename
to get naive substitution.
:: (VAR :<: f, LAM :<: f, VAR :<: PF (RHS f), LAM :<: PF (RHS 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.
Uses the "rapier" method described in "Secrets of the Glasgow Haskell Compiler inliner" (Peyton Jones and Marlow, JFP 2006) to rename variables where there's risk for capturing.
:: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), VAR :<: PF (RHS f), LAM :<: PF (RHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) | |
=> (Term g -> Term g -> Term g) | Application operator |
-> Rule (LHS f) (RHS f) | |
-> Term g | |
-> Maybe (Term g) |
Apply a rule. Succeeds iff. both matching and substitution succeeds.
:: (VAR :<: f, LAM :<: f, VAR :<: PF (LHS f), LAM :<: PF (LHS f), VAR :<: PF (RHS f), LAM :<: PF (RHS f), Traversable f, EqF f, g ~ (f :&: Set Name)) | |
=> (Term g -> Term g -> Term g) | Application operator |
-> [Rule (LHS f) (RHS f)] | |
-> Term g | |
-> Term g |
Apply the first succeeding rule from a list of rules. If no rule succeeds the term is returned unchanged.