Copyright | (c) Reed Mullanix 2019 |
---|---|
License | BSD-style |
Maintainer | reedmullanix@gmail.com |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- data TacticT jdg ext err s m a
- runTacticT :: MonadExtract ext m => TacticT jdg ext err s m () -> jdg -> s -> m [Either err (ext, [jdg])]
- (<@>) :: Functor m => TacticT jdg ext err s m a -> [TacticT jdg ext err s m a] -> TacticT jdg ext err s m a
- (<%>) :: TacticT jdg ext err s m a -> TacticT jdg ext err s m a -> TacticT jdg ext err s m a
- try :: Monad m => TacticT jdg ext err s m () -> TacticT jdg ext err s m ()
- many_ :: Monad m => TacticT jdg ext err s m () -> TacticT jdg ext err s m ()
- choice :: Monad m => [TacticT jdg ext err s m a] -> TacticT jdg ext err s m a
- progress :: Monad m => (jdg -> jdg -> Bool) -> err -> TacticT jdg ext err s m a -> TacticT jdg ext err s m a
- class MonadPlus m => MonadLogic (m :: Type -> Type) where
- goal :: Functor m => TacticT jdg ext err s m jdg
- focus :: Functor m => TacticT jdg ext err s m () -> Int -> TacticT jdg ext err s m () -> TacticT jdg ext err s m ()
- class Monad m => MonadExtract ext m | m -> ext where
- hole :: m ext
- class Monad m => MonadRule jdg ext m | m -> jdg, m -> ext where
- subgoal :: jdg -> m ext
- data RuleT jdg ext err s m a
- rule :: Monad m => (jdg -> RuleT jdg ext err s m ext) -> TacticT jdg ext err s m ()
Documentation
data TacticT jdg ext err s m a Source #
A
is a monad transformer that performs proof refinement.
The type variables signifiy:TacticT
jdg
- The goal type. This is the thing we are trying to construct a proof of.ext
- The extract type. This is what we will recieve after running the tactic.err
- The error type. We can usethrowError
to abort the computation with a provided errors
- The state type.m
- The base monad.a
- The return value. This to make
a monad, and will always beTacticT
'()'
Instances
Monad m => MonadState s (TacticT jdg ext err s m) Source # | |
MonadReader env m => MonadReader env (TacticT jdg ext err s m) Source # | |
Monad m => MonadError err (TacticT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal throwError :: err -> TacticT jdg ext err s m a # catchError :: TacticT jdg ext err s m a -> (err -> TacticT jdg ext err s m a) -> TacticT jdg ext err s m a # | |
MonadTrans (TacticT jdg ext err s) Source # | |
Defined in Refinery.Tactic.Internal | |
Functor m => Monad (TacticT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
Functor m => Functor (TacticT jdg ext err s m) Source # | |
Functor m => Applicative (TacticT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal pure :: a -> TacticT jdg ext err s m a # (<*>) :: TacticT jdg ext err s m (a -> b) -> TacticT jdg ext err s m a -> TacticT jdg ext err s m b # liftA2 :: (a -> b -> c) -> TacticT jdg ext err s m a -> TacticT jdg ext err s m b -> TacticT jdg ext err s m c # (*>) :: TacticT jdg ext err s m a -> TacticT jdg ext err s m b -> TacticT jdg ext err s m b # (<*) :: TacticT jdg ext err s m a -> TacticT jdg ext err s m b -> TacticT jdg ext err s m a # | |
MonadIO m => MonadIO (TacticT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
Monad m => Alternative (TacticT jdg ext err s m) Source # | |
Monad m => MonadPlus (TacticT jdg ext err s m) Source # | |
MonadThrow m => MonadThrow (TacticT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
MonadCatch m => MonadCatch (TacticT jdg ext err s m) Source # | |
(Monoid jdg, Show a, Show jdg, Show err, Show ext, Show (m (ProofStateT ext ext err s m (a, jdg)))) => Show (TacticT jdg ext err s m a) Source # | |
Generic (TacticT jdg ext err s m a) Source # | |
type Rep (TacticT jdg ext err s m a) Source # | |
Defined in Refinery.Tactic.Internal type Rep (TacticT jdg ext err s m a) = D1 (MetaData "TacticT" "Refinery.Tactic.Internal" "refinery-0.2.0.0-2c8JRgW6Bhs8bC5T1tIgRK" True) (C1 (MetaCons "TacticT" PrefixI True) (S1 (MetaSel (Just "unTacticT") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (StateT jdg (ProofStateT ext ext err s m) a)))) |
runTacticT :: MonadExtract ext m => TacticT jdg ext err s m () -> jdg -> s -> m [Either err (ext, [jdg])] Source #
Runs a tactic, producing a list of possible extracts, along with a list of unsolved subgoals.
Tactic Combinators
(<@>) :: Functor m => TacticT jdg ext err s m a -> [TacticT jdg ext err s m a] -> TacticT jdg ext err s m a Source #
(<%>) :: TacticT jdg ext err s m a -> TacticT jdg ext err s m a -> TacticT jdg ext err s m a infixr 3 Source #
try :: Monad m => TacticT jdg ext err s m () -> TacticT jdg ext err s m () Source #
Tries to run a tactic, backtracking on failure
many_ :: Monad m => TacticT jdg ext err s m () -> TacticT jdg ext err s m () Source #
Runs a tactic repeatedly until it fails
progress :: Monad m => (jdg -> jdg -> Bool) -> err -> TacticT jdg ext err s m a -> TacticT jdg ext err s m a Source #
class MonadPlus m => MonadLogic (m :: Type -> Type) where #
Minimal implementation: msplit
msplit :: m a -> m (Maybe (a, m a)) #
Attempts to split the computation, giving access to the first result. Satisfies the following laws:
msplit mzero == return Nothing msplit (return a `mplus` m) == return (Just (a, m))
interleave :: m a -> m a -> m a #
Fair disjunction. It is possible for a logical computation to have an infinite number of potential results, for instance:
odds = return 1 `mplus` liftM (2+) odds
Such computations can cause problems in some circumstances. Consider:
do x <- odds `mplus` return 2 if even x then return x else mzero
Such a computation may never consider the 'return 2', and will therefore never terminate. By contrast, interleave ensures fair consideration of both branches of a disjunction
(>>-) :: m a -> (a -> m b) -> m b infixl 1 #
Fair conjunction. Similarly to the previous function, consider the distributivity law for MonadPlus:
(mplus a b) >>= k = (a >>= k) `mplus` (b >>= k)
If 'a >>= k' can backtrack arbitrarily many tmes, (b >>= k) may never be considered. (>>-) takes similar care to consider both branches of a disjunctive computation.
ifte :: m a -> (a -> m b) -> m b -> m b #
Logical conditional. The equivalent of Prolog's soft-cut. If its first argument succeeds at all, then the results will be fed into the success branch. Otherwise, the failure branch is taken. satisfies the following laws:
ifte (return a) th el == th a ifte mzero th el == el ifte (return a `mplus` m) th el == th a `mplus` (m >>= th)
Pruning. Selects one result out of many. Useful for when multiple results of a computation will be equivalent, or should be treated as such.
Inverts a logic computation. If m
succeeds with at least one value,
lnot m
fails. If m
fails, then lnot m
succeeds the value ()
.
Instances
MonadLogic [] | |
Monad m => MonadLogic (LogicT m) | |
Defined in Control.Monad.Logic | |
MonadLogic m => MonadLogic (StateT s m) | See note on splitting above. |
Defined in Control.Monad.Logic.Class msplit :: StateT s m a -> StateT s m (Maybe (a, StateT s m a)) # interleave :: StateT s m a -> StateT s m a -> StateT s m a # (>>-) :: StateT s m a -> (a -> StateT s m b) -> StateT s m b # ifte :: StateT s m a -> (a -> StateT s m b) -> StateT s m b -> StateT s m b # | |
MonadLogic m => MonadLogic (StateT s m) | See note on splitting above. |
Defined in Control.Monad.Logic.Class msplit :: StateT s m a -> StateT s m (Maybe (a, StateT s m a)) # interleave :: StateT s m a -> StateT s m a -> StateT s m a # (>>-) :: StateT s m a -> (a -> StateT s m b) -> StateT s m b # ifte :: StateT s m a -> (a -> StateT s m b) -> StateT s m b -> StateT s m b # | |
MonadLogic m => MonadLogic (ReaderT e m) | Note that splitting a transformer does not allow you to provide different input to the monadic object returned. For instance, in: let Just (_, rm') = runReaderT (msplit rm) r in runReaderT rm' r'
|
Defined in Control.Monad.Logic.Class msplit :: ReaderT e m a -> ReaderT e m (Maybe (a, ReaderT e m a)) # interleave :: ReaderT e m a -> ReaderT e m a -> ReaderT e m a # (>>-) :: ReaderT e m a -> (a -> ReaderT e m b) -> ReaderT e m b # ifte :: ReaderT e m a -> (a -> ReaderT e m b) -> ReaderT e m b -> ReaderT e m b # |
Subgoal Manipulation
focus :: Functor m => TacticT jdg ext err s m () -> Int -> TacticT jdg ext err s m () -> TacticT jdg ext err s m () Source #
Tactic Creation
class Monad m => MonadExtract ext m | m -> ext where Source #
Nothing
Generates a "hole" of type ext
, which should represent
an incomplete extract.
hole :: (MonadTrans t, MonadExtract ext m1, m ~ t m1) => m ext Source #
Generates a "hole" of type ext
, which should represent
an incomplete extract.
Instances
MonadExtract ext m => MonadExtract ext (ExceptT err m) Source # | |
Defined in Refinery.ProofState | |
(MonadExtract ext m, Monoid w) => MonadExtract ext (WriterT w m) Source # | |
Defined in Refinery.ProofState | |
(MonadExtract ext m, Monoid w) => MonadExtract ext (WriterT w m) Source # | |
Defined in Refinery.ProofState | |
MonadExtract ext m => MonadExtract ext (StateT s m) Source # | |
Defined in Refinery.ProofState | |
MonadExtract ext m => MonadExtract ext (ReaderT r m) Source # | |
Defined in Refinery.ProofState |
class Monad m => MonadRule jdg ext m | m -> jdg, m -> ext where Source #
Nothing
subgoal :: jdg -> m ext Source #
Create a subgoal, and return the resulting extract.
subgoal :: (MonadTrans t, MonadRule jdg ext m1, m ~ t m1) => jdg -> m ext Source #
Create a subgoal, and return the resulting extract.
Instances
MonadRule jdg ext m => MonadRule jdg ext (ExceptT env m) Source # | |
Defined in Refinery.Tactic.Internal | |
MonadRule jdg ext m => MonadRule jdg ext (StateT env m) Source # | |
Defined in Refinery.Tactic.Internal | |
MonadRule jdg ext m => MonadRule jdg ext (ReaderT env m) Source # | |
Defined in Refinery.Tactic.Internal | |
Monad m => MonadRule jdg ext (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal |
data RuleT jdg ext err s m a Source #
A
is a monad transformer for creating inference rules.RuleT
Instances
Monad m => MonadRule jdg ext (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
Monad m => MonadState s (RuleT jdg ext err s m) Source # | |
MonadReader r m => MonadReader r (RuleT jdg ext err s m) Source # | |
Monad m => MonadError err (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal throwError :: err -> RuleT jdg ext err s m a # catchError :: RuleT jdg ext err s m a -> (err -> RuleT jdg ext err s m a) -> RuleT jdg ext err s m a # | |
MFunctor (RuleT jdg ext err s :: (Type -> Type) -> Type -> Type) Source # | |
MonadTrans (RuleT jdg ext err s) Source # | |
Defined in Refinery.Tactic.Internal | |
Monad m => Monad (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
Functor m => Functor (RuleT jdg ext err s m) Source # | |
Monad m => Applicative (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal pure :: a -> RuleT jdg ext err s m a # (<*>) :: RuleT jdg ext err s m (a -> b) -> RuleT jdg ext err s m a -> RuleT jdg ext err s m b # liftA2 :: (a -> b -> c) -> RuleT jdg ext err s m a -> RuleT jdg ext err s m b -> RuleT jdg ext err s m c # (*>) :: RuleT jdg ext err s m a -> RuleT jdg ext err s m b -> RuleT jdg ext err s m b # (<*) :: RuleT jdg ext err s m a -> RuleT jdg ext err s m b -> RuleT jdg ext err s m a # | |
MonadIO m => MonadIO (RuleT jdg ext err s m) Source # | |
Defined in Refinery.Tactic.Internal | |
(Show jdg, Show err, Show a, Show (m (ProofStateT ext a err s m jdg))) => Show (RuleT jdg ext err s m a) Source # | |
Generic (RuleT jdg ext err s m a) Source # | |
type Rep (RuleT jdg ext err s m a) Source # | |
Defined in Refinery.Tactic.Internal type Rep (RuleT jdg ext err s m a) = D1 (MetaData "RuleT" "Refinery.Tactic.Internal" "refinery-0.2.0.0-2c8JRgW6Bhs8bC5T1tIgRK" True) (C1 (MetaCons "RuleT" PrefixI True) (S1 (MetaSel (Just "unRuleT") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (ProofStateT ext a err s m jdg)))) |