{-# LANGUAGE NondecreasingIndentation #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Agda.Interaction.BasicOps where
import Prelude hiding (null)
import Control.Arrow ( first )
import Control.Monad ( (<=<), (>=>), forM, filterM, guard )
import Control.Monad.Except
import Control.Monad.State
import Control.Monad.Identity
import Control.Monad.Trans.Maybe
import qualified Data.Map as Map
import qualified Data.IntMap as IntMap
import qualified Data.Map.Strict as MapS
import qualified Data.Set as Set
import qualified Data.List as List
import Data.Maybe
import Data.Monoid
import Data.Function (on)
import Data.Text (Text)
import qualified Data.Text as T
import Agda.Interaction.Base
import Agda.Interaction.Options
import Agda.Interaction.Response (Goals, ResponseContextEntry(..))
import qualified Agda.Syntax.Concrete as C
import Agda.Syntax.Position
import Agda.Syntax.Abstract as A hiding (Open, Apply, Assign)
import Agda.Syntax.Abstract.Views as A
import Agda.Syntax.Abstract.Pretty
import Agda.Syntax.Common
import Agda.Syntax.Info (MetaInfo(..),emptyMetaInfo,exprNoRange,defaultAppInfo_,defaultAppInfo)
import qualified Agda.Syntax.Info as Info
import Agda.Syntax.Internal as I
import Agda.Syntax.Literal
import Agda.Syntax.Translation.InternalToAbstract
import Agda.Syntax.Translation.AbstractToConcrete
import Agda.Syntax.Translation.ConcreteToAbstract
import Agda.Syntax.Scope.Base
import Agda.Syntax.Scope.Monad
import Agda.Syntax.Fixity(Precedence(..), argumentCtx_)
import Agda.Syntax.Parser
import Agda.TheTypeChecker
import Agda.TypeChecking.Constraints
import Agda.TypeChecking.Conversion
import Agda.TypeChecking.Errors ( getAllWarnings, stringTCErr, Verbalize(..) )
import Agda.TypeChecking.Monad as M hiding (MetaInfo)
import Agda.TypeChecking.MetaVars
import Agda.TypeChecking.MetaVars.Mention
import Agda.TypeChecking.Reduce
import Agda.TypeChecking.Substitute
import Agda.TypeChecking.Telescope
import Agda.TypeChecking.With
import Agda.TypeChecking.Coverage
import Agda.TypeChecking.Coverage.Match ( SplitPattern )
import Agda.TypeChecking.Records
import Agda.TypeChecking.Pretty ( PrettyTCM, prettyTCM )
import Agda.TypeChecking.Pretty.Constraint (prettyRangeConstraint)
import Agda.TypeChecking.IApplyConfluence
import Agda.TypeChecking.Primitive
import Agda.TypeChecking.ProjectionLike (reduceProjectionLike)
import Agda.TypeChecking.Names
import Agda.TypeChecking.Free
import Agda.TypeChecking.CheckInternal
import Agda.TypeChecking.SizedTypes.Solve
import qualified Agda.TypeChecking.Pretty as TP
import Agda.TypeChecking.Warnings
( runPM, warning, WhichWarnings(..), classifyWarnings, isMetaTCWarning
, WarningsAndNonFatalErrors, emptyWarningsAndNonFatalErrors )
import Agda.Termination.TermCheck (termMutual)
import Agda.Utils.Function (applyWhen)
import Agda.Utils.Functor
import Agda.Utils.Lens
import Agda.Utils.List
import Agda.Utils.List1 (List1, pattern (:|))
import qualified Agda.Utils.List1 as List1
import Agda.Utils.Maybe
import Agda.Utils.Monad
import Agda.Utils.Null
import Agda.Syntax.Common.Pretty as P
import Agda.Utils.Permutation
import Agda.Utils.Size
import Agda.Utils.String
import Agda.Utils.WithDefault ( WithDefault'(Value) )
import Agda.Utils.Impossible
parseExpr :: Range -> String -> TCM C.Expr
parseExpr :: Range -> ArgName -> TCM Expr
parseExpr Range
rng ArgName
s = do
(C.ExprWhere Expr
e WhereClause
wh, Attributes
attrs) <-
PM (ExprWhere, Attributes) -> TCM (ExprWhere, Attributes)
forall a. PM a -> TCM a
runPM (PM (ExprWhere, Attributes) -> TCM (ExprWhere, Attributes))
-> PM (ExprWhere, Attributes) -> TCM (ExprWhere, Attributes)
forall a b. (a -> b) -> a -> b
$ Parser ExprWhere
-> Position -> ArgName -> PM (ExprWhere, Attributes)
forall a. Parser a -> Position -> ArgName -> PM (a, Attributes)
parsePosString Parser ExprWhere
exprWhereParser Position
pos ArgName
s
Attributes -> ScopeM ()
checkAttributes Attributes
attrs
Bool -> ScopeM () -> ScopeM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (WhereClause -> Bool
forall a. Null a => a -> Bool
null WhereClause
wh) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TypeError -> ScopeM ()
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> ScopeM ()) -> TypeError -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ ArgName -> TypeError
GenericError (ArgName -> TypeError) -> ArgName -> TypeError
forall a b. (a -> b) -> a -> b
$
ArgName
"where clauses are not supported in holes"
Expr -> TCM Expr
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
e
where pos :: Position
pos = Position -> Maybe Position -> Position
forall a. a -> Maybe a -> a
fromMaybe (Maybe RangeFile -> Position
startPos Maybe RangeFile
forall a. Maybe a
Nothing) (Maybe Position -> Position) -> Maybe Position -> Position
forall a b. (a -> b) -> a -> b
$ Range -> Maybe Position
forall a. Range' a -> Maybe (Position' a)
rStart Range
rng
parseExprIn :: InteractionId -> Range -> String -> TCM Expr
parseExprIn :: InteractionId -> Range -> ArgName -> TCM Expr
parseExprIn InteractionId
ii Range
rng ArgName
s = do
MetaId
mId <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
MetaId -> Range -> ScopeM ()
forall (m :: * -> *). MonadMetaSolver m => MetaId -> Range -> m ()
updateMetaVarRange MetaId
mId Range
rng
Closure Range
mi <- MetaVariable -> Closure Range
getMetaInfo (MetaVariable -> Closure Range)
-> TCMT IO MetaVariable -> TCMT IO (Closure Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mId
Expr
e <- Range -> ArgName -> TCM Expr
parseExpr Range
rng ArgName
s
Closure Range -> TCM Expr -> TCM Expr
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo Closure Range
mi (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$
ScopeInfo -> Expr -> ScopeM (AbsOfCon Expr)
forall c. ToAbstract c => ScopeInfo -> c -> ScopeM (AbsOfCon c)
concreteToAbstract (Closure Range -> ScopeInfo
forall a. Closure a -> ScopeInfo
clScope Closure Range
mi) Expr
e
giveExpr :: UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM Term
giveExpr :: UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM Term
giveExpr UseForce
force Maybe InteractionId
mii MetaId
mi Expr
e = do
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
let t :: Type
t = case MetaVariable -> Judgement MetaId
mvJudgement MetaVariable
mv of
IsSort{} -> Type
forall a. HasCallStack => a
__IMPOSSIBLE__
HasType MetaId
_ Comparison
_ Type
t -> Type
t
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$
TCMT IO Doc
"give: meta type =" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Type -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Type -> m Doc
prettyTCM Type
t
Args
ctx <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
Type
t' <- Type
t Type -> Args -> TCMT IO Type
forall a (m :: * -> *).
(PiApplyM a, MonadReduce m, HasBuiltins m) =>
Type -> a -> m Type
forall (m :: * -> *).
(MonadReduce m, HasBuiltins m) =>
Type -> Args -> m Type
`piApplyM` Permutation -> Args -> Args
forall a. Permutation -> [a] -> [a]
permute (Int -> Permutation -> Permutation
takeP (Args -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Args
ctx) (Permutation -> Permutation) -> Permutation -> Permutation
forall a b. (a -> b) -> a -> b
$ MetaVariable -> Permutation
mvPermutation MetaVariable
mv) Args
ctx
Call -> TCM Term -> TCM Term
forall a. Call -> TCMT IO a -> TCMT IO a
forall (m :: * -> *) a. MonadTrace m => Call -> m a -> m a
traceCall (Comparison -> Expr -> Type -> Call
CheckExprCall Comparison
CmpLeq Expr
e Type
t') (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ do
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ do
AbstractMode
a <- (TCEnv -> AbstractMode) -> TCMT IO AbstractMode
forall (m :: * -> *) a. MonadTCEnv m => (TCEnv -> a) -> m a
asksTC TCEnv -> AbstractMode
envAbstractMode
[TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.hsep
[ ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName
"give(" ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ AbstractMode -> ArgName
forall a. Show a => a -> ArgName
show AbstractMode
a ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
"): instantiated meta type =")
, Type -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Type -> m Doc
prettyTCM Type
t'
]
Term
v <- Lens' TCEnv (Maybe MutualId)
-> (Maybe MutualId -> Maybe MutualId) -> TCM Term -> TCM Term
forall (m :: * -> *) a b.
MonadTCEnv m =>
Lens' TCEnv a -> (a -> a) -> m b -> m b
locallyTC (Maybe MutualId -> f (Maybe MutualId)) -> TCEnv -> f TCEnv
Lens' TCEnv (Maybe MutualId)
eMutualBlock (Maybe MutualId -> Maybe MutualId -> Maybe MutualId
forall a b. a -> b -> a
const Maybe MutualId
forall a. Maybe a
Nothing) (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$
Expr -> Type -> TCM Term
checkExpr Expr
e Type
t'
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
40 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"give: checked expression:" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Doc -> TCMT IO Doc
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Term -> Doc
forall a. Pretty a => a -> Doc
pretty Term
v)
case MetaVariable -> MetaInstantiation
mvInstantiation MetaVariable
mv of
InstV{} -> TCMT IO Bool -> ScopeM () -> ScopeM ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM ((Relevance
Irrelevant Relevance -> Relevance -> Bool
forall a. Eq a => a -> a -> Bool
==) (Relevance -> Bool) -> TCMT IO Relevance -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lens' TCEnv Relevance -> TCMT IO Relevance
forall (m :: * -> *) a. MonadTCEnv m => Lens' TCEnv a -> m a
viewTC (Relevance -> f Relevance) -> TCEnv -> f TCEnv
Lens' TCEnv Relevance
eRelevance) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ do
Term
v' <- Term -> TCM Term
forall a (m :: * -> *). (Instantiate a, MonadReduce m) => a -> m a
instantiate (Term -> TCM Term) -> Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ MetaId -> Elims -> Term
MetaV MetaId
mi (Elims -> Term) -> Elims -> Term
forall a b. (a -> b) -> a -> b
$ (Arg Term -> Elim' Term) -> Args -> Elims
forall a b. (a -> b) -> [a] -> [b]
map Arg Term -> Elim' Term
forall a. Arg a -> Elim' a
Apply Args
ctx
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.sep
[ TCMT IO Doc
"meta was already set to value v' = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Term -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Term -> m Doc
prettyTCM Term
v'
, TCMT IO Doc
"now comparing it to given value v = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Term -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Term -> m Doc
prettyTCM Term
v
, TCMT IO Doc
"in context " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Args -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Args -> m Doc
prettyTCM Args
ctx)
]
Type -> Term -> Term -> ScopeM ()
forall (m :: * -> *).
MonadConversion m =>
Type -> Term -> Term -> m ()
equalTerm Type
t' Term
v Term
v'
MetaInstantiation
_ -> do
ArgName -> Int -> ArgName -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> ArgName -> m ()
reportSLn ArgName
"interaction.give" Int
20 ArgName
"give: meta unassigned, assigning..."
Args
args <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
ScopeM () -> ScopeM ()
forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
nowSolvingConstraints (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ CompareDirection
-> MetaId -> Args -> Term -> CompareAs -> ScopeM ()
assign CompareDirection
DirEq MetaId
mi Args
args Term
v (Type -> CompareAs
AsTermsOf Type
t')
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"give: meta variable updated!"
Bool -> ScopeM () -> ScopeM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (UseForce
force UseForce -> UseForce -> Bool
forall a. Eq a => a -> a -> Bool
== UseForce
WithForce) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ Maybe InteractionId -> ScopeM ()
redoChecks Maybe InteractionId
mii
MetaId -> ScopeM ()
forall (m :: * -> *). MonadMetaSolver m => MetaId -> m ()
wakeupConstraints MetaId
mi
DefaultToInfty -> ScopeM ()
solveSizeConstraints DefaultToInfty
DontDefaultToInfty
Bool
cubical <- Maybe Cubical -> Bool
forall a. Maybe a -> Bool
isJust (Maybe Cubical -> Bool)
-> (PragmaOptions -> Maybe Cubical) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> Maybe Cubical
optCubical (PragmaOptions -> Bool) -> TCMT IO PragmaOptions -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
Bool -> ScopeM () -> ScopeM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Bool
cubical Bool -> Bool -> Bool
|| UseForce
force UseForce -> UseForce -> Bool
forall a. Eq a => a -> a -> Bool
== UseForce
WithForce) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ do
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"give: double checking"
Term
vfull <- Term -> TCM Term
forall a (m :: * -> *).
(InstantiateFull a, MonadReduce m) =>
a -> m a
instantiateFull Term
v
Term -> Comparison -> TypeOf Term -> ScopeM ()
forall a (m :: * -> *).
(CheckInternal a, MonadCheckInternal m) =>
a -> Comparison -> TypeOf a -> m ()
forall (m :: * -> *).
MonadCheckInternal m =>
Term -> Comparison -> TypeOf Term -> m ()
checkInternal Term
vfull Comparison
CmpLeq TypeOf Term
Type
t'
Term -> TCM Term
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Term
v
redoChecks :: Maybe InteractionId -> TCM ()
redoChecks :: Maybe InteractionId -> ScopeM ()
redoChecks Maybe InteractionId
Nothing = () -> ScopeM ()
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
redoChecks (Just InteractionId
ii) = do
ArgName -> Int -> ArgName -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> ArgName -> m ()
reportSLn ArgName
"interaction.give" Int
20 (ArgName -> ScopeM ()) -> ArgName -> ScopeM ()
forall a b. (a -> b) -> a -> b
$
ArgName
"give: redoing termination check for function surrounding " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ InteractionId -> ArgName
forall a. Show a => a -> ArgName
show InteractionId
ii
InteractionPoint
ip <- InteractionId -> TCMT IO InteractionPoint
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m) =>
InteractionId -> m InteractionPoint
lookupInteractionPoint InteractionId
ii
case InteractionPoint -> IPClause
ipClause InteractionPoint
ip of
IPClause
IPNoClause -> () -> ScopeM ()
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
IPClause{ipcQName :: IPClause -> QName
ipcQName = QName
f} -> do
MutualId
mb <- QName -> TCM MutualId
mutualBlockOf QName
f
Result
terErrs <- (TCEnv -> TCEnv) -> TCMT IO Result -> TCMT IO Result
forall a. (TCEnv -> TCEnv) -> TCMT IO a -> TCMT IO a
forall (m :: * -> *) a.
MonadTCEnv m =>
(TCEnv -> TCEnv) -> m a -> m a
localTC (\ TCEnv
e -> TCEnv
e { envMutualBlock = Just mb }) (TCMT IO Result -> TCMT IO Result)
-> TCMT IO Result -> TCMT IO Result
forall a b. (a -> b) -> a -> b
$ [QName] -> TCMT IO Result
termMutual []
Bool -> ScopeM () -> ScopeM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Result -> Bool
forall a. Null a => a -> Bool
null Result
terErrs) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ Warning -> ScopeM ()
forall (m :: * -> *).
(HasCallStack, MonadWarning m) =>
Warning -> m ()
warning (Warning -> ScopeM ()) -> Warning -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ Result -> Warning
TerminationIssue Result
terErrs
give
:: UseForce
-> InteractionId
-> Maybe Range
-> Expr
-> TCM Expr
give :: UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
give UseForce
force InteractionId
ii Maybe Range
mr Expr
e = TCM Expr -> TCM Expr
forall a. TCM a -> TCM a
forall (tcm :: * -> *) a. MonadTCM tcm => TCM a -> tcm a
liftTCM (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ do
MetaId
mi <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
Maybe Range -> (Range -> ScopeM ()) -> ScopeM ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust Maybe Range
mr ((Range -> ScopeM ()) -> ScopeM ())
-> (Range -> ScopeM ()) -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ MetaId -> Range -> ScopeM ()
forall (m :: * -> *). MonadMetaSolver m => MetaId -> Range -> m ()
updateMetaVarRange MetaId
mi
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"giving expression" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
e
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
50 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName -> TCMT IO Doc) -> ArgName -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Expr -> ArgName
forall a. Show a => a -> ArgName
show (Expr -> ArgName) -> Expr -> ArgName
forall a b. (a -> b) -> a -> b
$ Expr -> Expr
forall a. ExprLike a => a -> a
deepUnscope Expr
e
Term
_ <- InteractionId -> TCM Term -> TCM Term
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ do
MetaId -> RunMetaOccursCheck -> ScopeM ()
forall (m :: * -> *).
MonadMetaSolver m =>
MetaId -> RunMetaOccursCheck -> m ()
setMetaOccursCheck MetaId
mi RunMetaOccursCheck
DontRunMetaOccursCheck
UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM Term
giveExpr UseForce
force (InteractionId -> Maybe InteractionId
forall a. a -> Maybe a
Just InteractionId
ii) MetaId
mi Expr
e
TCM Term -> (TCErr -> TCM Term) -> TCM Term
forall a. TCMT IO a -> (TCErr -> TCMT IO a) -> TCMT IO a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \ case
PatternErr{} -> TypeError -> TCM Term
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCM Term) -> (Doc -> TypeError) -> Doc -> TCM Term
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> TypeError
GenericDocError (Doc -> TCM Term) -> TCMT IO Doc -> TCM Term
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< do
InteractionId -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"Failed to give" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
e
TCErr
err -> TCErr -> TCM Term
forall a. TCErr -> TCMT IO a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError TCErr
err
InteractionId -> ScopeM ()
forall (m :: * -> *).
MonadInteractionPoints m =>
InteractionId -> m ()
removeInteractionPoint InteractionId
ii
Expr -> TCM Expr
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
e
elaborate_give
:: Rewrite
-> UseForce
-> InteractionId
-> Maybe Range
-> Expr
-> TCM Expr
elaborate_give :: Rewrite
-> UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
elaborate_give Rewrite
norm UseForce
force InteractionId
ii Maybe Range
mr Expr
e = InteractionId -> TCM Expr -> TCM Expr
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ do
MetaId
mi <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
Maybe Range -> (Range -> ScopeM ()) -> ScopeM ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust Maybe Range
mr ((Range -> ScopeM ()) -> ScopeM ())
-> (Range -> ScopeM ()) -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ MetaId -> Range -> ScopeM ()
forall (m :: * -> *). MonadMetaSolver m => MetaId -> Range -> m ()
updateMetaVarRange MetaId
mi
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"giving expression" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
e
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
50 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName -> TCMT IO Doc) -> ArgName -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Expr -> ArgName
forall a. Show a => a -> ArgName
show (Expr -> ArgName) -> Expr -> ArgName
forall a b. (a -> b) -> a -> b
$ Expr -> Expr
forall a. ExprLike a => a -> a
deepUnscope Expr
e
Term
v <- InteractionId -> TCM Term -> TCM Term
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ do
MetaId -> RunMetaOccursCheck -> ScopeM ()
forall (m :: * -> *).
MonadMetaSolver m =>
MetaId -> RunMetaOccursCheck -> m ()
setMetaOccursCheck MetaId
mi RunMetaOccursCheck
DontRunMetaOccursCheck
Lens' TCEnv Bool -> (Bool -> Bool) -> TCM Term -> TCM Term
forall (m :: * -> *) a b.
MonadTCEnv m =>
Lens' TCEnv a -> (a -> a) -> m b -> m b
locallyTC (Bool -> f Bool) -> TCEnv -> f TCEnv
Lens' TCEnv Bool
eCurrentlyElaborating (Bool -> Bool -> Bool
forall a b. a -> b -> a
const Bool
True) (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$
UseForce -> Maybe InteractionId -> MetaId -> Expr -> TCM Term
giveExpr UseForce
force (InteractionId -> Maybe InteractionId
forall a. a -> Maybe a
Just InteractionId
ii) MetaId
mi Expr
e
TCM Term -> (TCErr -> TCM Term) -> TCM Term
forall a. TCMT IO a -> (TCErr -> TCMT IO a) -> TCMT IO a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \ case
PatternErr{} -> TypeError -> TCM Term
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCM Term) -> (Doc -> TypeError) -> Doc -> TCM Term
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> TypeError
GenericDocError (Doc -> TCM Term) -> TCMT IO Doc -> TCM Term
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< do
InteractionId -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"Failed to give" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
e
TCErr
err -> TCErr -> TCM Term
forall a. TCErr -> TCMT IO a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError TCErr
err
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
Term
nv <- Term -> TCM Term
forall (m :: * -> *). PureTCM m => Term -> m Term
reduceProjectionLike (Term -> TCM Term) -> TCM Term -> TCM Term
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Term -> TCM Term
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Term
v
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.give" Int
40 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"nv = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Doc -> TCMT IO Doc
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Term -> Doc
forall a. Pretty a => a -> Doc
pretty Term
v)
Lens' TCEnv Bool -> (Bool -> Bool) -> TCM Expr -> TCM Expr
forall (m :: * -> *) a b.
MonadTCEnv m =>
Lens' TCEnv a -> (a -> a) -> m b -> m b
locallyTC (Bool -> f Bool) -> TCEnv -> f TCEnv
Lens' TCEnv Bool
ePrintMetasBare (Bool -> Bool -> Bool
forall a b. a -> b -> a
const Bool
True) (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ Term -> TCMT IO (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
nv
refine
:: UseForce
-> InteractionId
-> Maybe Range
-> Expr
-> TCM Expr
refine :: UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
refine UseForce
force InteractionId
ii Maybe Range
mr Expr
e = do
MetaId
mi <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
let range :: Range
range = Range -> Maybe Range -> Range
forall a. a -> Maybe a -> a
fromMaybe (MetaVariable -> Range
forall a. HasRange a => a -> Range
getRange MetaVariable
mv) Maybe Range
mr
scope :: ScopeInfo
scope = MetaVariable -> ScopeInfo
M.getMetaScope MetaVariable
mv
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.refine" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$
TCMT IO Doc
"refining with expression" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
e
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.refine" Int
50 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$
ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName -> TCMT IO Doc) -> ArgName -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Expr -> ArgName
forall a. Show a => a -> ArgName
show (Expr -> ArgName) -> Expr -> ArgName
forall a b. (a -> b) -> a -> b
$ Expr -> Expr
forall a. ExprLike a => a -> a
deepUnscope Expr
e
Int -> Range -> ScopeInfo -> Expr -> TCM Expr
tryRefine Int
10 Range
range ScopeInfo
scope Expr
e
where
tryRefine :: Int -> Range -> ScopeInfo -> Expr -> TCM Expr
tryRefine :: Int -> Range -> ScopeInfo -> Expr -> TCM Expr
tryRefine Int
nrOfMetas Range
r ScopeInfo
scope = Int -> Maybe TCErr -> Expr -> TCM Expr
try Int
nrOfMetas Maybe TCErr
forall a. Maybe a
Nothing
where
try :: Int -> Maybe TCErr -> Expr -> TCM Expr
try :: Int -> Maybe TCErr -> Expr -> TCM Expr
try Int
0 Maybe TCErr
err Expr
e = TCErr -> TCM Expr
forall a. TCErr -> TCMT IO a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (TCErr -> TCM Expr) -> (ArgName -> TCErr) -> ArgName -> TCM Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArgName -> TCErr
stringTCErr (ArgName -> TCM Expr) -> ArgName -> TCM Expr
forall a b. (a -> b) -> a -> b
$ case Maybe TCErr
err of
Just (TypeError CallStack
_ TCState
_ Closure TypeError
cl) | UnequalTerms Comparison
_ I.Pi{} Term
_ CompareAs
_ <- Closure TypeError -> TypeError
forall a. Closure a -> a
clValue Closure TypeError
cl ->
ArgName
"Cannot refine functions with 10 or more arguments"
Maybe TCErr
_ ->
ArgName
"Cannot refine"
try Int
n Maybe TCErr
_ Expr
e = UseForce -> InteractionId -> Maybe Range -> Expr -> TCM Expr
give UseForce
force InteractionId
ii (Range -> Maybe Range
forall a. a -> Maybe a
Just Range
r) Expr
e TCM Expr -> (TCErr -> TCM Expr) -> TCM Expr
forall a. TCMT IO a -> (TCErr -> TCMT IO a) -> TCMT IO a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \TCErr
err -> Int -> Maybe TCErr -> Expr -> TCM Expr
try (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (TCErr -> Maybe TCErr
forall a. a -> Maybe a
Just TCErr
err) (Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Expr -> TCM Expr
appMeta Expr
e
appMeta :: Expr -> TCM Expr
appMeta :: Expr -> TCM Expr
appMeta Expr
e = do
let rng :: Range
rng = Range -> Range
rightMargin Range
r
InteractionId
ii <- Bool -> Range -> Maybe Int -> TCMT IO InteractionId
forall (m :: * -> *).
MonadInteractionPoints m =>
Bool -> Range -> Maybe Int -> m InteractionId
registerInteractionPoint Bool
False Range
rng Maybe Int
forall a. Maybe a
Nothing
let info :: MetaInfo
info = Info.MetaInfo
{ metaRange :: Range
Info.metaRange = Range
rng
, metaScope :: ScopeInfo
Info.metaScope = Lens' ScopeInfo [Precedence] -> LensSet ScopeInfo [Precedence]
forall o i. Lens' o i -> LensSet o i
set ([Precedence] -> f [Precedence]) -> ScopeInfo -> f ScopeInfo
Lens' ScopeInfo [Precedence]
scopePrecedence [Precedence
argumentCtx_] ScopeInfo
scope
, metaNumber :: Maybe MetaId
metaNumber = Maybe MetaId
forall a. Maybe a
Nothing
, metaNameSuggestion :: ArgName
metaNameSuggestion = ArgName
""
}
metaVar :: Expr
metaVar = MetaInfo -> InteractionId -> Expr
QuestionMark MetaInfo
info InteractionId
ii
count :: Name -> a -> a
count Name
x a
e = Sum a -> a
forall a. Sum a -> a
getSum (Sum a -> a) -> Sum a -> a
forall a b. (a -> b) -> a -> b
$ (Expr -> Sum a) -> a -> Sum a
forall m. FoldExprFn m a
forall a m. ExprLike a => FoldExprFn m a
foldExpr Expr -> Sum a
isX a
e
where isX :: Expr -> Sum a
isX (A.Var Name
y) | Name
x Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
y = a -> Sum a
forall a. a -> Sum a
Sum a
1
isX Expr
_ = Sum a
forall a. Monoid a => a
mempty
lamView :: Expr -> Maybe (Binder, Expr)
lamView (A.Lam ExprInfo
_ (DomainFree TacticAttr
_ NamedArg Binder
x) Expr
e) = (Binder, Expr) -> Maybe (Binder, Expr)
forall a. a -> Maybe a
Just (NamedArg Binder -> Binder
forall a. NamedArg a -> a
namedArg NamedArg Binder
x, Expr
e)
lamView (A.Lam ExprInfo
i (DomainFull (TBind Range
r TypedBindingInfo
t (NamedArg Binder
x :| [NamedArg Binder]
xs) Expr
a)) Expr
e) =
[NamedArg Binder]
-> Maybe (Binder, Expr)
-> (NonEmpty (NamedArg Binder) -> Maybe (Binder, Expr))
-> Maybe (Binder, Expr)
forall a b. [a] -> b -> (List1 a -> b) -> b
List1.ifNull [NamedArg Binder]
xs ((Binder, Expr) -> Maybe (Binder, Expr)
forall a. a -> Maybe a
Just (NamedArg Binder -> Binder
forall a. NamedArg a -> a
namedArg NamedArg Binder
x, Expr
e)) ((NonEmpty (NamedArg Binder) -> Maybe (Binder, Expr))
-> Maybe (Binder, Expr))
-> (NonEmpty (NamedArg Binder) -> Maybe (Binder, Expr))
-> Maybe (Binder, Expr)
forall a b. (a -> b) -> a -> b
$ \ NonEmpty (NamedArg Binder)
xs ->
(Binder, Expr) -> Maybe (Binder, Expr)
forall a. a -> Maybe a
Just (NamedArg Binder -> Binder
forall a. NamedArg a -> a
namedArg NamedArg Binder
x, ExprInfo -> LamBinding -> Expr -> Expr
A.Lam ExprInfo
i (TypedBinding -> LamBinding
DomainFull (TypedBinding -> LamBinding) -> TypedBinding -> LamBinding
forall a b. (a -> b) -> a -> b
$ Range
-> TypedBindingInfo
-> NonEmpty (NamedArg Binder)
-> Expr
-> TypedBinding
TBind Range
r TypedBindingInfo
t NonEmpty (NamedArg Binder)
xs Expr
a) Expr
e)
lamView Expr
_ = Maybe (Binder, Expr)
forall a. Maybe a
Nothing
smartApp :: AppInfo -> Expr -> NamedArg Expr -> Expr
smartApp AppInfo
i Expr
e NamedArg Expr
arg =
case ((Binder, Expr) -> (BindName, Expr))
-> Maybe (Binder, Expr) -> Maybe (BindName, Expr)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Binder -> BindName) -> (Binder, Expr) -> (BindName, Expr)
forall b c d. (b -> c) -> (b, d) -> (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Binder -> BindName
forall a. Binder' a -> a
A.binderName) (Expr -> Maybe (Binder, Expr)
lamView (Expr -> Maybe (Binder, Expr)) -> Expr -> Maybe (Binder, Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr
unScope Expr
e) of
Just (A.BindName{unBind :: BindName -> Name
unBind = Name
x}, Expr
e) | Name -> Expr -> Integer
forall {a} {a}. (Num a, ExprLike a) => Name -> a -> a
count Name
x Expr
e Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
2 -> (Expr -> Expr) -> Expr -> Expr
forall a. ExprLike a => (Expr -> Expr) -> a -> a
mapExpr Expr -> Expr
subX Expr
e
where subX :: Expr -> Expr
subX (A.Var Name
y) | Name
x Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
y = NamedArg Expr -> Expr
forall a. NamedArg a -> a
namedArg NamedArg Expr
arg
subX Expr
e = Expr
e
Maybe (BindName, Expr)
_ -> AppInfo -> Expr -> NamedArg Expr -> Expr
App AppInfo
i Expr
e NamedArg Expr
arg
Expr -> TCM Expr
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr -> TCM Expr) -> Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ AppInfo -> Expr -> NamedArg Expr -> Expr
smartApp (Range -> AppInfo
defaultAppInfo Range
r) Expr
e (NamedArg Expr -> Expr) -> NamedArg Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Expr -> NamedArg Expr
forall a. a -> NamedArg a
defaultNamedArg Expr
metaVar
evalInCurrent :: ComputeMode -> Expr -> TCM Expr
evalInCurrent :: ComputeMode -> Expr -> TCM Expr
evalInCurrent ComputeMode
cmode Expr
e = do
(Term
v, Type
_t) <- Expr -> TCM (Term, Type)
inferExpr Expr
e
Blocked Term
vb <- Term -> TCMT IO (Blocked Term)
forall a (m :: * -> *).
(Reduce a, MonadReduce m) =>
a -> m (Blocked a)
reduceB Term
v
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.eval" Int
30 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"evaluated to" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Blocked Term -> TCMT IO Doc
forall (m :: * -> *) a. (Applicative m, Pretty a) => a -> m Doc
TP.pretty Blocked Term
vb
Term
v <- Term -> TCM Term
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Term -> TCM Term) -> Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ Blocked Term -> Term
forall t a. Blocked' t a -> a
ignoreBlocking Blocked Term
vb
Term -> TCM Expr
Term -> TCMT IO (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (Term -> TCM Expr) -> TCM Term -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< if ComputeMode
cmode ComputeMode -> ComputeMode -> Bool
forall a. Eq a => a -> a -> Bool
== ComputeMode
HeadCompute then Term -> TCM Term
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v else Term -> TCM Term
forall a (m :: * -> *). (Normalise a, MonadReduce m) => a -> m a
normalise Term
v
evalInMeta :: InteractionId -> ComputeMode -> Expr -> TCM Expr
evalInMeta :: InteractionId -> ComputeMode -> Expr -> TCM Expr
evalInMeta InteractionId
ii ComputeMode
cmode Expr
e =
do MetaId
m <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
Closure Range
mi <- MetaVariable -> Closure Range
getMetaInfo (MetaVariable -> Closure Range)
-> TCMT IO MetaVariable -> TCMT IO (Closure Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
m
Closure Range -> TCM Expr -> TCM Expr
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo Closure Range
mi (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$
ComputeMode -> Expr -> TCM Expr
evalInCurrent ComputeMode
cmode Expr
e
normalForm :: (Reduce t, Simplify t, Instantiate t, Normalise t) => Rewrite -> t -> TCM t
normalForm :: forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm = \case
Rewrite
AsIs -> t -> TCM t
forall a (m :: * -> *). (Instantiate a, MonadReduce m) => a -> m a
instantiate
Rewrite
Instantiated -> t -> TCM t
forall a (m :: * -> *). (Instantiate a, MonadReduce m) => a -> m a
instantiate
Rewrite
HeadNormal -> t -> TCM t
forall a (m :: * -> *). (Reduce a, MonadReduce m) => a -> m a
reduce
Rewrite
Simplified -> t -> TCM t
forall a (m :: * -> *). (Simplify a, MonadReduce m) => a -> m a
simplify
Rewrite
Normalised -> t -> TCM t
forall a (m :: * -> *). (Normalise a, MonadReduce m) => a -> m a
normalise
computeIgnoreAbstract :: ComputeMode -> Bool
computeIgnoreAbstract :: ComputeMode -> Bool
computeIgnoreAbstract ComputeMode
DefaultCompute = Bool
False
computeIgnoreAbstract ComputeMode
HeadCompute = Bool
False
computeIgnoreAbstract ComputeMode
IgnoreAbstract = Bool
True
computeIgnoreAbstract ComputeMode
UseShowInstance = Bool
True
computeWrapInput :: ComputeMode -> String -> String
computeWrapInput :: ComputeMode -> ArgName -> ArgName
computeWrapInput ComputeMode
UseShowInstance ArgName
s = ArgName
"show (" ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
s ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
")"
computeWrapInput ComputeMode
_ ArgName
s = ArgName
s
showComputed :: ComputeMode -> Expr -> TCM Doc
showComputed :: ComputeMode -> Expr -> TCMT IO Doc
showComputed ComputeMode
UseShowInstance Expr
e =
case Expr
e of
A.Lit ExprInfo
_ (LitString Text
s) -> Doc -> TCMT IO Doc
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ArgName -> Doc
forall a. ArgName -> Doc a
text (ArgName -> Doc) -> ArgName -> Doc
forall a b. (a -> b) -> a -> b
$ Text -> ArgName
T.unpack Text
s)
Expr
_ -> (Doc
"Not a string:" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
$$) (Doc -> Doc) -> TCMT IO Doc -> TCMT IO Doc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr -> TCMT IO Doc
forall a (m :: * -> *).
(ToConcrete a, Pretty (ConOfAbs a), MonadAbsToCon m) =>
a -> m Doc
prettyATop Expr
e
showComputed ComputeMode
_ Expr
e = Expr -> TCMT IO Doc
forall a (m :: * -> *).
(ToConcrete a, Pretty (ConOfAbs a), MonadAbsToCon m) =>
a -> m Doc
prettyATop Expr
e
outputFormId :: OutputForm a b -> b
outputFormId :: forall a b. OutputForm a b -> b
outputFormId (OutputForm Range
_ [ProblemId]
_ Blocker
_ OutputConstraint a b
o) = OutputConstraint a b -> b
forall {a} {b}. OutputConstraint a b -> b
out OutputConstraint a b
o
where
out :: OutputConstraint a b -> b
out = \case
OfType b
i a
_ -> b
i
CmpInType Comparison
_ a
_ b
i b
_ -> b
i
CmpElim [Polarity]
_ a
_ (b
i:[b]
_) [b]
_ -> b
i
CmpElim [Polarity]
_ a
_ [] [b]
_ -> b
forall a. HasCallStack => a
__IMPOSSIBLE__
JustType b
i -> b
i
CmpLevels Comparison
_ b
i b
_ -> b
i
CmpTypes Comparison
_ b
i b
_ -> b
i
CmpTeles Comparison
_ b
i b
_ -> b
i
JustSort b
i -> b
i
CmpSorts Comparison
_ b
i b
_ -> b
i
Assign b
i a
_ -> b
i
TypedAssign b
i a
_ a
_ -> b
i
PostponedCheckArgs b
i [a]
_ a
_ a
_ -> b
i
IsEmptyType a
_ -> b
forall a. HasCallStack => a
__IMPOSSIBLE__
SizeLtSat{} -> b
forall a. HasCallStack => a
__IMPOSSIBLE__
FindInstanceOF b
_ a
_ [(a, a, a)]
_ -> b
forall a. HasCallStack => a
__IMPOSSIBLE__
PTSInstance b
i b
_ -> b
i
PostponedCheckFunDef{} -> b
forall a. HasCallStack => a
__IMPOSSIBLE__
DataSort QName
_ b
i -> b
i
CheckLock b
i b
_ -> b
i
UsableAtMod Modality
_ b
i -> b
i
instance Reify ProblemConstraint where
type ReifiesTo ProblemConstraint = Closure (OutputForm Expr Expr)
reify :: forall (m :: * -> *).
MonadReify m =>
ProblemConstraint -> m (ReifiesTo ProblemConstraint)
reify (PConstr Set ProblemId
pids Blocker
unblock Closure Constraint
cl) = Closure Constraint
-> (Constraint -> m (OutputForm Expr Expr))
-> m (Closure (OutputForm Expr Expr))
forall (m :: * -> *) a b.
(MonadTCEnv m, ReadTCState m) =>
Closure a -> (a -> m b) -> m (Closure b)
withClosure Closure Constraint
cl ((Constraint -> m (OutputForm Expr Expr))
-> m (Closure (OutputForm Expr Expr)))
-> (Constraint -> m (OutputForm Expr Expr))
-> m (Closure (OutputForm Expr Expr))
forall a b. (a -> b) -> a -> b
$ \ Constraint
c ->
Range
-> [ProblemId]
-> Blocker
-> OutputConstraint Expr Expr
-> OutputForm Expr Expr
forall a b.
Range
-> [ProblemId] -> Blocker -> OutputConstraint a b -> OutputForm a b
OutputForm (Constraint -> Range
forall a. HasRange a => a -> Range
getRange Constraint
c) (Set ProblemId -> [ProblemId]
forall a. Set a -> [a]
Set.toList Set ProblemId
pids) Blocker
unblock (OutputConstraint Expr Expr -> OutputForm Expr Expr)
-> m (OutputConstraint Expr Expr) -> m (OutputForm Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Constraint -> m (ReifiesTo Constraint)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
Constraint -> m (ReifiesTo Constraint)
reify Constraint
c
reifyElimToExpr :: MonadReify m => I.Elim -> m Expr
reifyElimToExpr :: forall (m :: * -> *). MonadReify m => Elim' Term -> m Expr
reifyElimToExpr = \case
I.IApply Term
_ Term
_ Term
v -> Text -> Arg Expr -> Expr
appl Text
"iapply" (Arg Expr -> Expr) -> m (Arg Expr) -> m Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Arg Term -> m (ReifiesTo (Arg Term))
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
Arg Term -> m (ReifiesTo (Arg Term))
reify (Term -> Arg Term
forall a. a -> Arg a
defaultArg (Term -> Arg Term) -> Term -> Arg Term
forall a b. (a -> b) -> a -> b
$ Term
v)
I.Apply Arg Term
v -> Text -> Arg Expr -> Expr
appl Text
"apply" (Arg Expr -> Expr) -> m (Arg Expr) -> m Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Arg Term -> m (ReifiesTo (Arg Term))
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
Arg Term -> m (ReifiesTo (Arg Term))
reify Arg Term
v
I.Proj ProjOrigin
_o QName
f -> Text -> Arg Expr -> Expr
appl Text
"proj" (Arg Expr -> Expr) -> m (Arg Expr) -> m Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Arg Term -> m (ReifiesTo (Arg Term))
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
Arg Term -> m (ReifiesTo (Arg Term))
reify ((Term -> Arg Term
forall a. a -> Arg a
defaultArg (Term -> Arg Term) -> Term -> Arg Term
forall a b. (a -> b) -> a -> b
$ QName -> Elims -> Term
I.Def QName
f []) :: Arg Term)
where
appl :: Text -> Arg Expr -> Expr
appl :: Text -> Arg Expr -> Expr
appl Text
s Arg Expr
v = AppInfo -> Expr -> NamedArg Expr -> Expr
A.App AppInfo
defaultAppInfo_ (ExprInfo -> Literal -> Expr
A.Lit ExprInfo
forall a. Null a => a
empty (Text -> Literal
LitString Text
s)) (NamedArg Expr -> Expr) -> NamedArg Expr -> Expr
forall a b. (a -> b) -> a -> b
$ (Expr -> Named_ Expr) -> Arg Expr -> NamedArg Expr
forall a b. (a -> b) -> Arg a -> Arg b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Expr -> Named_ Expr
forall a name. a -> Named name a
unnamed Arg Expr
v
instance Reify Constraint where
type ReifiesTo Constraint = OutputConstraint Expr Expr
reify :: forall (m :: * -> *).
MonadReify m =>
Constraint -> m (ReifiesTo Constraint)
reify (ValueCmp Comparison
cmp (AsTermsOf Type
t) Term
u Term
v) = Comparison -> Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> a -> b -> b -> OutputConstraint a b
CmpInType Comparison
cmp (Expr -> Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t m (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
u m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
v
reify (ValueCmp Comparison
cmp CompareAs
AsSizes Term
u Term
v) = Comparison -> Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> a -> b -> b -> OutputConstraint a b
CmpInType Comparison
cmp (Expr -> Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Type -> m Expr
Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> m Expr) -> m Type -> m Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m Type
forall (m :: * -> *).
(HasBuiltins m, MonadTCEnv m, ReadTCState m) =>
m Type
sizeType) m (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
u m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
v
reify (ValueCmp Comparison
cmp CompareAs
AsTypes Term
u Term
v) = Comparison -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpTypes Comparison
cmp (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
u m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
v
reify (ValueCmpOnFace Comparison
cmp Term
p Type
t Term
u Term
v) = Comparison -> Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> a -> b -> b -> OutputConstraint a b
CmpInType Comparison
cmp (Expr -> Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Type -> m Expr
Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> m Expr) -> m Type -> m Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m Type
ty) m (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (Term -> Term
lam_o Term
u) m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (Term -> Term
lam_o Term
v)
where
lam_o :: Term -> Term
lam_o = ArgInfo -> Abs Term -> Term
I.Lam (Relevance -> ArgInfo -> ArgInfo
forall a. LensRelevance a => Relevance -> a -> a
setRelevance Relevance
Irrelevant ArgInfo
defaultArgInfo) (Abs Term -> Term) -> (Term -> Abs Term) -> Term -> Term
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArgName -> Term -> Abs Term
forall a. ArgName -> a -> Abs a
NoAbs ArgName
"_"
ty :: m Type
ty = Names -> NamesT m Type -> m Type
forall (m :: * -> *) a. Names -> NamesT m a -> m a
runNamesT [] (NamesT m Type -> m Type) -> NamesT m Type -> m Type
forall a b. (a -> b) -> a -> b
$ do
NamesT m Term
p <- Term -> NamesT m (NamesT m Term)
forall (m :: * -> *) a.
(MonadFail m, Subst a) =>
a -> NamesT m (NamesT m a)
open Term
p
NamesT m Type
t <- Type -> NamesT m (NamesT m Type)
forall (m :: * -> *) a.
(MonadFail m, Subst a) =>
a -> NamesT m (NamesT m a)
open Type
t
ArgName
-> NamesT m Term
-> (NamesT m Term -> NamesT m Type)
-> NamesT m Type
forall (m :: * -> *).
(MonadAddContext m, HasBuiltins m, MonadDebug m) =>
ArgName
-> NamesT m Term
-> (NamesT m Term -> NamesT m Type)
-> NamesT m Type
pPi' ArgName
"o" NamesT m Term
p (\ NamesT m Term
o -> NamesT m Type
t)
reify (ElimCmp [Polarity]
cmp [IsForced]
_ Type
t Term
v Elims
es1 Elims
es2) =
[Polarity]
-> Expr -> [Expr] -> [Expr] -> OutputConstraint Expr Expr
forall a b. [Polarity] -> a -> [b] -> [b] -> OutputConstraint a b
CmpElim [Polarity]
cmp (Expr -> [Expr] -> [Expr] -> OutputConstraint Expr Expr)
-> m Expr -> m ([Expr] -> [Expr] -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t m ([Expr] -> [Expr] -> OutputConstraint Expr Expr)
-> m [Expr] -> m ([Expr] -> OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Elim' Term -> m Expr) -> Elims -> m [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Elim' Term -> m Expr
forall (m :: * -> *). MonadReify m => Elim' Term -> m Expr
reifyElimToExpr Elims
es1
m ([Expr] -> OutputConstraint Expr Expr)
-> m [Expr] -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Elim' Term -> m Expr) -> Elims -> m [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Elim' Term -> m Expr
forall (m :: * -> *). MonadReify m => Elim' Term -> m Expr
reifyElimToExpr Elims
es2
reify (LevelCmp Comparison
cmp Level
t Level
t') = Comparison -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpLevels Comparison
cmp (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Level -> m (ReifiesTo Level)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Level -> m (ReifiesTo Level)
reify Level
t m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Level -> m (ReifiesTo Level)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Level -> m (ReifiesTo Level)
reify Level
t'
reify (SortCmp Comparison
cmp Sort
s Sort
s') = Comparison -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpSorts Comparison
cmp (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sort -> m (ReifiesTo Sort)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Sort -> m (ReifiesTo Sort)
reify Sort
s m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sort -> m (ReifiesTo Sort)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Sort -> m (ReifiesTo Sort)
reify Sort
s'
reify (UnquoteTactic Term
tac Term
_ Type
goal) = do
Expr
tac <- AppInfo -> Expr -> NamedArg Expr -> Expr
A.App AppInfo
defaultAppInfo_ (ExprInfo -> Expr
A.Unquote ExprInfo
exprNoRange) (NamedArg Expr -> Expr) -> (Expr -> NamedArg Expr) -> Expr -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr -> NamedArg Expr
forall a. a -> NamedArg a
defaultNamedArg (Expr -> Expr) -> m Expr -> m Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
tac
Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> OutputConstraint a b
OfType Expr
tac (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
goal
reify (UnBlock MetaId
m) = do
MetaInstantiation
mi <- MetaId -> m MetaInstantiation
forall (m :: * -> *).
ReadTCState m =>
MetaId -> m MetaInstantiation
lookupMetaInstantiation MetaId
m
Expr
m' <- Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (MetaId -> Elims -> Term
MetaV MetaId
m [])
case MetaInstantiation
mi of
BlockedConst Term
t -> do
Expr
e <- Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
t
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> OutputConstraint a b
Assign Expr
m' Expr
e
PostponedTypeCheckingProblem Closure TypeCheckingProblem
cl -> Closure TypeCheckingProblem
-> (TypeCheckingProblem -> m (OutputConstraint Expr Expr))
-> m (OutputConstraint Expr Expr)
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure Closure TypeCheckingProblem
cl ((TypeCheckingProblem -> m (OutputConstraint Expr Expr))
-> m (OutputConstraint Expr Expr))
-> (TypeCheckingProblem -> m (OutputConstraint Expr Expr))
-> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ \case
CheckExpr Comparison
cmp Expr
e Type
a -> do
Expr
a <- Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
a
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> a -> OutputConstraint a b
TypedAssign Expr
m' Expr
e Expr
a
CheckLambda Comparison
cmp (Arg ArgInfo
ai (List1 (WithHiding Name)
xs, Maybe Type
mt)) Expr
body Type
target -> do
Expr
domType <- m Expr -> (Type -> m Expr) -> Maybe Type -> m Expr
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Expr -> m Expr
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
forall a. Underscore a => a
underscore) Type -> m Expr
Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Maybe Type
mt
Expr
target <- Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
target
let mkN :: WithHiding Name -> NamedArg Binder
mkN (WithHiding Hiding
h Name
x) = Hiding -> NamedArg Binder -> NamedArg Binder
forall a. LensHiding a => Hiding -> a -> a
setHiding Hiding
h (NamedArg Binder -> NamedArg Binder)
-> NamedArg Binder -> NamedArg Binder
forall a b. (a -> b) -> a -> b
$ Binder -> NamedArg Binder
forall a. a -> NamedArg a
defaultNamedArg (Binder -> NamedArg Binder) -> Binder -> NamedArg Binder
forall a b. (a -> b) -> a -> b
$ Name -> Binder
A.mkBinder_ Name
x
bs :: TypedBinding
bs = Range -> NonEmpty (NamedArg Binder) -> Expr -> TypedBinding
mkTBind Range
forall a. Range' a
noRange ((WithHiding Name -> NamedArg Binder)
-> List1 (WithHiding Name) -> NonEmpty (NamedArg Binder)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WithHiding Name -> NamedArg Binder
mkN List1 (WithHiding Name)
xs) Expr
domType
e :: Expr
e = ExprInfo -> LamBinding -> Expr -> Expr
A.Lam ExprInfo
Info.exprNoRange (TypedBinding -> LamBinding
DomainFull TypedBinding
bs) Expr
body
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> a -> OutputConstraint a b
TypedAssign Expr
m' Expr
e Expr
target
CheckArgs Comparison
_ ExpandHidden
_ Range
_ [NamedArg Expr]
args Type
t0 Type
t1 ArgsCheckState CheckedTarget -> TCM Term
_ -> do
Expr
t0 <- Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t0
Expr
t1 <- Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t1
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> [Expr] -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> [a] -> a -> a -> OutputConstraint a b
PostponedCheckArgs Expr
m' ((NamedArg Expr -> Expr) -> [NamedArg Expr] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map (Named_ Expr -> Expr
forall name a. Named name a -> a
namedThing (Named_ Expr -> Expr)
-> (NamedArg Expr -> Named_ Expr) -> NamedArg Expr -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NamedArg Expr -> Named_ Expr
forall e. Arg e -> e
unArg) [NamedArg Expr]
args) Expr
t0 Expr
t1
CheckProjAppToKnownPrincipalArg Comparison
cmp Expr
e ProjOrigin
_ List1 QName
_ [NamedArg Expr]
_ Type
t Int
_ Term
_ Type
_ PrincipalArgTypeMetas
_ -> Expr -> Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> a -> OutputConstraint a b
TypedAssign Expr
m' Expr
e (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t
DoQuoteTerm Comparison
cmp Term
v Type
t -> do
Expr
tm <- AppInfo -> Expr -> NamedArg Expr -> Expr
A.App AppInfo
defaultAppInfo_ (ExprInfo -> Expr
A.QuoteTerm ExprInfo
exprNoRange) (NamedArg Expr -> Expr) -> (Expr -> NamedArg Expr) -> Expr -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr -> NamedArg Expr
forall a. a -> NamedArg a
defaultNamedArg (Expr -> Expr) -> m Expr -> m Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
v
Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> OutputConstraint a b
OfType Expr
tm (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t
Open{} -> m (OutputConstraint Expr Expr)
forall a. HasCallStack => a
__IMPOSSIBLE__
OpenInstance{} -> m (OutputConstraint Expr Expr)
forall a. HasCallStack => a
__IMPOSSIBLE__
InstV{} -> m (OutputConstraint Expr Expr)
forall a. HasCallStack => a
__IMPOSSIBLE__
reify (FindInstance MetaId
m Maybe [Candidate]
mcands) = Expr -> Expr -> [(Expr, Expr, Expr)] -> OutputConstraint Expr Expr
forall a b. b -> a -> [(a, a, a)] -> OutputConstraint a b
FindInstanceOF
(Expr
-> Expr -> [(Expr, Expr, Expr)] -> OutputConstraint Expr Expr)
-> m Expr
-> m (Expr -> [(Expr, Expr, Expr)] -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (MetaId -> Elims -> Term
MetaV MetaId
m [])
m (Expr -> [(Expr, Expr, Expr)] -> OutputConstraint Expr Expr)
-> m Expr -> m ([(Expr, Expr, Expr)] -> OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Type -> m Expr
Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> m Expr) -> m Type -> m Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MetaId -> m Type
forall (m :: * -> *). ReadTCState m => MetaId -> m Type
getMetaType MetaId
m)
m ([(Expr, Expr, Expr)] -> OutputConstraint Expr Expr)
-> m [(Expr, Expr, Expr)] -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Candidate]
-> (Candidate -> m (Expr, Expr, Expr)) -> m [(Expr, Expr, Expr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM ([Candidate] -> Maybe [Candidate] -> [Candidate]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [Candidate]
mcands) (\ (Candidate CandidateKind
q Term
tm Type
ty Bool
_) -> do
(,,) (Expr -> Expr -> Expr -> (Expr, Expr, Expr))
-> m Expr -> m (Expr -> Expr -> (Expr, Expr, Expr))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
tm m (Expr -> Expr -> (Expr, Expr, Expr))
-> m Expr -> m (Expr -> (Expr, Expr, Expr))
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
tm m (Expr -> (Expr, Expr, Expr)) -> m Expr -> m (Expr, Expr, Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
ty)
reify (IsEmpty Range
r Type
a) = Expr -> OutputConstraint Expr Expr
forall a b. a -> OutputConstraint a b
IsEmptyType (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
a
reify (CheckSizeLtSat Term
a) = Expr -> OutputConstraint Expr Expr
forall a b. a -> OutputConstraint a b
SizeLtSat (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
a
reify (CheckFunDef DefInfo
i QName
q [Clause]
cs TCErr
err) = do
Expr
a <- Type -> m Expr
Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> m Expr) -> m Type -> m Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Definition -> Type
defType (Definition -> Type) -> m Definition -> m Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> QName -> m Definition
forall (m :: * -> *). HasConstInfo m => QName -> m Definition
getConstInfo QName
q
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ QName -> Expr -> TCErr -> OutputConstraint Expr Expr
forall a b. QName -> a -> TCErr -> OutputConstraint a b
PostponedCheckFunDef QName
q Expr
a TCErr
err
reify (HasBiggerSort Sort
a) = Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> OutputConstraint a b
OfType (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sort -> m (ReifiesTo Sort)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Sort -> m (ReifiesTo Sort)
reify Sort
a m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sort -> m (ReifiesTo Sort)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Sort -> m (ReifiesTo Sort)
reify (Sort -> Sort
forall t. Sort' t -> Sort' t
UnivSort Sort
a)
reify (HasPTSRule Dom Type
a Abs Sort
b) = do
(Expr
a,(Name
x,Expr
b)) <- (Type, Abs Sort) -> m (ReifiesTo (Type, Abs Sort))
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
(Type, Abs Sort) -> m (ReifiesTo (Type, Abs Sort))
reify (Dom Type -> Type
forall t e. Dom' t e -> e
unDom Dom Type
a,Abs Sort
b)
OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr))
-> OutputConstraint Expr Expr -> m (OutputConstraint Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> b -> OutputConstraint a b
PTSInstance Expr
a Expr
b
reify (CheckDataSort QName
q Sort
s) = QName -> Expr -> OutputConstraint Expr Expr
forall a b. QName -> b -> OutputConstraint a b
DataSort QName
q (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sort -> m (ReifiesTo Sort)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Sort -> m (ReifiesTo Sort)
reify Sort
s
reify (CheckLockedVars Term
t Type
_ Arg Term
lk Type
_) = Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> b -> OutputConstraint a b
CheckLock (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
t m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
lk)
reify (CheckMetaInst MetaId
m) = do
Type
t <- Judgement MetaId -> Type
forall a. Judgement a -> Type
jMetaType (Judgement MetaId -> Type)
-> (MetaVariable -> Judgement MetaId) -> MetaVariable -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaVariable -> Judgement MetaId
mvJudgement (MetaVariable -> Type) -> m MetaVariable -> m Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaId -> m MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
m
Expr -> Expr -> OutputConstraint Expr Expr
forall a b. b -> a -> OutputConstraint a b
OfType (Expr -> Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (Expr -> OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (MetaId -> Elims -> Term
MetaV MetaId
m []) m (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t
reify (CheckType Type
t) = Expr -> OutputConstraint Expr Expr
forall a b. b -> OutputConstraint a b
JustType (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> m (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify Type
t
reify (UsableAtModality WhyCheckModality
_ Maybe Sort
_ Modality
mod Term
t) = Modality -> Expr -> OutputConstraint Expr Expr
forall a b. Modality -> b -> OutputConstraint a b
UsableAtMod Modality
mod (Expr -> OutputConstraint Expr Expr)
-> m Expr -> m (OutputConstraint Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> m (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify Term
t
{-# SPECIALIZE reify :: Constraint -> TCM (ReifiesTo Constraint) #-}
instance (Pretty a, Pretty b) => PrettyTCM (OutputForm a b) where
prettyTCM :: forall (m :: * -> *). MonadPretty m => OutputForm a b -> m Doc
prettyTCM (OutputForm Range
r [ProblemId]
pids Blocker
unblock OutputConstraint a b
c) =
Range -> [ProblemId] -> Blocker -> Doc -> m Doc
forall (m :: * -> *) (f :: * -> *).
(MonadPretty m, Foldable f, Null (f ProblemId)) =>
Range -> f ProblemId -> Blocker -> Doc -> m Doc
prettyRangeConstraint Range
r [ProblemId]
pids Blocker
unblock (OutputConstraint a b -> Doc
forall a. Pretty a => a -> Doc
pretty OutputConstraint a b
c)
{-# SPECIALIZE prettyTCM :: (Pretty a, Pretty b) => (OutputForm a b) -> TCM Doc #-}
instance (Pretty a, Pretty b) => Pretty (OutputForm a b) where
pretty :: OutputForm a b -> Doc
pretty (OutputForm Range
r [ProblemId]
pids Blocker
unblock OutputConstraint a b
c) =
OutputConstraint a b -> Doc
forall a. Pretty a => a -> Doc
pretty OutputConstraint a b
c Doc -> Doc -> Doc
<?>
[Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
sep [ Range -> Doc
forall {a} {a}. Pretty a => a -> Doc a
prange Range
r, Doc -> Doc
parensNonEmpty ([Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
sep [Blocker -> Doc
blockedOn Blocker
unblock, [ProblemId] -> Doc
forall {a}. Pretty a => [a] -> Doc
prPids [ProblemId]
pids]) ]
where
prPids :: [a] -> Doc
prPids [] = Doc
forall a. Null a => a
empty
prPids [a
pid] = Doc
"belongs to problem" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> a -> Doc
forall a. Pretty a => a -> Doc
pretty a
pid
prPids [a]
pids = Doc
"belongs to problems" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
fsep (Doc -> [Doc] -> [Doc]
forall (t :: * -> *). Foldable t => Doc -> t Doc -> [Doc]
punctuate Doc
"," ([Doc] -> [Doc]) -> [Doc] -> [Doc]
forall a b. (a -> b) -> a -> b
$ (a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map a -> Doc
forall a. Pretty a => a -> Doc
pretty [a]
pids)
comma :: Doc
comma | [ProblemId] -> Bool
forall a. Null a => a -> Bool
null [ProblemId]
pids = Doc
forall a. Null a => a
empty
| Bool
otherwise = Doc
","
blockedOn :: Blocker -> Doc
blockedOn (UnblockOnAll Set Blocker
bs) | Set Blocker -> Bool
forall a. Set a -> Bool
Set.null Set Blocker
bs = Doc
forall a. Null a => a
empty
blockedOn (UnblockOnAny Set Blocker
bs) | Set Blocker -> Bool
forall a. Set a -> Bool
Set.null Set Blocker
bs = Doc
"stuck" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
P.<> Doc
comma
blockedOn Blocker
u = Doc
"blocked on" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> (Blocker -> Doc
forall a. Pretty a => a -> Doc
pretty Blocker
u Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
P.<> Doc
comma)
prange :: a -> Doc a
prange a
r | ArgName -> Bool
forall a. Null a => a -> Bool
null ArgName
s = Doc a
forall a. Null a => a
empty
| Bool
otherwise = ArgName -> Doc a
forall a. ArgName -> Doc a
text (ArgName -> Doc a) -> ArgName -> Doc a
forall a b. (a -> b) -> a -> b
$ ArgName
" [ at " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
s ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
" ]"
where s :: ArgName
s = a -> ArgName
forall a. Pretty a => a -> ArgName
prettyShow a
r
instance (Pretty a, Pretty b) => Pretty (OutputConstraint a b) where
pretty :: OutputConstraint a b -> Doc
pretty OutputConstraint a b
oc =
case OutputConstraint a b
oc of
OfType b
e a
t -> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
e Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t
JustType b
e -> Doc
"Type" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
e
JustSort b
e -> Doc
"Sort" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
e
CmpInType Comparison
cmp a
t b
e b
e' -> Comparison -> b -> b -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp Comparison
cmp b
e b
e' Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t
CmpElim [Polarity]
cmp a
t [b]
e [b]
e' -> [Polarity] -> [b] -> [b] -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp [Polarity]
cmp [b]
e [b]
e' Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t
CmpTypes Comparison
cmp b
t b
t' -> Comparison -> b -> b -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp Comparison
cmp b
t b
t'
CmpLevels Comparison
cmp b
t b
t' -> Comparison -> b -> b -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp Comparison
cmp b
t b
t'
CmpTeles Comparison
cmp b
t b
t' -> Comparison -> b -> b -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp Comparison
cmp b
t b
t'
CmpSorts Comparison
cmp b
s b
s' -> Comparison -> b -> b -> Doc
forall {a} {a} {a}.
(Pretty a, Pretty a, Pretty a) =>
a -> a -> a -> Doc
pcmp Comparison
cmp b
s b
s'
Assign b
m a
e -> Doc -> Doc -> Doc -> Doc
bin (b -> Doc
forall a. Pretty a => a -> Doc
pretty b
m) Doc
":=" (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
e)
TypedAssign b
m a
e a
a -> Doc -> Doc -> Doc -> Doc
bin (b -> Doc
forall a. Pretty a => a -> Doc
pretty b
m) Doc
":=" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> Doc -> Doc -> Doc
bin (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
e) Doc
":?" (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
a)
PostponedCheckArgs b
m [a]
es a
t0 a
t1 ->
Doc -> Doc -> Doc -> Doc
bin (b -> Doc
forall a. Pretty a => a -> Doc
pretty b
m) Doc
":=" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ (Doc -> Doc
parens (Doc
"_" Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t0) Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
fsep ((a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Doc -> Doc
paren (Doc -> Doc) -> (a -> Doc) -> a -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Doc
forall a. Pretty a => a -> Doc
pretty) [a]
es)) Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t1
where paren :: Doc -> Doc
paren Doc
d = Bool -> Doc -> Doc
mparens ((Char -> Bool) -> ArgName -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Char -> ArgName -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
' ', Char
'\n']) (ArgName -> Bool) -> ArgName -> Bool
forall a b. (a -> b) -> a -> b
$ Doc -> ArgName
forall a. Show a => a -> ArgName
show Doc
d) Doc
d
IsEmptyType a
a -> Doc
"Is empty:" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> a -> Doc
forall a. Pretty a => a -> Doc
pretty a
a
SizeLtSat a
a -> Doc
"Not empty type of sizes:" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> a -> Doc
forall a. Pretty a => a -> Doc
pretty a
a
FindInstanceOF b
s a
t [(a, a, a)]
cs -> [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat
[ Doc
"Resolve instance argument" Doc -> Doc -> Doc
<?> (b -> Doc
forall a. Pretty a => a -> Doc
pretty b
s Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t)
, Int -> Doc -> Doc
forall a. Int -> Doc a -> Doc a
nest Int
2 (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc
"Candidate:"
, Int -> Doc -> Doc
forall a. Int -> Doc a -> Doc a
nest Int
4 (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat [ Doc -> Doc -> Doc -> Doc
bin (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
q) Doc
"=" (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
v) Doc -> a -> Doc
forall {a}. Pretty a => Doc -> a -> Doc
.: a
t | (a
q, a
v, a
t) <- [(a, a, a)]
cs ] ]
PTSInstance b
a b
b -> Doc
"PTS instance for" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> (b, b) -> Doc
forall a. Pretty a => a -> Doc
pretty (b
a, b
b)
PostponedCheckFunDef QName
q a
a TCErr
_err ->
[Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
vcat [ Doc
"Check definition of" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> QName -> Doc
forall a. Pretty a => a -> Doc
pretty QName
q Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
":" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> a -> Doc
forall a. Pretty a => a -> Doc
pretty a
a ]
DataSort QName
q b
s -> Doc
"Sort" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
s Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
"allows data/record definitions"
CheckLock b
t b
lk -> Doc
"Check lock" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
lk Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
"allows" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
t
UsableAtMod Modality
mod b
t -> Doc
"Is usable at" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> ArgName -> Doc
forall a. ArgName -> Doc a
text (Modality -> ArgName
forall a. Verbalize a => a -> ArgName
verbalize Modality
mod) Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
"modality:" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> b -> Doc
forall a. Pretty a => a -> Doc
pretty b
t
where
bin :: Doc -> Doc -> Doc -> Doc
bin Doc
a Doc
op Doc
b = [Doc] -> Doc
forall (t :: * -> *). Foldable t => t Doc -> Doc
sep [Doc
a, Int -> Doc -> Doc
forall a. Int -> Doc a -> Doc a
nest Int
2 (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc
op Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
b]
pcmp :: a -> a -> a -> Doc
pcmp a
cmp a
a a
b = Doc -> Doc -> Doc -> Doc
bin (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
a) (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
cmp) (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
b)
Doc
val .: :: Doc -> a -> Doc
.: a
ty = Doc -> Doc -> Doc -> Doc
bin Doc
val Doc
":" (a -> Doc
forall a. Pretty a => a -> Doc
pretty a
ty)
instance (ToConcrete a, ToConcrete b) => ToConcrete (OutputForm a b) where
type ConOfAbs (OutputForm a b) = OutputForm (ConOfAbs a) (ConOfAbs b)
toConcrete :: OutputForm a b -> AbsToCon (ConOfAbs (OutputForm a b))
toConcrete (OutputForm Range
r [ProblemId]
pid Blocker
u OutputConstraint a b
c) = Range
-> [ProblemId]
-> Blocker
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
-> OutputForm (ConOfAbs a) (ConOfAbs b)
forall a b.
Range
-> [ProblemId] -> Blocker -> OutputConstraint a b -> OutputForm a b
OutputForm Range
r [ProblemId]
pid Blocker
u (OutputConstraint (ConOfAbs a) (ConOfAbs b)
-> OutputForm (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (OutputForm (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> OutputConstraint a b -> AbsToCon (ConOfAbs (OutputConstraint a b))
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete OutputConstraint a b
c
instance (ToConcrete a, ToConcrete b) => ToConcrete (OutputConstraint a b) where
type ConOfAbs (OutputConstraint a b) = OutputConstraint (ConOfAbs a) (ConOfAbs b)
toConcrete :: OutputConstraint a b -> AbsToCon (ConOfAbs (OutputConstraint a b))
toConcrete (OfType b
e a
t) = ConOfAbs b
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> a -> OutputConstraint a b
OfType (ConOfAbs b
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e AbsToCon (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
t
toConcrete (JustType b
e) = ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> OutputConstraint a b
JustType (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e
toConcrete (JustSort b
e) = ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> OutputConstraint a b
JustSort (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e
toConcrete (CmpInType Comparison
cmp a
t b
e b
e') =
Comparison
-> ConOfAbs a
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Comparison -> a -> b -> b -> OutputConstraint a b
CmpInType Comparison
cmp (ConOfAbs a
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
(ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
t AbsToCon
(ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e
AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e'
toConcrete (CmpElim [Polarity]
cmp a
t [b]
e [b]
e') =
[Polarity]
-> ConOfAbs a
-> [ConOfAbs b]
-> [ConOfAbs b]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. [Polarity] -> a -> [b] -> [b] -> OutputConstraint a b
CmpElim [Polarity]
cmp (ConOfAbs a
-> [ConOfAbs b]
-> [ConOfAbs b]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
([ConOfAbs b]
-> [ConOfAbs b] -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
t AbsToCon
([ConOfAbs b]
-> [ConOfAbs b] -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon [ConOfAbs b]
-> AbsToCon
([ConOfAbs b] -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> [b] -> AbsToCon (ConOfAbs [b])
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx [b]
e AbsToCon
([ConOfAbs b] -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon [ConOfAbs b]
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> [b] -> AbsToCon (ConOfAbs [b])
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx [b]
e'
toConcrete (CmpTypes Comparison
cmp b
e b
e') = Comparison
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpTypes Comparison
cmp (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e
AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e'
toConcrete (CmpLevels Comparison
cmp b
e b
e') = Comparison
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpLevels Comparison
cmp (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e
AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e'
toConcrete (CmpTeles Comparison
cmp b
e b
e') = Comparison
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpTeles Comparison
cmp (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e'
toConcrete (CmpSorts Comparison
cmp b
e b
e') = Comparison
-> ConOfAbs b
-> ConOfAbs b
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Comparison -> b -> b -> OutputConstraint a b
CmpSorts Comparison
cmp (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e
AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx b
e'
toConcrete (Assign b
m a
e) = AbsToCon (ConOfAbs (OutputConstraint a b))
-> AbsToCon (ConOfAbs (OutputConstraint a b))
forall a. AbsToCon a -> AbsToCon a
noTakenNames (AbsToCon (ConOfAbs (OutputConstraint a b))
-> AbsToCon (ConOfAbs (OutputConstraint a b)))
-> AbsToCon (ConOfAbs (OutputConstraint a b))
-> AbsToCon (ConOfAbs (OutputConstraint a b))
forall a b. (a -> b) -> a -> b
$ ConOfAbs b
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> a -> OutputConstraint a b
Assign (ConOfAbs b
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
m AbsToCon (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
e
toConcrete (TypedAssign b
m a
e a
a) = ConOfAbs b
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> a -> a -> OutputConstraint a b
TypedAssign (ConOfAbs b
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs a
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
m AbsToCon
(ConOfAbs a
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
(ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
e
AbsToCon (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
a
toConcrete (PostponedCheckArgs b
m [a]
args a
t0 a
t1) =
ConOfAbs b
-> [ConOfAbs a]
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> [a] -> a -> a -> OutputConstraint a b
PostponedCheckArgs (ConOfAbs b
-> [ConOfAbs a]
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
([ConOfAbs a]
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
m AbsToCon
([ConOfAbs a]
-> ConOfAbs a
-> ConOfAbs a
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon [ConOfAbs a]
-> AbsToCon
(ConOfAbs a
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [a] -> AbsToCon (ConOfAbs [a])
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete [a]
args AbsToCon
(ConOfAbs a
-> ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
(ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
t0 AbsToCon (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
t1
toConcrete (IsEmptyType a
a) = ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. a -> OutputConstraint a b
IsEmptyType (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
a
toConcrete (SizeLtSat a
a) = ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. a -> OutputConstraint a b
SizeLtSat (ConOfAbs a -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
a
toConcrete (FindInstanceOF b
s a
t [(a, a, a)]
cs) =
ConOfAbs b
-> ConOfAbs a
-> [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> a -> [(a, a, a)] -> OutputConstraint a b
FindInstanceOF (ConOfAbs b
-> ConOfAbs a
-> [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs a
-> [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
s AbsToCon
(ConOfAbs a
-> [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
([(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
t
AbsToCon
([(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((a, a, a) -> AbsToCon (ConOfAbs a, ConOfAbs a, ConOfAbs a))
-> [(a, a, a)] -> AbsToCon [(ConOfAbs a, ConOfAbs a, ConOfAbs a)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(a
q,a
tm,a
ty) -> (,,) (ConOfAbs a
-> ConOfAbs a
-> ConOfAbs a
-> (ConOfAbs a, ConOfAbs a, ConOfAbs a))
-> AbsToCon (ConOfAbs a)
-> AbsToCon
(ConOfAbs a -> ConOfAbs a -> (ConOfAbs a, ConOfAbs a, ConOfAbs a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
q AbsToCon
(ConOfAbs a -> ConOfAbs a -> (ConOfAbs a, ConOfAbs a, ConOfAbs a))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (ConOfAbs a -> (ConOfAbs a, ConOfAbs a, ConOfAbs a))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
tm AbsToCon (ConOfAbs a -> (ConOfAbs a, ConOfAbs a, ConOfAbs a))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (ConOfAbs a, ConOfAbs a, ConOfAbs a)
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
ty) [(a, a, a)]
cs
toConcrete (PTSInstance b
a b
b) = ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> b -> OutputConstraint a b
PTSInstance (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
a AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
b
toConcrete (DataSort QName
a b
b) = QName -> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. QName -> b -> OutputConstraint a b
DataSort QName
a (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
b
toConcrete (CheckLock b
a b
b) = ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. b -> b -> OutputConstraint a b
CheckLock (ConOfAbs b
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
a AbsToCon (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
b
toConcrete (PostponedCheckFunDef QName
q a
a TCErr
err) = QName
-> ConOfAbs a
-> TCErr
-> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. QName -> a -> TCErr -> OutputConstraint a b
PostponedCheckFunDef QName
q (ConOfAbs a -> TCErr -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (TCErr -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete a
a AbsToCon (TCErr -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon TCErr
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TCErr -> AbsToCon TCErr
forall a. a -> AbsToCon a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TCErr
err
toConcrete (UsableAtMod Modality
a b
b) = Modality
-> ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b)
forall a b. Modality -> b -> OutputConstraint a b
UsableAtMod Modality
a (ConOfAbs b -> OutputConstraint (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon (OutputConstraint (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
b
instance (Pretty a, Pretty b) => Pretty (OutputConstraint' a b) where
pretty :: OutputConstraint' a b -> Doc
pretty (OfType' b
e a
t) = b -> Doc
forall a. Pretty a => a -> Doc
pretty b
e Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
":" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> a -> Doc
forall a. Pretty a => a -> Doc
pretty a
t
instance (ToConcrete a, ToConcrete b) => ToConcrete (OutputConstraint' a b) where
type ConOfAbs (OutputConstraint' a b) = OutputConstraint' (ConOfAbs a) (ConOfAbs b)
toConcrete :: OutputConstraint' a b
-> AbsToCon (ConOfAbs (OutputConstraint' a b))
toConcrete (OfType' b
e a
t) = ConOfAbs b
-> ConOfAbs a -> OutputConstraint' (ConOfAbs a) (ConOfAbs b)
forall a b. b -> a -> OutputConstraint' a b
OfType' (ConOfAbs b
-> ConOfAbs a -> OutputConstraint' (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs b)
-> AbsToCon
(ConOfAbs a -> OutputConstraint' (ConOfAbs a) (ConOfAbs b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> AbsToCon (ConOfAbs b)
forall a. ToConcrete a => a -> AbsToCon (ConOfAbs a)
toConcrete b
e AbsToCon
(ConOfAbs a -> OutputConstraint' (ConOfAbs a) (ConOfAbs b))
-> AbsToCon (ConOfAbs a)
-> AbsToCon (OutputConstraint' (ConOfAbs a) (ConOfAbs b))
forall a b. AbsToCon (a -> b) -> AbsToCon a -> AbsToCon b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx a
t
instance Reify a => Reify (IPBoundary' a) where
type ReifiesTo (IPBoundary' a) = IPBoundary' (ReifiesTo a)
reify :: forall (m :: * -> *).
MonadReify m =>
IPBoundary' a -> m (ReifiesTo (IPBoundary' a))
reify = (a -> m (ReifiesTo a))
-> IPBoundary' a -> m (IPBoundary' (ReifiesTo a))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> IPBoundary' a -> f (IPBoundary' b)
traverse a -> m (ReifiesTo a)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => a -> m (ReifiesTo a)
reify
instance ToConcrete a => ToConcrete (IPBoundary' a) where
type ConOfAbs (IPBoundary' a) = IPBoundary' (ConOfAbs a)
toConcrete :: IPBoundary' a -> AbsToCon (ConOfAbs (IPBoundary' a))
toConcrete = (a -> AbsToCon (ConOfAbs a))
-> IPBoundary' a -> AbsToCon (IPBoundary' (ConOfAbs a))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> IPBoundary' a -> f (IPBoundary' b)
traverse (Precedence -> a -> AbsToCon (ConOfAbs a)
forall a. ToConcrete a => Precedence -> a -> AbsToCon (ConOfAbs a)
toConcreteCtx Precedence
TopCtx)
instance Pretty c => Pretty (IPFace' c) where
pretty :: IPFace' c -> Doc
pretty (IPFace' [(c, c)]
eqs c
val) = do
let
xs :: [Doc]
xs = ((c, c) -> Doc) -> [(c, c)] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (\ (c
l,c
r) -> c -> Doc
forall a. Pretty a => a -> Doc
pretty c
l Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
"=" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> c -> Doc
forall a. Pretty a => a -> Doc
pretty c
r) [(c, c)]
eqs
[Doc] -> Doc
forall {a}. Pretty a => [a] -> Doc
prettyList_ [Doc]
xs Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> Doc
"⊢" Doc -> Doc -> Doc
forall a. Doc a -> Doc a -> Doc a
<+> c -> Doc
forall a. Pretty a => a -> Doc
pretty c
val
prettyConstraints :: [Closure Constraint] -> TCM [OutputForm C.Expr C.Expr]
prettyConstraints :: [Closure Constraint] -> TCM [OutputForm Expr Expr]
prettyConstraints [Closure Constraint]
cs = do
[Closure Constraint]
-> (Closure Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Closure Constraint]
cs ((Closure Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr])
-> (Closure Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ \ Closure Constraint
c -> do
Closure (OutputForm Expr Expr)
cl <- ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
ProblemConstraint -> m (ReifiesTo ProblemConstraint)
reify (Set ProblemId -> Blocker -> Closure Constraint -> ProblemConstraint
PConstr Set ProblemId
forall a. Set a
Set.empty Blocker
alwaysUnblock Closure Constraint
c)
Closure (OutputForm Expr Expr)
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure Closure (OutputForm Expr Expr)
cl OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr)
OutputForm Expr Expr -> TCMT IO (ConOfAbs (OutputForm Expr Expr))
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_
getConstraints :: TCM [OutputForm C.Expr C.Expr]
getConstraints :: TCM [OutputForm Expr Expr]
getConstraints = (ProblemConstraint -> TCM ProblemConstraint)
-> (ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr]
getConstraints' ProblemConstraint -> TCM ProblemConstraint
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr])
-> (ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ Bool -> ProblemConstraint -> Bool
forall a b. a -> b -> a
const Bool
True
namedMetaOf :: OutputConstraint A.Expr a -> a
namedMetaOf :: forall a. OutputConstraint Expr a -> a
namedMetaOf (OfType a
i Expr
_) = a
i
namedMetaOf (JustType a
i) = a
i
namedMetaOf (JustSort a
i) = a
i
namedMetaOf (Assign a
i Expr
_) = a
i
namedMetaOf OutputConstraint Expr a
_ = a
forall a. HasCallStack => a
__IMPOSSIBLE__
getConstraintsMentioning :: Rewrite -> MetaId -> TCM [OutputForm C.Expr C.Expr]
getConstraintsMentioning :: Rewrite -> MetaId -> TCM [OutputForm Expr Expr]
getConstraintsMentioning Rewrite
norm MetaId
m = (ProblemConstraint -> TCM ProblemConstraint)
-> (ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr]
getConstrs ProblemConstraint -> TCM ProblemConstraint
forall {m :: * -> *} {b}.
(InstantiateFull b, MonadReduce m) =>
b -> m b
instantiateBlockingFull (MetaId -> ProblemConstraint -> Bool
forall t. MentionsMeta t => MetaId -> t -> Bool
mentionsMeta MetaId
m)
where
instantiateBlockingFull :: b -> m b
instantiateBlockingFull b
p
= Lens' TCState Bool -> (Bool -> Bool) -> m b -> m b
forall a b. Lens' TCState a -> (a -> a) -> m b -> m b
forall (m :: * -> *) a b.
ReadTCState m =>
Lens' TCState a -> (a -> a) -> m b -> m b
locallyTCState (Bool -> f Bool) -> TCState -> f TCState
Lens' TCState Bool
stInstantiateBlocking (Bool -> Bool -> Bool
forall a b. a -> b -> a
const Bool
True) (m b -> m b) -> m b -> m b
forall a b. (a -> b) -> a -> b
$
b -> m b
forall a (m :: * -> *).
(InstantiateFull a, MonadReduce m) =>
a -> m a
instantiateFull b
p
nay :: MaybeT TCM Elims
nay :: MaybeT (TCMT IO) Elims
nay = TCM (Maybe Elims) -> MaybeT (TCMT IO) Elims
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (TCM (Maybe Elims) -> MaybeT (TCMT IO) Elims)
-> TCM (Maybe Elims) -> MaybeT (TCMT IO) Elims
forall a b. (a -> b) -> a -> b
$ Maybe Elims -> TCM (Maybe Elims)
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Elims
forall a. Maybe a
Nothing
hasHeadMeta :: Constraint -> Maybe Elims
hasHeadMeta Constraint
c =
case Constraint
c of
ValueCmp Comparison
_ CompareAs
_ Term
u Term
v -> Term -> Maybe Elims
isMeta Term
u Maybe Elims -> Maybe Elims -> Maybe Elims
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Term -> Maybe Elims
isMeta Term
v
ValueCmpOnFace Comparison
cmp Term
p Type
t Term
u Term
v -> Term -> Maybe Elims
isMeta Term
u Maybe Elims -> Maybe Elims -> Maybe Elims
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Term -> Maybe Elims
isMeta Term
v
ElimCmp [Polarity]
cmp [IsForced]
fs Type
t Term
v Elims
as Elims
bs -> Maybe Elims
forall a. Maybe a
Nothing
LevelCmp Comparison
cmp Level
u Level
v -> Maybe Elims
forall a. Maybe a
Nothing
SortCmp Comparison
cmp Sort
a Sort
b -> Maybe Elims
forall a. Maybe a
Nothing
UnBlock{} -> Maybe Elims
forall a. Maybe a
Nothing
FindInstance{} -> Maybe Elims
forall a. Maybe a
Nothing
IsEmpty Range
r Type
t -> Term -> Maybe Elims
isMeta (Type -> Term
forall t a. Type'' t a -> a
unEl Type
t)
CheckSizeLtSat Term
t -> Term -> Maybe Elims
isMeta Term
t
CheckFunDef{} -> Maybe Elims
forall a. Maybe a
Nothing
HasBiggerSort Sort
a -> Maybe Elims
forall a. Maybe a
Nothing
HasPTSRule Dom Type
a Abs Sort
b -> Maybe Elims
forall a. Maybe a
Nothing
UnquoteTactic{} -> Maybe Elims
forall a. Maybe a
Nothing
CheckDataSort QName
_ Sort
s -> Sort -> Maybe Elims
isMetaS Sort
s
CheckMetaInst{} -> Maybe Elims
forall a. Maybe a
Nothing
CheckType Type
t -> Term -> Maybe Elims
isMeta (Type -> Term
forall t a. Type'' t a -> a
unEl Type
t)
CheckLockedVars Term
t Type
_ Arg Term
_ Type
_ -> Term -> Maybe Elims
isMeta Term
t
UsableAtModality WhyCheckModality
_ Maybe Sort
ms Modality
_ Term
t -> Maybe Sort -> Maybe Elims -> (Sort -> Maybe Elims) -> Maybe Elims
forall a b. Maybe a -> b -> (a -> b) -> b
caseMaybe Maybe Sort
ms (Term -> Maybe Elims
isMeta Term
t) ((Sort -> Maybe Elims) -> Maybe Elims)
-> (Sort -> Maybe Elims) -> Maybe Elims
forall a b. (a -> b) -> a -> b
$ \ Sort
s -> Sort -> Maybe Elims
isMetaS Sort
s Maybe Elims -> Maybe Elims -> Maybe Elims
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Term -> Maybe Elims
isMeta Term
t
isMeta :: Term -> Maybe Elims
isMeta :: Term -> Maybe Elims
isMeta (MetaV MetaId
m' Elims
es_m) | MetaId
m MetaId -> MetaId -> Bool
forall a. Eq a => a -> a -> Bool
== MetaId
m' = Elims -> Maybe Elims
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Elims
es_m
isMeta Term
_ = Maybe Elims
forall a. Maybe a
Nothing
isMetaS :: I.Sort -> Maybe Elims
isMetaS :: Sort -> Maybe Elims
isMetaS (MetaS MetaId
m' Elims
es_m)
| MetaId
m MetaId -> MetaId -> Bool
forall a. Eq a => a -> a -> Bool
== MetaId
m' = Elims -> Maybe Elims
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Elims
es_m
isMetaS Sort
_ = Maybe Elims
forall a. Maybe a
Nothing
getConstrs :: (ProblemConstraint -> TCM ProblemConstraint)
-> (ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr]
getConstrs ProblemConstraint -> TCM ProblemConstraint
g ProblemConstraint -> Bool
f = TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a. TCM a -> TCM a
forall (tcm :: * -> *) a. MonadTCM tcm => TCM a -> tcm a
liftTCM (TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr])
-> TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ do
Constraints
cs <- Constraints -> Constraints
stripConstraintPids (Constraints -> Constraints)
-> (Constraints -> Constraints) -> Constraints -> Constraints
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProblemConstraint -> Bool) -> Constraints -> Constraints
forall a. (a -> Bool) -> [a] -> [a]
filter ProblemConstraint -> Bool
f (Constraints -> Constraints)
-> TCMT IO Constraints -> TCMT IO Constraints
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((ProblemConstraint -> TCM ProblemConstraint)
-> Constraints -> TCMT IO Constraints
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ProblemConstraint -> TCM ProblemConstraint
g (Constraints -> TCMT IO Constraints)
-> TCMT IO Constraints -> TCMT IO Constraints
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO Constraints
forall (m :: * -> *). ReadTCState m => m Constraints
M.getAllConstraints)
Constraints
cs <- TCMT IO (Maybe InteractionPoint)
-> TCMT IO Constraints
-> (InteractionPoint -> TCMT IO Constraints)
-> TCMT IO Constraints
forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> m b -> (a -> m b) -> m b
caseMaybeM ((InteractionId -> TCMT IO InteractionPoint)
-> Maybe InteractionId -> TCMT IO (Maybe InteractionPoint)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse InteractionId -> TCMT IO InteractionPoint
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m) =>
InteractionId -> m InteractionPoint
lookupInteractionPoint (Maybe InteractionId -> TCMT IO (Maybe InteractionPoint))
-> TCMT IO (Maybe InteractionId)
-> TCMT IO (Maybe InteractionPoint)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MetaId -> TCMT IO (Maybe InteractionId)
forall (m :: * -> *).
ReadTCState m =>
MetaId -> m (Maybe InteractionId)
isInteractionMeta MetaId
m) (Constraints -> TCMT IO Constraints
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Constraints
cs) ((InteractionPoint -> TCMT IO Constraints) -> TCMT IO Constraints)
-> (InteractionPoint -> TCMT IO Constraints) -> TCMT IO Constraints
forall a b. (a -> b) -> a -> b
$ \InteractionPoint
ip -> do
let
boundary :: Set (IntMap Bool)
boundary = Map (IntMap Bool) Term -> Set (IntMap Bool)
forall k a. Map k a -> Set k
MapS.keysSet (IPBoundary' Term -> Map (IntMap Bool) Term
forall t. IPBoundary' t -> Map (IntMap Bool) t
getBoundary (InteractionPoint -> IPBoundary' Term
ipBoundary InteractionPoint
ip))
isRedundant :: Constraint -> TCMT IO Bool
isRedundant Constraint
c = case Elims -> Maybe Args
forall a. [Elim' a] -> Maybe [Arg a]
allApplyElims (Elims -> Maybe Args) -> Maybe Elims -> Maybe Args
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Constraint -> Maybe Elims
hasHeadMeta Constraint
c of
Just Args
apps -> TCMT
IO (Maybe (MetaVariable, IntMap Bool, SubstCand, Substitution))
-> TCMT IO Bool
-> ((MetaVariable, IntMap Bool, SubstCand, Substitution)
-> TCMT IO Bool)
-> TCMT IO Bool
forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> m b -> (a -> m b) -> m b
caseMaybeM (MetaId
-> Args
-> TCMT
IO (Maybe (MetaVariable, IntMap Bool, SubstCand, Substitution))
isFaceConstraint MetaId
m Args
apps) (Bool -> TCMT IO Bool
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False) (((MetaVariable, IntMap Bool, SubstCand, Substitution)
-> TCMT IO Bool)
-> TCMT IO Bool)
-> ((MetaVariable, IntMap Bool, SubstCand, Substitution)
-> TCMT IO Bool)
-> TCMT IO Bool
forall a b. (a -> b) -> a -> b
$ \(MetaVariable
_, IntMap Bool
endps, SubstCand
_, Substitution
_) ->
Bool -> TCMT IO Bool
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> TCMT IO Bool) -> Bool -> TCMT IO Bool
forall a b. (a -> b) -> a -> b
$ IntMap Bool -> Set (IntMap Bool) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member IntMap Bool
endps Set (IntMap Bool)
boundary
Maybe Args
Nothing -> Bool -> TCMT IO Bool
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
(ProblemConstraint -> TCMT IO Bool)
-> Constraints -> TCMT IO Constraints
forall (m :: * -> *) a.
Applicative m =>
(a -> m Bool) -> [a] -> m [a]
filterM ((Closure Constraint
-> (Constraint -> TCMT IO Bool) -> TCMT IO Bool)
-> (Constraint -> TCMT IO Bool)
-> Closure Constraint
-> TCMT IO Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip Closure Constraint -> (Constraint -> TCMT IO Bool) -> TCMT IO Bool
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure ((Bool -> Bool) -> TCMT IO Bool -> TCMT IO Bool
forall a b. (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool -> Bool
not (TCMT IO Bool -> TCMT IO Bool)
-> (Constraint -> TCMT IO Bool) -> Constraint -> TCMT IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Constraint -> TCMT IO Bool
isRedundant) (Closure Constraint -> TCMT IO Bool)
-> (ProblemConstraint -> Closure Constraint)
-> ProblemConstraint
-> TCMT IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProblemConstraint -> Closure Constraint
theConstraint) Constraints
cs
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.constr.mentioning" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"getConstraintsMentioning"
Constraints
-> (ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Constraints
cs ((ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr])
-> (ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ \(PConstr Set ProblemId
s Blocker
ub Closure Constraint
c) -> do
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.constr.mentioning" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"constraint: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Closure Constraint -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Closure Constraint -> m Doc
prettyTCM Closure Constraint
c
Closure Constraint
c <- Rewrite -> Closure Constraint -> TCM (Closure Constraint)
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Closure Constraint
c
let hm :: Maybe Elims
hm = Constraint -> Maybe Elims
hasHeadMeta (Closure Constraint -> Constraint
forall a. Closure a -> a
clValue Closure Constraint
c)
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.constr.mentioning" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"constraint: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Closure Constraint -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Closure Constraint -> m Doc
prettyTCM Closure Constraint
c
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.constr.mentioning" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"hasHeadMeta: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Maybe Elims -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Maybe Elims -> m Doc
prettyTCM Maybe Elims
hm
case Elims -> Maybe Args
forall a. [Elim' a] -> Maybe [Arg a]
allApplyElims (Elims -> Maybe Args) -> Maybe Elims -> Maybe Args
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe Elims
hm of
Just Args
as_m -> do
MetaId
-> Args
-> Closure Constraint
-> ([(Term, Term)] -> Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall a.
MetaId
-> Args
-> Closure Constraint
-> ([(Term, Term)] -> Constraint -> TCM a)
-> TCM a
unifyElimsMeta MetaId
m Args
as_m Closure Constraint
c (([(Term, Term)] -> Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr))
-> ([(Term, Term)] -> Constraint -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall a b. (a -> b) -> a -> b
$ \ [(Term, Term)]
eqs Constraint
c -> do
(Closure (OutputForm Expr Expr)
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr))
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> Closure (OutputForm Expr Expr)
-> TCMT IO (OutputForm Expr Expr)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Closure (OutputForm Expr Expr)
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr)
OutputForm Expr Expr -> TCMT IO (ConOfAbs (OutputForm Expr Expr))
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ (Closure (OutputForm Expr Expr) -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (Closure (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ProblemConstraint -> TCMT IO (Closure (OutputForm Expr Expr))
ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
ProblemConstraint -> m (ReifiesTo ProblemConstraint)
reify (ProblemConstraint -> TCMT IO (Closure (OutputForm Expr Expr)))
-> (Closure Constraint -> ProblemConstraint)
-> Closure Constraint
-> TCMT IO (Closure (OutputForm Expr Expr))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set ProblemId -> Blocker -> Closure Constraint -> ProblemConstraint
PConstr Set ProblemId
s Blocker
ub (Closure Constraint -> TCMT IO (Closure (OutputForm Expr Expr)))
-> TCM (Closure Constraint)
-> TCMT IO (Closure (OutputForm Expr Expr))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Constraint -> TCM (Closure Constraint)
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m) =>
a -> m (Closure a)
buildClosure Constraint
c
Maybe Args
_ -> do
Closure (OutputForm Expr Expr)
cl <- ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
ProblemConstraint -> m (ReifiesTo ProblemConstraint)
reify (ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint))
-> ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint)
forall a b. (a -> b) -> a -> b
$ Set ProblemId -> Blocker -> Closure Constraint -> ProblemConstraint
PConstr Set ProblemId
s Blocker
ub Closure Constraint
c
Closure (OutputForm Expr Expr)
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure Closure (OutputForm Expr Expr)
cl OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr)
OutputForm Expr Expr -> TCMT IO (ConOfAbs (OutputForm Expr Expr))
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_
stripConstraintPids :: Constraints -> Constraints
stripConstraintPids :: Constraints -> Constraints
stripConstraintPids Constraints
cs = (ProblemConstraint -> ProblemConstraint -> Ordering)
-> Constraints -> Constraints
forall a. (a -> a -> Ordering) -> [a] -> [a]
List.sortBy (Bool -> Bool -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Bool -> Bool -> Ordering)
-> (ProblemConstraint -> Bool)
-> ProblemConstraint
-> ProblemConstraint
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` ProblemConstraint -> Bool
isBlocked) (Constraints -> Constraints) -> Constraints -> Constraints
forall a b. (a -> b) -> a -> b
$ (ProblemConstraint -> ProblemConstraint)
-> Constraints -> Constraints
forall a b. (a -> b) -> [a] -> [b]
map ProblemConstraint -> ProblemConstraint
stripPids Constraints
cs
where
isBlocked :: ProblemConstraint -> Bool
isBlocked = Bool -> Bool
not (Bool -> Bool)
-> (ProblemConstraint -> Bool) -> ProblemConstraint -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set ProblemId -> Bool
forall a. Null a => a -> Bool
null (Set ProblemId -> Bool)
-> (ProblemConstraint -> Set ProblemId)
-> ProblemConstraint
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Blocker -> Set ProblemId
allBlockingProblems (Blocker -> Set ProblemId)
-> (ProblemConstraint -> Blocker)
-> ProblemConstraint
-> Set ProblemId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProblemConstraint -> Blocker
constraintUnblocker
interestingPids :: Set ProblemId
interestingPids = [Set ProblemId] -> Set ProblemId
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions ([Set ProblemId] -> Set ProblemId)
-> [Set ProblemId] -> Set ProblemId
forall a b. (a -> b) -> a -> b
$ (ProblemConstraint -> Set ProblemId)
-> Constraints -> [Set ProblemId]
forall a b. (a -> b) -> [a] -> [b]
map (Blocker -> Set ProblemId
allBlockingProblems (Blocker -> Set ProblemId)
-> (ProblemConstraint -> Blocker)
-> ProblemConstraint
-> Set ProblemId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProblemConstraint -> Blocker
constraintUnblocker) Constraints
cs
stripPids :: ProblemConstraint -> ProblemConstraint
stripPids (PConstr Set ProblemId
pids Blocker
unblock Closure Constraint
c) = Set ProblemId -> Blocker -> Closure Constraint -> ProblemConstraint
PConstr (Set ProblemId -> Set ProblemId -> Set ProblemId
forall a. Ord a => Set a -> Set a -> Set a
Set.intersection Set ProblemId
pids Set ProblemId
interestingPids) Blocker
unblock Closure Constraint
c
{-# SPECIALIZE interactionIdToMetaId :: InteractionId -> TCM MetaId #-}
interactionIdToMetaId :: ReadTCState m => InteractionId -> m MetaId
interactionIdToMetaId :: forall (m :: * -> *). ReadTCState m => InteractionId -> m MetaId
interactionIdToMetaId InteractionId
i = do
ModuleNameHash
h <- m ModuleNameHash
forall (m :: * -> *). ReadTCState m => m ModuleNameHash
currentModuleNameHash
MetaId -> m MetaId
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MetaId
{ metaId :: Word64
metaId = InteractionId -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral InteractionId
i
, metaModule :: ModuleNameHash
metaModule = ModuleNameHash
h
}
getConstraints' :: (ProblemConstraint -> TCM ProblemConstraint) -> (ProblemConstraint -> Bool) -> TCM [OutputForm C.Expr C.Expr]
getConstraints' :: (ProblemConstraint -> TCM ProblemConstraint)
-> (ProblemConstraint -> Bool) -> TCM [OutputForm Expr Expr]
getConstraints' ProblemConstraint -> TCM ProblemConstraint
g ProblemConstraint -> Bool
f = TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a. TCM a -> TCM a
forall (tcm :: * -> *) a. MonadTCM tcm => TCM a -> tcm a
liftTCM (TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr])
-> TCM [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ do
Constraints
cs <- Constraints -> Constraints
stripConstraintPids (Constraints -> Constraints)
-> (Constraints -> Constraints) -> Constraints -> Constraints
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProblemConstraint -> Bool) -> Constraints -> Constraints
forall a. (a -> Bool) -> [a] -> [a]
filter ProblemConstraint -> Bool
f (Constraints -> Constraints)
-> TCMT IO Constraints -> TCMT IO Constraints
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((ProblemConstraint -> TCM ProblemConstraint)
-> Constraints -> TCMT IO Constraints
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ProblemConstraint -> TCM ProblemConstraint
g (Constraints -> TCMT IO Constraints)
-> TCMT IO Constraints -> TCMT IO Constraints
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO Constraints
forall (m :: * -> *). ReadTCState m => m Constraints
M.getAllConstraints)
[OutputForm Expr Expr]
cs <- Constraints
-> (ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Constraints
cs ((ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr])
-> (ProblemConstraint -> TCMT IO (OutputForm Expr Expr))
-> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ \ProblemConstraint
c -> do
Closure (OutputForm Expr Expr)
cl <- ProblemConstraint -> TCMT IO (ReifiesTo ProblemConstraint)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *).
MonadReify m =>
ProblemConstraint -> m (ReifiesTo ProblemConstraint)
reify ProblemConstraint
c
Closure (OutputForm Expr Expr)
-> (OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr))
-> TCMT IO (OutputForm Expr Expr)
forall (m :: * -> *) c a b.
(MonadTCEnv m, ReadTCState m, LensClosure c a) =>
c -> (a -> m b) -> m b
enterClosure Closure (OutputForm Expr Expr)
cl OutputForm Expr Expr -> TCMT IO (OutputForm Expr Expr)
OutputForm Expr Expr -> TCMT IO (ConOfAbs (OutputForm Expr Expr))
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_
[OutputForm Expr Expr]
ss <- ((InteractionId, MetaId, Expr) -> TCMT IO (OutputForm Expr Expr))
-> [(InteractionId, MetaId, Expr)] -> TCM [OutputForm Expr Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (InteractionId, MetaId, Expr) -> TCMT IO (OutputForm Expr Expr)
(InteractionId, MetaId, Expr)
-> TCMT IO (OutputForm (ConOfAbs Expr) Expr)
forall {m :: * -> *} {a}.
(MonadTrace m, ToConcrete a, MonadFresh NameId m,
MonadInteractionPoints m, MonadStConcreteNames m, PureTCM m,
IsString (m Doc), Null (m Doc), Semigroup (m Doc)) =>
(InteractionId, MetaId, a) -> m (OutputForm (ConOfAbs a) Expr)
toOutputForm ([(InteractionId, MetaId, Expr)] -> TCM [OutputForm Expr Expr])
-> TCMT IO [(InteractionId, MetaId, Expr)]
-> TCM [OutputForm Expr Expr]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Bool -> Rewrite -> TCMT IO [(InteractionId, MetaId, Expr)]
getSolvedInteractionPoints Bool
True Rewrite
AsIs
[OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([OutputForm Expr Expr] -> TCM [OutputForm Expr Expr])
-> [OutputForm Expr Expr] -> TCM [OutputForm Expr Expr]
forall a b. (a -> b) -> a -> b
$ [OutputForm Expr Expr]
ss [OutputForm Expr Expr]
-> [OutputForm Expr Expr] -> [OutputForm Expr Expr]
forall a. [a] -> [a] -> [a]
++ [OutputForm Expr Expr]
cs
where
toOutputForm :: (InteractionId, MetaId, a) -> m (OutputForm (ConOfAbs a) Expr)
toOutputForm (InteractionId
ii, MetaId
mi, a
e) = do
Closure Range
mv <- MetaVariable -> Closure Range
getMetaInfo (MetaVariable -> Closure Range)
-> m MetaVariable -> m (Closure Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaId -> m MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
Closure Range
-> m (OutputForm (ConOfAbs a) Expr)
-> m (OutputForm (ConOfAbs a) Expr)
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo Closure Range
mv (m (OutputForm (ConOfAbs a) Expr)
-> m (OutputForm (ConOfAbs a) Expr))
-> m (OutputForm (ConOfAbs a) Expr)
-> m (OutputForm (ConOfAbs a) Expr)
forall a b. (a -> b) -> a -> b
$ do
MetaId
mi <- InteractionId -> m MetaId
forall (m :: * -> *). ReadTCState m => InteractionId -> m MetaId
interactionIdToMetaId InteractionId
ii
let m :: Expr
m = MetaInfo -> InteractionId -> Expr
QuestionMark MetaInfo
emptyMetaInfo{ metaNumber = Just mi } InteractionId
ii
OutputForm a Expr -> m (ConOfAbs (OutputForm a Expr))
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ (OutputForm a Expr -> m (ConOfAbs (OutputForm a Expr)))
-> OutputForm a Expr -> m (ConOfAbs (OutputForm a Expr))
forall a b. (a -> b) -> a -> b
$ Range
-> [ProblemId]
-> Blocker
-> OutputConstraint a Expr
-> OutputForm a Expr
forall a b.
Range
-> [ProblemId] -> Blocker -> OutputConstraint a b -> OutputForm a b
OutputForm Range
forall a. Range' a
noRange [] Blocker
alwaysUnblock (OutputConstraint a Expr -> OutputForm a Expr)
-> OutputConstraint a Expr -> OutputForm a Expr
forall a b. (a -> b) -> a -> b
$ Expr -> a -> OutputConstraint a Expr
forall a b. b -> a -> OutputConstraint a b
Assign Expr
m a
e
getIPBoundary :: Rewrite -> InteractionId -> TCM [IPFace' C.Expr]
getIPBoundary :: Rewrite -> InteractionId -> TCM [IPFace' Expr]
getIPBoundary Rewrite
norm InteractionId
ii = InteractionId -> TCM [IPFace' Expr] -> TCM [IPFace' Expr]
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM [IPFace' Expr] -> TCM [IPFace' Expr])
-> TCM [IPFace' Expr] -> TCM [IPFace' Expr]
forall a b. (a -> b) -> a -> b
$ do
InteractionPoint
ip <- InteractionId -> TCMT IO InteractionPoint
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m) =>
InteractionId -> m InteractionPoint
lookupInteractionPoint InteractionId
ii
Term
io <- TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIOne
Term
iz <- TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIZero
InteractionId -> TCMT IO (Maybe MetaId)
forall (m :: * -> *).
ReadTCState m =>
InteractionId -> m (Maybe MetaId)
lookupInteractionMeta InteractionId
ii TCMT IO (Maybe MetaId)
-> (Maybe MetaId -> TCM [IPFace' Expr]) -> TCM [IPFace' Expr]
forall a b. TCMT IO a -> (a -> TCMT IO b) -> TCMT IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just MetaId
mi -> do
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
let t :: Type
t = Judgement MetaId -> Type
forall a. Judgement a -> Type
jMetaType (Judgement MetaId -> Type) -> Judgement MetaId -> Type
forall a b. (a -> b) -> a -> b
$ MetaVariable -> Judgement MetaId
mvJudgement MetaVariable
mv
telv :: TelView
telv@(TelV Telescope
tel Type
a) <- Type -> TCMT IO TelView
forall (m :: * -> *).
(MonadReduce m, MonadAddContext m) =>
Type -> m TelView
telView Type
t
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.ip.boundary" Int
30 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ TCMT IO Doc
"reifying interaction point boundary"
, TCMT IO Doc
"tel: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
tel
, TCMT IO Doc
"meta: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> MetaId -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => MetaId -> m Doc
prettyTCM MetaId
mi
]
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.ip.boundary" Int
30 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"boundary: " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Doc -> TCMT IO Doc
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Map (IntMap Bool) Term -> Doc
forall a. Pretty a => a -> Doc
pretty (IPBoundary' Term -> Map (IntMap Bool) Term
forall t. IPBoundary' t -> Map (IntMap Bool) t
getBoundary (InteractionPoint -> IPBoundary' Term
ipBoundary InteractionPoint
ip)))
InteractionId -> TCM [IPFace' Expr] -> TCM [IPFace' Expr]
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM [IPFace' Expr] -> TCM [IPFace' Expr])
-> TCM [IPFace' Expr] -> TCM [IPFace' Expr]
forall a b. (a -> b) -> a -> b
$ do
Args
as <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
let
c :: Term -> TCM Expr
c = Expr -> TCM Expr
Expr -> TCMT IO (ConOfAbs Expr)
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ (Expr -> TCM Expr) -> (Term -> TCM Expr) -> Term -> TCM Expr
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Term -> TCM Expr
Term -> TCMT IO (ReifiesTo Term)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked (Term -> TCM Expr) -> (Term -> TCM Term) -> Term -> TCM Expr
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Rewrite -> Term -> TCM Term
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm
go :: (IntMap Bool, Term) -> TCMT IO (IPFace' Expr)
go (IntMap Bool
im, Term
rhs) = do
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.ip.boundary" Int
30 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ TCMT IO Doc
"reifying constraint for face" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> IntMap Bool -> TCMT IO Doc
forall (m :: * -> *) a. (Applicative m, Pretty a) => a -> m Doc
TP.pretty IntMap Bool
im
]
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"tc.ip.boundary" Int
30 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"term " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Term -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Term -> m Doc
TP.prettyTCM Term
rhs
Expr
rhs <- Term -> TCM Expr
c (Term
rhs Term -> Args -> Term
forall t. Apply t => t -> Args -> t
`apply` Args
as)
[(Expr, Expr)]
eqns <- [(Int, Bool)]
-> ((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM (IntMap Bool -> [(Int, Bool)]
forall a. IntMap a -> [(Int, a)]
IntMap.toList IntMap Bool
im) (((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)])
-> ((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)]
forall a b. (a -> b) -> a -> b
$ \(Int
a, Bool
b) -> do
Expr
a <- Term -> TCM Expr
c (Int -> Elims -> Term
I.Var Int
a [])
(,) Expr
a (Expr -> (Expr, Expr)) -> TCM Expr -> TCMT IO (Expr, Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> TCM Expr
c (if Bool
b then Term
io else Term
iz)
IPFace' Expr -> TCMT IO (IPFace' Expr)
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (IPFace' Expr -> TCMT IO (IPFace' Expr))
-> IPFace' Expr -> TCMT IO (IPFace' Expr)
forall a b. (a -> b) -> a -> b
$ [(Expr, Expr)] -> Expr -> IPFace' Expr
forall t. [(t, t)] -> t -> IPFace' t
IPFace' [(Expr, Expr)]
eqns Expr
rhs
((IntMap Bool, Term) -> TCMT IO (IPFace' Expr))
-> [(IntMap Bool, Term)] -> TCM [IPFace' Expr]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (IntMap Bool, Term) -> TCMT IO (IPFace' Expr)
go ([(IntMap Bool, Term)] -> TCM [IPFace' Expr])
-> [(IntMap Bool, Term)] -> TCM [IPFace' Expr]
forall a b. (a -> b) -> a -> b
$ Map (IntMap Bool) Term -> [(IntMap Bool, Term)]
forall k a. Map k a -> [(k, a)]
MapS.toList (IPBoundary' Term -> Map (IntMap Bool) Term
forall t. IPBoundary' t -> Map (IntMap Bool) t
getBoundary (InteractionPoint -> IPBoundary' Term
ipBoundary InteractionPoint
ip))
Maybe MetaId
Nothing -> [IPFace' Expr] -> TCM [IPFace' Expr]
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
typeAndFacesInMeta :: InteractionId -> Rewrite -> Expr -> TCM (Expr, [IPFace' C.Expr])
typeAndFacesInMeta :: InteractionId -> Rewrite -> Expr -> TCM (Expr, [IPFace' Expr])
typeAndFacesInMeta InteractionId
ii Rewrite
norm Expr
expr = InteractionId
-> TCM (Expr, [IPFace' Expr]) -> TCM (Expr, [IPFace' Expr])
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM (Expr, [IPFace' Expr]) -> TCM (Expr, [IPFace' Expr]))
-> TCM (Expr, [IPFace' Expr]) -> TCM (Expr, [IPFace' Expr])
forall a b. (a -> b) -> a -> b
$ do
(Term
ex, Type
ty) <- Expr -> TCM (Term, Type)
inferExpr Expr
expr
Type
ty <- Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Type
ty
InteractionPoint
ip <- InteractionId -> TCMT IO InteractionPoint
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m) =>
InteractionId -> m InteractionPoint
lookupInteractionPoint InteractionId
ii
Term
io <- TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIOne
Term
iz <- TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIZero
let
go :: IntMap Bool -> TCMT IO (IPFace' Expr)
go IntMap Bool
im = do
let
c :: Term -> TCM Expr
c = Expr -> TCM Expr
Expr -> TCMT IO (ConOfAbs Expr)
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ (Expr -> TCM Expr) -> (Term -> TCM Expr) -> Term -> TCM Expr
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Term -> TCM Expr
Term -> TCMT IO (ReifiesTo Term)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked (Term -> TCM Expr) -> (Term -> TCM Term) -> Term -> TCM Expr
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Rewrite -> Term -> TCM Term
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm
fa :: [(Int, Bool)]
fa = IntMap Bool -> [(Int, Bool)]
forall a. IntMap a -> [(Int, a)]
IntMap.toList IntMap Bool
im
face :: (Int, Bool) -> Substitution
face (Int
i, Bool
m) = Int -> Term -> Substitution
forall a. EndoSubst a => Int -> a -> Substitution' a
inplaceS Int
i (Term -> Substitution) -> Term -> Substitution
forall a b. (a -> b) -> a -> b
$ if Bool
m then Term
io else Term
iz
sub :: Substitution
sub = ((Int, Bool) -> Substitution -> Substitution)
-> Substitution -> [(Int, Bool)] -> Substitution
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(Int, Bool)
f Substitution
s -> Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
composeS ((Int, Bool) -> Substitution
face (Int, Bool)
f) Substitution
s) Substitution
forall a. Substitution' a
idS [(Int, Bool)]
fa
[(Expr, Expr)]
eqns <- [(Int, Bool)]
-> ((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [(Int, Bool)]
fa (((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)])
-> ((Int, Bool) -> TCMT IO (Expr, Expr)) -> TCMT IO [(Expr, Expr)]
forall a b. (a -> b) -> a -> b
$ \(Int
a, Bool
b) -> do
Expr
a <- Term -> TCM Expr
c (Int -> Elims -> Term
I.Var Int
a [])
(,) Expr
a (Expr -> (Expr, Expr)) -> TCM Expr -> TCMT IO (Expr, Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Term -> TCM Expr
c (if Bool
b then Term
io else Term
iz)
(Expr -> IPFace' Expr) -> TCM Expr -> TCMT IO (IPFace' Expr)
forall a b. (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([(Expr, Expr)] -> Expr -> IPFace' Expr
forall t. [(t, t)] -> t -> IPFace' t
IPFace' [(Expr, Expr)]
eqns) (TCM Expr -> TCMT IO (IPFace' Expr))
-> (Term -> TCM Expr) -> Term -> TCMT IO (IPFace' Expr)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term -> TCM Expr
c (Term -> TCMT IO (IPFace' Expr))
-> TCM Term -> TCMT IO (IPFace' Expr)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Term -> TCM Term
forall a (m :: * -> *). (Simplify a, MonadReduce m) => a -> m a
simplify (Substitution' (SubstArg Term) -> Term -> Term
forall a. Subst a => Substitution' (SubstArg a) -> a -> a
applySubst Substitution
Substitution' (SubstArg Term)
sub Term
ex)
[IPFace' Expr]
faces <- (IntMap Bool -> TCMT IO (IPFace' Expr))
-> [IntMap Bool] -> TCM [IPFace' Expr]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse IntMap Bool -> TCMT IO (IPFace' Expr)
go ([IntMap Bool] -> TCM [IPFace' Expr])
-> [IntMap Bool] -> TCM [IPFace' Expr]
forall a b. (a -> b) -> a -> b
$ Map (IntMap Bool) Term -> [IntMap Bool]
forall k a. Map k a -> [k]
MapS.keys (IPBoundary' Term -> Map (IntMap Bool) Term
forall t. IPBoundary' t -> Map (IntMap Bool) t
getBoundary (InteractionPoint -> IPBoundary' Term
ipBoundary InteractionPoint
ip))
Expr
ty <- Type -> TCM (ReifiesTo Type)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked Type
ty
(Expr, [IPFace' Expr]) -> TCM (Expr, [IPFace' Expr])
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Expr
ty, [IPFace' Expr]
faces)
getGoals :: TCM Goals
getGoals :: TCM Goals
getGoals = Rewrite -> Rewrite -> TCM Goals
getGoals' Rewrite
AsIs Rewrite
Simplified
getGoals'
:: Rewrite
-> Rewrite
-> TCM Goals
getGoals' :: Rewrite -> Rewrite -> TCM Goals
getGoals' Rewrite
normVisible Rewrite
normHidden = do
[OutputConstraint Expr InteractionId]
visibleMetas <- Rewrite -> TCM [OutputConstraint Expr InteractionId]
typesOfVisibleMetas Rewrite
normVisible
[OutputConstraint Expr NamedMeta]
hiddenMetas <- Rewrite -> TCM [OutputConstraint Expr NamedMeta]
typesOfHiddenMetas Rewrite
normHidden
Goals -> TCM Goals
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([OutputConstraint Expr InteractionId]
visibleMetas, [OutputConstraint Expr NamedMeta]
hiddenMetas)
showGoals :: Goals -> TCM String
showGoals :: Goals -> TCM ArgName
showGoals ([OutputConstraint Expr InteractionId]
ims, [OutputConstraint Expr NamedMeta]
hms) = do
[Doc]
di <- [OutputConstraint Expr InteractionId]
-> (OutputConstraint Expr InteractionId -> TCMT IO Doc)
-> TCMT IO [Doc]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [OutputConstraint Expr InteractionId]
ims ((OutputConstraint Expr InteractionId -> TCMT IO Doc)
-> TCMT IO [Doc])
-> (OutputConstraint Expr InteractionId -> TCMT IO Doc)
-> TCMT IO [Doc]
forall a b. (a -> b) -> a -> b
$ \ OutputConstraint Expr InteractionId
i ->
InteractionId -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId (OutputForm Expr InteractionId -> InteractionId
forall a b. OutputForm a b -> b
outputFormId (OutputForm Expr InteractionId -> InteractionId)
-> OutputForm Expr InteractionId -> InteractionId
forall a b. (a -> b) -> a -> b
$ Range
-> [ProblemId]
-> Blocker
-> OutputConstraint Expr InteractionId
-> OutputForm Expr InteractionId
forall a b.
Range
-> [ProblemId] -> Blocker -> OutputConstraint a b -> OutputForm a b
OutputForm Range
forall a. Range' a
noRange [] Blocker
alwaysUnblock OutputConstraint Expr InteractionId
i) (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$
OutputConstraint Expr InteractionId -> TCMT IO Doc
forall a (m :: * -> *).
(ToConcrete a, Pretty (ConOfAbs a), MonadAbsToCon m) =>
a -> m Doc
prettyATop OutputConstraint Expr InteractionId
i
Names
dh <- (OutputConstraint Expr NamedMeta -> TCM ArgName)
-> [OutputConstraint Expr NamedMeta] -> TCMT IO Names
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM OutputConstraint Expr NamedMeta -> TCM ArgName
showA' [OutputConstraint Expr NamedMeta]
hms
ArgName -> TCM ArgName
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ArgName -> TCM ArgName) -> ArgName -> TCM ArgName
forall a b. (a -> b) -> a -> b
$ Names -> ArgName
unlines (Names -> ArgName) -> Names -> ArgName
forall a b. (a -> b) -> a -> b
$ (Doc -> ArgName) -> [Doc] -> Names
forall a b. (a -> b) -> [a] -> [b]
map Doc -> ArgName
forall a. Show a => a -> ArgName
show [Doc]
di Names -> Names -> Names
forall a. [a] -> [a] -> [a]
++ Names
dh
where
showA' :: OutputConstraint A.Expr NamedMeta -> TCM String
showA' :: OutputConstraint Expr NamedMeta -> TCM ArgName
showA' OutputConstraint Expr NamedMeta
m = do
let i :: MetaId
i = NamedMeta -> MetaId
nmid (NamedMeta -> MetaId) -> NamedMeta -> MetaId
forall a b. (a -> b) -> a -> b
$ OutputConstraint Expr NamedMeta -> NamedMeta
forall a. OutputConstraint Expr a -> a
namedMetaOf OutputConstraint Expr NamedMeta
m
Range
r <- MetaId -> TCMT IO Range
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m Range
getMetaRange MetaId
i
Doc
d <- MetaId -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *) a.
(HasCallStack, MonadDebug m, MonadTCEnv m, MonadTrace m,
ReadTCState m) =>
MetaId -> m a -> m a
withMetaId MetaId
i (OutputConstraint Expr NamedMeta -> TCMT IO Doc
forall a (m :: * -> *).
(ToConcrete a, Pretty (ConOfAbs a), MonadAbsToCon m) =>
a -> m Doc
prettyATop OutputConstraint Expr NamedMeta
m)
ArgName -> TCM ArgName
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ArgName -> TCM ArgName) -> ArgName -> TCM ArgName
forall a b. (a -> b) -> a -> b
$ Doc -> ArgName
forall a. Show a => a -> ArgName
show Doc
d ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
" [ at " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ Range -> ArgName
forall a. Pretty a => a -> ArgName
prettyShow Range
r ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
" ]"
getWarningsAndNonFatalErrors :: TCM WarningsAndNonFatalErrors
getWarningsAndNonFatalErrors :: TCM WarningsAndNonFatalErrors
getWarningsAndNonFatalErrors = do
[TCWarning]
mws <- WhichWarnings -> TCMT IO [TCWarning]
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadWarning m, MonadTCM m) =>
WhichWarnings -> m [TCWarning]
getAllWarnings WhichWarnings
AllWarnings
let notMetaWarnings :: [TCWarning]
notMetaWarnings = (TCWarning -> Bool) -> [TCWarning] -> [TCWarning]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (TCWarning -> Bool) -> TCWarning -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TCWarning -> Bool
isMetaTCWarning) [TCWarning]
mws
WarningsAndNonFatalErrors -> TCM WarningsAndNonFatalErrors
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (WarningsAndNonFatalErrors -> TCM WarningsAndNonFatalErrors)
-> WarningsAndNonFatalErrors -> TCM WarningsAndNonFatalErrors
forall a b. (a -> b) -> a -> b
$ case [TCWarning]
notMetaWarnings of
ws :: [TCWarning]
ws@(TCWarning
_:[TCWarning]
_) -> [TCWarning] -> WarningsAndNonFatalErrors
classifyWarnings [TCWarning]
ws
[TCWarning]
_ -> WarningsAndNonFatalErrors
emptyWarningsAndNonFatalErrors
getResponseContext
:: Rewrite
-> InteractionId
-> TCM [ResponseContextEntry]
getResponseContext :: Rewrite -> InteractionId -> TCM [ResponseContextEntry]
getResponseContext Rewrite
norm InteractionId
ii = InteractionId -> Rewrite -> TCM [ResponseContextEntry]
contextOfMeta InteractionId
ii Rewrite
norm
getSolvedInteractionPoints :: Bool -> Rewrite -> TCM [(InteractionId, MetaId, Expr)]
getSolvedInteractionPoints :: Bool -> Rewrite -> TCMT IO [(InteractionId, MetaId, Expr)]
getSolvedInteractionPoints Bool
all Rewrite
norm = [[(InteractionId, MetaId, Expr)]]
-> [(InteractionId, MetaId, Expr)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(InteractionId, MetaId, Expr)]]
-> [(InteractionId, MetaId, Expr)])
-> TCMT IO [[(InteractionId, MetaId, Expr)]]
-> TCMT IO [(InteractionId, MetaId, Expr)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
((InteractionId, MetaId)
-> TCMT IO [(InteractionId, MetaId, Expr)])
-> [(InteractionId, MetaId)]
-> TCMT IO [[(InteractionId, MetaId, Expr)]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (InteractionId, MetaId) -> TCMT IO [(InteractionId, MetaId, Expr)]
solution ([(InteractionId, MetaId)]
-> TCMT IO [[(InteractionId, MetaId, Expr)]])
-> TCMT IO [(InteractionId, MetaId)]
-> TCMT IO [[(InteractionId, MetaId, Expr)]]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO [(InteractionId, MetaId)]
forall (m :: * -> *). ReadTCState m => m [(InteractionId, MetaId)]
getInteractionIdsAndMetas
where
solution :: (InteractionId, MetaId) -> TCMT IO [(InteractionId, MetaId, Expr)]
solution (InteractionId
i, MetaId
m) = do
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
m
Closure Range
-> TCMT IO [(InteractionId, MetaId, Expr)]
-> TCMT IO [(InteractionId, MetaId, Expr)]
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo (MetaVariable -> Closure Range
getMetaInfo MetaVariable
mv) (TCMT IO [(InteractionId, MetaId, Expr)]
-> TCMT IO [(InteractionId, MetaId, Expr)])
-> TCMT IO [(InteractionId, MetaId, Expr)]
-> TCMT IO [(InteractionId, MetaId, Expr)]
forall a b. (a -> b) -> a -> b
$ do
Args
args <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
ScopeInfo
scope <- TCMT IO ScopeInfo
forall (m :: * -> *). ReadTCState m => m ScopeInfo
getScope
let sol :: Term -> TCMT IO [(InteractionId, MetaId, Expr)]
sol Term
v = do
Term
v <- Term -> TCM Term
forall a (m :: * -> *). (Instantiate a, MonadReduce m) => a -> m a
instantiate Term
v
let isMeta :: Bool
isMeta = case Term
v of MetaV{} -> Bool
True; Term
_ -> Bool
False
if Bool
isMeta Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
all then [(InteractionId, MetaId, Expr)]
-> TCMT IO [(InteractionId, MetaId, Expr)]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [] else do
Expr
e <- Expr -> TCM Expr
forall (m :: * -> *) a.
(MonadTCEnv m, MonadDebug m, BlankVars a) =>
a -> m a
blankNotInScope (Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Term -> TCM Expr
Term -> TCMT IO (ReifiesTo Term)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Term -> m (ReifiesTo Term)
reify (Term -> TCM Expr) -> TCM Term -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Term -> TCM Term
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Term
v
[(InteractionId, MetaId, Expr)]
-> TCMT IO [(InteractionId, MetaId, Expr)]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [(InteractionId
i, MetaId
m, ScopeInfo -> Expr -> Expr
ScopedExpr ScopeInfo
scope Expr
e)]
unsol :: TCMT IO [a]
unsol = [a] -> TCMT IO [a]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
case MetaVariable -> MetaInstantiation
mvInstantiation MetaVariable
mv of
InstV{} -> Term -> TCMT IO [(InteractionId, MetaId, Expr)]
sol (MetaId -> Elims -> Term
MetaV MetaId
m (Elims -> Term) -> Elims -> Term
forall a b. (a -> b) -> a -> b
$ (Arg Term -> Elim' Term) -> Args -> Elims
forall a b. (a -> b) -> [a] -> [b]
map Arg Term -> Elim' Term
forall a. Arg a -> Elim' a
Apply Args
args)
Open{} -> TCMT IO [(InteractionId, MetaId, Expr)]
forall {a}. TCMT IO [a]
unsol
OpenInstance{} -> TCMT IO [(InteractionId, MetaId, Expr)]
forall {a}. TCMT IO [a]
unsol
BlockedConst{} -> TCMT IO [(InteractionId, MetaId, Expr)]
forall {a}. TCMT IO [a]
unsol
PostponedTypeCheckingProblem{} -> TCMT IO [(InteractionId, MetaId, Expr)]
forall {a}. TCMT IO [a]
unsol
typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputConstraint Expr NamedMeta)
typeOfMetaMI :: Rewrite -> MetaId -> TCM (OutputConstraint Expr NamedMeta)
typeOfMetaMI Rewrite
norm MetaId
mi =
do MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
Closure Range
-> TCM (OutputConstraint Expr NamedMeta)
-> TCM (OutputConstraint Expr NamedMeta)
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo (MetaVariable -> Closure Range
getMetaInfo MetaVariable
mv) (TCM (OutputConstraint Expr NamedMeta)
-> TCM (OutputConstraint Expr NamedMeta))
-> TCM (OutputConstraint Expr NamedMeta)
-> TCM (OutputConstraint Expr NamedMeta)
forall a b. (a -> b) -> a -> b
$
MetaVariable
-> Judgement MetaId -> TCM (OutputConstraint Expr NamedMeta)
rewriteJudg MetaVariable
mv (MetaVariable -> Judgement MetaId
mvJudgement MetaVariable
mv)
where
rewriteJudg :: MetaVariable -> Judgement MetaId ->
TCM (OutputConstraint Expr NamedMeta)
rewriteJudg :: MetaVariable
-> Judgement MetaId -> TCM (OutputConstraint Expr NamedMeta)
rewriteJudg MetaVariable
mv (HasType MetaId
i Comparison
cmp Type
t) = do
ArgName
ms <- MetaId -> TCM ArgName
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m ArgName
getMetaNameSuggestion MetaId
i
Args
vs <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
Type
t <- Type
t Type -> Args -> TCMT IO Type
forall a (m :: * -> *).
(PiApplyM a, MonadReduce m, HasBuiltins m) =>
Type -> a -> m Type
forall (m :: * -> *).
(MonadReduce m, HasBuiltins m) =>
Type -> Args -> m Type
`piApplyM` Permutation -> Args -> Args
forall a. Permutation -> [a] -> [a]
permute (Int -> Permutation -> Permutation
takeP (Args -> Int
forall a. Sized a => a -> Int
size Args
vs) (Permutation -> Permutation) -> Permutation -> Permutation
forall a b. (a -> b) -> a -> b
$ MetaVariable -> Permutation
mvPermutation MetaVariable
mv) Args
vs
Type
t <- Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Type
t
let x :: NamedMeta
x = ArgName -> MetaId -> NamedMeta
NamedMeta ArgName
ms MetaId
i
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interactive.meta" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName -> TCMT IO Doc) -> ArgName -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Names -> ArgName
unwords [ArgName
"permuting", MetaId -> ArgName
forall a. Show a => a -> ArgName
show MetaId
i, ArgName
"with", Permutation -> ArgName
forall a. Show a => a -> ArgName
show (Permutation -> ArgName) -> Permutation -> ArgName
forall a b. (a -> b) -> a -> b
$ MetaVariable -> Permutation
mvPermutation MetaVariable
mv]
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ TCMT IO Doc
"len =" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (Int -> ArgName
forall a. Show a => a -> ArgName
show (Int -> ArgName) -> Int -> ArgName
forall a b. (a -> b) -> a -> b
$ Args -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Args
vs)
, TCMT IO Doc
"args =" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Args -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Args -> m Doc
prettyTCM Args
vs
, TCMT IO Doc
"t =" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Type -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Type -> m Doc
prettyTCM Type
t
, TCMT IO Doc
"x =" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> NamedMeta -> TCMT IO Doc
forall (m :: * -> *) a. (Applicative m, Pretty a) => a -> m Doc
TP.pretty NamedMeta
x
]
]
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interactive.meta.scope" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ ArgName -> TCMT IO Doc
forall (m :: * -> *). Applicative m => ArgName -> m Doc
TP.text (ArgName -> TCMT IO Doc) -> ArgName -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ ScopeInfo -> ArgName
forall a. Show a => a -> ArgName
show (ScopeInfo -> ArgName) -> ScopeInfo -> ArgName
forall a b. (a -> b) -> a -> b
$ MetaVariable -> ScopeInfo
getMetaScope MetaVariable
mv
NamedMeta -> Expr -> OutputConstraint Expr NamedMeta
forall a b. b -> a -> OutputConstraint a b
OfType NamedMeta
x (Expr -> OutputConstraint Expr NamedMeta)
-> TCM Expr -> TCM (OutputConstraint Expr NamedMeta)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Type -> TCM (ReifiesTo Type)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked Type
t
rewriteJudg MetaVariable
mv (IsSort MetaId
i Type
t) = do
ArgName
ms <- MetaId -> TCM ArgName
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m ArgName
getMetaNameSuggestion MetaId
i
OutputConstraint Expr NamedMeta
-> TCM (OutputConstraint Expr NamedMeta)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint Expr NamedMeta
-> TCM (OutputConstraint Expr NamedMeta))
-> OutputConstraint Expr NamedMeta
-> TCM (OutputConstraint Expr NamedMeta)
forall a b. (a -> b) -> a -> b
$ NamedMeta -> OutputConstraint Expr NamedMeta
forall a b. b -> OutputConstraint a b
JustSort (NamedMeta -> OutputConstraint Expr NamedMeta)
-> NamedMeta -> OutputConstraint Expr NamedMeta
forall a b. (a -> b) -> a -> b
$ ArgName -> MetaId -> NamedMeta
NamedMeta ArgName
ms MetaId
i
typeOfMeta :: Rewrite -> InteractionId -> TCM (OutputConstraint Expr InteractionId)
typeOfMeta :: Rewrite
-> InteractionId -> TCM (OutputConstraint Expr InteractionId)
typeOfMeta Rewrite
norm InteractionId
ii = Rewrite
-> (InteractionId, MetaId)
-> TCM (OutputConstraint Expr InteractionId)
typeOfMeta' Rewrite
norm ((InteractionId, MetaId)
-> TCM (OutputConstraint Expr InteractionId))
-> (MetaId -> (InteractionId, MetaId))
-> MetaId
-> TCM (OutputConstraint Expr InteractionId)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (InteractionId
ii,) (MetaId -> TCM (OutputConstraint Expr InteractionId))
-> TCMT IO MetaId -> TCM (OutputConstraint Expr InteractionId)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
typeOfMeta' :: Rewrite -> (InteractionId, MetaId) -> TCM (OutputConstraint Expr InteractionId)
typeOfMeta' :: Rewrite
-> (InteractionId, MetaId)
-> TCM (OutputConstraint Expr InteractionId)
typeOfMeta' Rewrite
norm (InteractionId
ii, MetaId
mi) = (NamedMeta -> InteractionId)
-> OutputConstraint Expr NamedMeta
-> OutputConstraint Expr InteractionId
forall a b.
(a -> b) -> OutputConstraint Expr a -> OutputConstraint Expr b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\NamedMeta
_ -> InteractionId
ii) (OutputConstraint Expr NamedMeta
-> OutputConstraint Expr InteractionId)
-> TCM (OutputConstraint Expr NamedMeta)
-> TCM (OutputConstraint Expr InteractionId)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Rewrite -> MetaId -> TCM (OutputConstraint Expr NamedMeta)
typeOfMetaMI Rewrite
norm MetaId
mi
typesOfVisibleMetas :: Rewrite -> TCM [OutputConstraint Expr InteractionId]
typesOfVisibleMetas :: Rewrite -> TCM [OutputConstraint Expr InteractionId]
typesOfVisibleMetas Rewrite
norm =
TCM [OutputConstraint Expr InteractionId]
-> TCM [OutputConstraint Expr InteractionId]
forall a. TCM a -> TCM a
forall (tcm :: * -> *) a. MonadTCM tcm => TCM a -> tcm a
liftTCM (TCM [OutputConstraint Expr InteractionId]
-> TCM [OutputConstraint Expr InteractionId])
-> TCM [OutputConstraint Expr InteractionId]
-> TCM [OutputConstraint Expr InteractionId]
forall a b. (a -> b) -> a -> b
$ ((InteractionId, MetaId)
-> TCM (OutputConstraint Expr InteractionId))
-> [(InteractionId, MetaId)]
-> TCM [OutputConstraint Expr InteractionId]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Rewrite
-> (InteractionId, MetaId)
-> TCM (OutputConstraint Expr InteractionId)
typeOfMeta' Rewrite
norm) ([(InteractionId, MetaId)]
-> TCM [OutputConstraint Expr InteractionId])
-> TCMT IO [(InteractionId, MetaId)]
-> TCM [OutputConstraint Expr InteractionId]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO [(InteractionId, MetaId)]
forall (m :: * -> *). ReadTCState m => m [(InteractionId, MetaId)]
getInteractionIdsAndMetas
typesOfHiddenMetas :: Rewrite -> TCM [OutputConstraint Expr NamedMeta]
typesOfHiddenMetas :: Rewrite -> TCM [OutputConstraint Expr NamedMeta]
typesOfHiddenMetas Rewrite
norm = TCM [OutputConstraint Expr NamedMeta]
-> TCM [OutputConstraint Expr NamedMeta]
forall a. TCM a -> TCM a
forall (tcm :: * -> *) a. MonadTCM tcm => TCM a -> tcm a
liftTCM (TCM [OutputConstraint Expr NamedMeta]
-> TCM [OutputConstraint Expr NamedMeta])
-> TCM [OutputConstraint Expr NamedMeta]
-> TCM [OutputConstraint Expr NamedMeta]
forall a b. (a -> b) -> a -> b
$ do
[MetaId]
is <- TCMT IO [MetaId]
forall (m :: * -> *). ReadTCState m => m [MetaId]
getInteractionMetas
Map MetaId MetaVariable
store <- (MetaId -> MetaVariable -> Bool)
-> Map MetaId MetaVariable -> Map MetaId MetaVariable
forall k a. (k -> a -> Bool) -> Map k a -> Map k a
MapS.filterWithKey ([MetaId] -> MetaId -> MetaVariable -> Bool
forall {t :: * -> *} {a}.
(Foldable t, Eq a) =>
t a -> a -> MetaVariable -> Bool
implicit [MetaId]
is) (Map MetaId MetaVariable -> Map MetaId MetaVariable)
-> TCMT IO (Map MetaId MetaVariable)
-> TCMT IO (Map MetaId MetaVariable)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Lens' TCState (Map MetaId MetaVariable)
-> TCMT IO (Map MetaId MetaVariable)
forall (m :: * -> *) a. ReadTCState m => Lens' TCState a -> m a
useR (Map MetaId MetaVariable -> f (Map MetaId MetaVariable))
-> TCState -> f TCState
Lens' TCState (Map MetaId MetaVariable)
stOpenMetaStore
(MetaId -> TCM (OutputConstraint Expr NamedMeta))
-> [MetaId] -> TCM [OutputConstraint Expr NamedMeta]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Rewrite -> MetaId -> TCM (OutputConstraint Expr NamedMeta)
typeOfMetaMI Rewrite
norm) ([MetaId] -> TCM [OutputConstraint Expr NamedMeta])
-> [MetaId] -> TCM [OutputConstraint Expr NamedMeta]
forall a b. (a -> b) -> a -> b
$ Map MetaId MetaVariable -> [MetaId]
forall k a. Map k a -> [k]
MapS.keys Map MetaId MetaVariable
store
where
implicit :: t a -> a -> MetaVariable -> Bool
implicit t a
is a
x MetaVariable
m | Maybe MetaId -> Bool
forall a. Maybe a -> Bool
isJust (MetaVariable -> Maybe MetaId
mvTwin MetaVariable
m) = Bool
False
implicit t a
is a
x MetaVariable
m =
case MetaVariable -> MetaInstantiation
mvInstantiation MetaVariable
m of
M.InstV{} -> Bool
forall a. HasCallStack => a
__IMPOSSIBLE__
MetaInstantiation
M.Open -> a
x a -> t a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` t a
is
MetaInstantiation
M.OpenInstance -> a
x a -> t a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` t a
is
M.BlockedConst{} -> Bool
False
M.PostponedTypeCheckingProblem{} -> Bool
False
metaHelperType :: Rewrite -> InteractionId -> Range -> String -> TCM (OutputConstraint' Expr Expr)
metaHelperType :: Rewrite
-> InteractionId
-> Range
-> ArgName
-> TCM (OutputConstraint' Expr Expr)
metaHelperType Rewrite
norm InteractionId
ii Range
rng ArgName
s = case ArgName -> Names
words ArgName
s of
[] -> TCM (OutputConstraint' Expr Expr)
forall {a}. TCMT IO a
failure
ArgName
f : Names
_ -> InteractionId
-> TCM (OutputConstraint' Expr Expr)
-> TCM (OutputConstraint' Expr Expr)
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM (OutputConstraint' Expr Expr)
-> TCM (OutputConstraint' Expr Expr))
-> TCM (OutputConstraint' Expr Expr)
-> TCM (OutputConstraint' Expr Expr)
forall a b. (a -> b) -> a -> b
$ do
ArgName -> ScopeM ()
ensureName ArgName
f
A.Application Expr
h [NamedArg Expr]
args <- Expr -> AppView' Expr
A.appView (Expr -> AppView' Expr) -> (Expr -> Expr) -> Expr -> AppView' Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr -> Expr
getBody (Expr -> Expr) -> (Expr -> Expr) -> Expr -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr -> Expr
forall a. ExprLike a => a -> a
deepUnscope (Expr -> AppView' Expr) -> TCM Expr -> TCMT IO (AppView' Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> InteractionId -> Range -> ArgName -> TCM Expr
parseExprIn InteractionId
ii Range
rng (ArgName
"let " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
f ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
" = _ in " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
s)
Name -> Bool
inCxt <- [Name] -> Name -> Bool
forall a. Ord a => [a] -> a -> Bool
hasElem ([Name] -> Name -> Bool)
-> TCMT IO [Name] -> TCMT IO (Name -> Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO [Name]
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m [Name]
getContextNames
Args
cxtArgs <- TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
QName
enclosingFunctionName <- IPClause -> QName
ipcQName (IPClause -> QName) -> (TCEnv -> IPClause) -> TCEnv -> QName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TCEnv -> IPClause
envClause (TCEnv -> QName) -> TCMT IO TCEnv -> TCMT IO QName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO TCEnv
getEnv
Type
a0 <- (Type -> Args -> Type
`piApply` Args
cxtArgs) (Type -> Type) -> TCMT IO Type -> TCMT IO Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MetaId -> TCMT IO Type
forall (m :: * -> *). ReadTCState m => MetaId -> m Type
getMetaType (MetaId -> TCMT IO Type) -> TCMT IO MetaId -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii)
Int
freeVars <- TCM Int
getCurrentModuleFreeVars
[ContextEntry]
contextForAbstracting <- Int -> [ContextEntry] -> [ContextEntry]
forall a. Int -> [a] -> [a]
drop Int
freeVars ([ContextEntry] -> [ContextEntry])
-> ([ContextEntry] -> [ContextEntry])
-> [ContextEntry]
-> [ContextEntry]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ContextEntry] -> [ContextEntry]
forall a. [a] -> [a]
reverse ([ContextEntry] -> [ContextEntry])
-> TCMT IO [ContextEntry] -> TCMT IO [ContextEntry]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO [ContextEntry]
forall (m :: * -> *). MonadTCEnv m => m [ContextEntry]
getContext
let escapeAbstractedContext :: TCM Expr -> TCM Expr
escapeAbstractedContext = Impossible -> Int -> TCM Expr -> TCM Expr
forall (m :: * -> *) a.
MonadAddContext m =>
Impossible -> Int -> m a -> m a
escapeContext Impossible
HasCallStack => Impossible
impossible ([ContextEntry] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ContextEntry]
contextForAbstracting)
case (NamedArg Expr -> Maybe Name) -> [NamedArg Expr] -> Maybe [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Expr -> Maybe Name
isVar (Expr -> Maybe Name)
-> (NamedArg Expr -> Expr) -> NamedArg Expr -> Maybe Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NamedArg Expr -> Expr
forall a. NamedArg a -> a
namedArg) [NamedArg Expr]
args Maybe [Name] -> ([Name] -> Maybe [Name]) -> Maybe [Name]
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ [Name]
xs -> [Name]
xs [Name] -> Maybe () -> Maybe [Name]
forall a b. a -> Maybe b -> Maybe a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard ((Name -> Bool) -> [Name] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Name -> Bool
inCxt [Name]
xs) of
Just [Name]
xs -> do
let inXs :: Name -> Bool
inXs = [Name] -> Name -> Bool
forall a. Ord a => [a] -> a -> Bool
hasElem [Name]
xs
let hideButXs :: ContextEntry -> ContextEntry
hideButXs ContextEntry
dom = Hiding -> ContextEntry -> ContextEntry
forall a. LensHiding a => Hiding -> a -> a
setHiding (if Name -> Bool
inXs (Name -> Bool) -> Name -> Bool
forall a b. (a -> b) -> a -> b
$ (Name, Type) -> Name
forall a b. (a, b) -> a
fst ((Name, Type) -> Name) -> (Name, Type) -> Name
forall a b. (a -> b) -> a -> b
$ ContextEntry -> (Name, Type)
forall t e. Dom' t e -> e
unDom ContextEntry
dom then Hiding
NotHidden else Hiding
Hidden) ContextEntry
dom
let tel :: Telescope
tel = ListTel -> Telescope
telFromList (ListTel -> Telescope)
-> ([ContextEntry] -> ListTel) -> [ContextEntry] -> Telescope
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ContextEntry -> Dom (ArgName, Type)) -> [ContextEntry] -> ListTel
forall a b. (a -> b) -> [a] -> [b]
map (((Name, Type) -> (ArgName, Type))
-> ContextEntry -> Dom (ArgName, Type)
forall a b. (a -> b) -> Dom' Term a -> Dom' Term b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Name -> ArgName) -> (Name, Type) -> (ArgName, Type)
forall b c d. (b -> c) -> (b, d) -> (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Name -> ArgName
nameToArgName) (ContextEntry -> Dom (ArgName, Type))
-> (ContextEntry -> ContextEntry)
-> ContextEntry
-> Dom (ArgName, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContextEntry -> ContextEntry
hideButXs) ([ContextEntry] -> Telescope) -> [ContextEntry] -> Telescope
forall a b. (a -> b) -> a -> b
$ [ContextEntry]
contextForAbstracting
Expr -> Expr -> OutputConstraint' Expr Expr
forall a b. b -> a -> OutputConstraint' a b
OfType' Expr
h (Expr -> OutputConstraint' Expr Expr)
-> TCM Expr -> TCM (OutputConstraint' Expr Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
(TCEnv -> TCEnv) -> TCM Expr -> TCM Expr
forall a. (TCEnv -> TCEnv) -> TCMT IO a -> TCMT IO a
forall (m :: * -> *) a.
MonadTCEnv m =>
(TCEnv -> TCEnv) -> m a -> m a
localTC (\TCEnv
e -> TCEnv
e { envPrintDomainFreePi = True }) (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ TCM Expr -> TCM Expr
escapeAbstractedContext (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ TCM Expr -> TCM Expr
forall (m :: * -> *) a. ReadTCState m => m a -> m a
withoutPrintingGeneralization (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$
Type -> TCM (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> TCM (ReifiesTo Type)) -> Type -> TCM (ReifiesTo Type)
forall a b. (a -> b) -> a -> b
$ Telescope -> Type -> Type
telePiVisible Telescope
tel Type
a0
Maybe [Name]
Nothing -> do
let tel :: Telescope
tel = Identity Telescope -> Telescope
forall a. Identity a -> a
runIdentity (Identity Telescope -> Telescope)
-> ([ContextEntry] -> Identity Telescope)
-> [ContextEntry]
-> Telescope
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArgName -> Identity ArgName) -> Telescope -> Identity Telescope
forall (f :: * -> *).
Applicative f =>
(ArgName -> f ArgName) -> Telescope -> f Telescope
onNamesTel ArgName -> Identity ArgName
forall {a} {m :: * -> *}. (Eq a, IsString a, Monad m) => a -> m a
unW (Telescope -> Identity Telescope)
-> ([ContextEntry] -> Telescope)
-> [ContextEntry]
-> Identity Telescope
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name -> ArgName) -> [ContextEntry] -> Telescope
forall a. (a -> ArgName) -> ListTel' a -> Telescope
telFromList' Name -> ArgName
nameToArgName ([ContextEntry] -> Telescope) -> [ContextEntry] -> Telescope
forall a b. (a -> b) -> a -> b
$ [ContextEntry]
contextForAbstracting
let a :: Type
a = Identity Type -> Type
forall a. Identity a -> a
runIdentity (Identity Type -> Type) -> (Type -> Identity Type) -> Type -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArgName -> Identity ArgName) -> Type -> Identity Type
forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames ArgName -> Identity ArgName
forall {a} {m :: * -> *}. (Eq a, IsString a, Monad m) => a -> m a
unW (Type -> Type) -> Type -> Type
forall a b. (a -> b) -> a -> b
$ Type
a0
[Arg (Term, EqualityView)]
vtys <- (NamedArg Expr -> TCMT IO (Arg (Term, EqualityView)))
-> [NamedArg Expr] -> TCMT IO [Arg (Term, EqualityView)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\ NamedArg Expr
a -> ((Term, Type) -> Arg (Term, EqualityView))
-> TCM (Term, Type) -> TCMT IO (Arg (Term, EqualityView))
forall a b. (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ArgInfo -> (Term, EqualityView) -> Arg (Term, EqualityView)
forall e. ArgInfo -> e -> Arg e
Arg (NamedArg Expr -> ArgInfo
forall a. LensArgInfo a => a -> ArgInfo
getArgInfo NamedArg Expr
a) ((Term, EqualityView) -> Arg (Term, EqualityView))
-> ((Term, Type) -> (Term, EqualityView))
-> (Term, Type)
-> Arg (Term, EqualityView)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Type -> EqualityView) -> (Term, Type) -> (Term, EqualityView)
forall a b. (a -> b) -> (Term, a) -> (Term, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Type -> EqualityView
OtherType) (TCM (Term, Type) -> TCMT IO (Arg (Term, EqualityView)))
-> TCM (Term, Type) -> TCMT IO (Arg (Term, EqualityView))
forall a b. (a -> b) -> a -> b
$ Expr -> TCM (Term, Type)
inferExpr (Expr -> TCM (Term, Type)) -> Expr -> TCM (Term, Type)
forall a b. (a -> b) -> a -> b
$ NamedArg Expr -> Expr
forall a. NamedArg a -> a
namedArg NamedArg Expr
a) [NamedArg Expr]
args
TelV Telescope
atel Type
_ <- Type -> TCMT IO TelView
forall (m :: * -> *).
(MonadReduce m, MonadAddContext m) =>
Type -> m TelView
telView Type
a
let arity :: Int
arity = Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
atel
(Telescope
delta1, Telescope
delta2, Permutation
_, Type
a', [Arg (Term, EqualityView)]
vtys') = Telescope
-> Type
-> [Arg (Term, EqualityView)]
-> (Telescope, Telescope, Permutation, Type,
[Arg (Term, EqualityView)])
splitTelForWith Telescope
tel Type
a [Arg (Term, EqualityView)]
vtys
Expr
a <- (TCEnv -> TCEnv) -> TCM Expr -> TCM Expr
forall a. (TCEnv -> TCEnv) -> TCMT IO a -> TCMT IO a
forall (m :: * -> *) a.
MonadTCEnv m =>
(TCEnv -> TCEnv) -> m a -> m a
localTC (\TCEnv
e -> TCEnv
e { envPrintDomainFreePi = True, envPrintMetasBare = True }) (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ TCM Expr -> TCM Expr
escapeAbstractedContext (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ TCM Expr -> TCM Expr
forall (m :: * -> *) a. ReadTCState m => m a -> m a
withoutPrintingGeneralization (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ do
Type -> TCM Expr
Type -> TCM (ReifiesTo Type)
forall i (m :: * -> *).
(Reify i, MonadReify m) =>
i -> m (ReifiesTo i)
forall (m :: * -> *). MonadReify m => Type -> m (ReifiesTo Type)
reify (Type -> TCM Expr) -> TCMT IO Type -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int -> [NamedArg Expr] -> Type -> TCMT IO Type
cleanupType Int
arity [NamedArg Expr]
args (Type -> TCMT IO Type) -> TCMT IO Type -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm (Type -> TCMT IO Type) -> TCMT IO Type -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Type, Int) -> Type
forall a b. (a, b) -> a
fst ((Type, Int) -> Type) -> TCMT IO (Type, Int) -> TCMT IO Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Telescope
-> [Arg (Term, EqualityView)]
-> Telescope
-> Type
-> [(Int, (Term, Term))]
-> TCMT IO (Type, Int)
withFunctionType Telescope
delta1 [Arg (Term, EqualityView)]
vtys' Telescope
delta2 Type
a' []
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.helper" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat ([TCMT IO Doc] -> TCMT IO Doc) -> [TCMT IO Doc] -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$
let extractOtherType :: EqualityView -> Type
extractOtherType = \case { OtherType Type
a -> Type
a; EqualityView
_ -> Type
forall a. HasCallStack => a
__IMPOSSIBLE__ } in
let ([Term]
vs, [Type]
as) = (Arg (Term, EqualityView) -> (Term, Type))
-> [Arg (Term, EqualityView)] -> ([Term], [Type])
forall a b c. (a -> (b, c)) -> [a] -> ([b], [c])
unzipWith ((EqualityView -> Type) -> (Term, EqualityView) -> (Term, Type)
forall a b. (a -> b) -> (Term, a) -> (Term, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EqualityView -> Type
extractOtherType ((Term, EqualityView) -> (Term, Type))
-> (Arg (Term, EqualityView) -> (Term, EqualityView))
-> Arg (Term, EqualityView)
-> (Term, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg (Term, EqualityView) -> (Term, EqualityView)
forall e. Arg e -> e
unArg) [Arg (Term, EqualityView)]
vtys in
let ([Term]
vs', [Type]
as') = (Arg (Term, EqualityView) -> (Term, Type))
-> [Arg (Term, EqualityView)] -> ([Term], [Type])
forall a b c. (a -> (b, c)) -> [a] -> ([b], [c])
unzipWith ((EqualityView -> Type) -> (Term, EqualityView) -> (Term, Type)
forall a b. (a -> b) -> (Term, a) -> (Term, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EqualityView -> Type
extractOtherType ((Term, EqualityView) -> (Term, Type))
-> (Arg (Term, EqualityView) -> (Term, EqualityView))
-> Arg (Term, EqualityView)
-> (Term, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg (Term, EqualityView) -> (Term, EqualityView)
forall e. Arg e -> e
unArg) [Arg (Term, EqualityView)]
vtys' in
[ TCMT IO Doc
"generating helper function"
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"tel = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
tel)
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"a = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Expr -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Expr -> m Doc
prettyTCM Expr
a
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"vs = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> [Term] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Term] -> m Doc
prettyTCM [Term]
vs
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"as = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> [Type] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Type] -> m Doc
prettyTCM [Type]
as
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"delta1 = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
delta1)
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"delta2 = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
delta1 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
delta2)
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"a' = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
delta1 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
delta2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ Type -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Type -> m Doc
prettyTCM Type
a')
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"as' = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
delta1 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ [Type] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Type] -> m Doc
prettyTCM [Type]
as')
, Int -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Functor m => Int -> m Doc -> m Doc
TP.nest Int
2 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ TCMT IO Doc
"vs' = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> TCMT IO Doc -> TCMT IO Doc
forall (tcm :: * -> *) a.
(MonadTCEnv tcm, ReadTCState tcm) =>
tcm a -> tcm a
inTopContext (Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
delta1 (TCMT IO Doc -> TCMT IO Doc) -> TCMT IO Doc -> TCMT IO Doc
forall a b. (a -> b) -> a -> b
$ [Term] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Term] -> m Doc
prettyTCM [Term]
vs')
]
OutputConstraint' Expr Expr -> TCM (OutputConstraint' Expr Expr)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputConstraint' Expr Expr -> TCM (OutputConstraint' Expr Expr))
-> OutputConstraint' Expr Expr -> TCM (OutputConstraint' Expr Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> OutputConstraint' Expr Expr
forall a b. b -> a -> OutputConstraint' a b
OfType' Expr
h Expr
a
where
failure :: TCMT IO a
failure = TypeError -> TCMT IO a
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCMT IO a) -> TypeError -> TCMT IO a
forall a b. (a -> b) -> a -> b
$ ArgName -> TypeError
GenericError (ArgName -> TypeError) -> ArgName -> TypeError
forall a b. (a -> b) -> a -> b
$ ArgName
"Expected an argument of the form f e1 e2 .. en"
ensureName :: ArgName -> ScopeM ()
ensureName ArgName
f = do
Expr
ce <- Range -> ArgName -> TCM Expr
parseExpr Range
rng ArgName
f
(ScopeM () -> (Name -> ScopeM ()) -> ScopeM ())
-> (Name -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe Name -> ScopeM () -> (Name -> ScopeM ()) -> ScopeM ()
forall a b. Maybe a -> b -> (a -> b) -> b
caseMaybe (Maybe Name -> ScopeM () -> (Name -> ScopeM ()) -> ScopeM ())
-> Maybe Name -> ScopeM () -> (Name -> ScopeM ()) -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ Expr -> Maybe Name
isName Expr
ce) (\ Name
_ -> () -> ScopeM ()
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) (ScopeM () -> ScopeM ()) -> ScopeM () -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ do
ArgName -> Int -> ArgName -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> ArgName -> m ()
reportSLn ArgName
"interaction.helper" Int
10 (ArgName -> ScopeM ()) -> ArgName -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ ArgName
"ce = " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ Expr -> ArgName
forall a. Show a => a -> ArgName
show Expr
ce
ScopeM ()
forall {a}. TCMT IO a
failure
isVar :: A.Expr -> Maybe A.Name
isVar :: Expr -> Maybe Name
isVar = \case
A.Var Name
x -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
x
Expr
_ -> Maybe Name
forall a. Maybe a
Nothing
cleanupType :: Int -> [NamedArg Expr] -> Type -> TCMT IO Type
cleanupType Int
arity [NamedArg Expr]
args Type
t = do
TelV Telescope
ttel Type
_ <- Type -> TCMT IO TelView
forall (m :: * -> *).
(MonadReduce m, MonadAddContext m) =>
Type -> m TelView
telView Type
t
let n :: Int
n = Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
ttel Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
arity
Bool -> ScopeM () -> ScopeM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0) ScopeM ()
forall a. HasCallStack => a
__IMPOSSIBLE__
Type -> TCMT IO Type
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Type -> TCMT IO Type) -> Type -> TCMT IO Type
forall a b. (a -> b) -> a -> b
$ State [NamedArg Expr] Type -> [NamedArg Expr] -> Type
forall s a. State s a -> s -> a
evalState (Type -> State [NamedArg Expr] Type
renameVars (Type -> State [NamedArg Expr] Type)
-> Type -> State [NamedArg Expr] Type
forall a b. (a -> b) -> a -> b
$ Int -> Type -> Type
forall {a}. (Eq a, Num a) => a -> Type -> Type
stripUnused Int
n Type
t) [NamedArg Expr]
args
getBody :: Expr -> Expr
getBody (A.Let ExprInfo
_ List1 LetBinding
_ Expr
e) = Expr
e
getBody Expr
_ = Expr
forall a. HasCallStack => a
__IMPOSSIBLE__
stripUnused :: a -> Type -> Type
stripUnused a
n (El Sort
s Term
v) = Sort -> Term -> Type
forall t a. Sort' t -> a -> Type'' t a
El Sort
s (Term -> Type) -> Term -> Type
forall a b. (a -> b) -> a -> b
$ a -> Term -> Term
strip a
n Term
v
strip :: a -> Term -> Term
strip a
0 = Term -> Term
forall a. a -> a
id
strip a
n = \case
I.Pi Dom Type
a Abs Type
b -> case a -> Type -> Type
stripUnused (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) (Type -> Type) -> Abs Type -> Abs Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Abs Type
b of
Abs Type
b | Abs Type -> ArgName
forall a. Abs a -> ArgName
absName Abs Type
b ArgName -> ArgName -> Bool
forall a. Eq a => a -> a -> Bool
== ArgName
"w" -> Dom Type -> Abs Type -> Term
I.Pi Dom Type
a Abs Type
b
NoAbs ArgName
_ Type
b -> Type -> Term
forall t a. Type'' t a -> a
unEl Type
b
Abs ArgName
s Type
b | Int
0 Int -> Type -> Bool
forall a. Free a => Int -> a -> Bool
`freeIn` Type
b -> Dom Type -> Abs Type -> Term
I.Pi (Dom Type -> Dom Type
forall a. LensHiding a => a -> a
hide Dom Type
a) (ArgName -> Type -> Abs Type
forall a. ArgName -> a -> Abs a
Abs ArgName
s Type
b)
| Bool
otherwise -> Impossible -> Term -> Term
forall a. Subst a => Impossible -> a -> a
strengthen Impossible
HasCallStack => Impossible
impossible (Type -> Term
forall t a. Type'' t a -> a
unEl Type
b)
Term
v -> Term
v
renameVars :: Type -> State [NamedArg Expr] Type
renameVars = (ArgName -> StateT [NamedArg Expr] Identity ArgName)
-> Type -> State [NamedArg Expr] Type
forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames ArgName -> StateT [NamedArg Expr] Identity ArgName
renameVar
onNames :: Applicative m => (String -> m String) -> I.Type -> m I.Type
onNames :: forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames ArgName -> m ArgName
f (El Sort
s Term
v) = Sort -> Term -> Type
forall t a. Sort' t -> a -> Type'' t a
El Sort
s (Term -> Type) -> m Term -> m Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> m ArgName) -> Term -> m Term
forall {f :: * -> *}.
Applicative f =>
(ArgName -> f ArgName) -> Term -> f Term
onNamesTm ArgName -> m ArgName
f Term
v
onNamesTel :: Applicative f => (String -> f String) -> I.Telescope -> f I.Telescope
onNamesTel :: forall (f :: * -> *).
Applicative f =>
(ArgName -> f ArgName) -> Telescope -> f Telescope
onNamesTel ArgName -> f ArgName
f Telescope
I.EmptyTel = Telescope -> f Telescope
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Telescope
forall a. Tele a
I.EmptyTel
onNamesTel ArgName -> f ArgName
f (I.ExtendTel Dom Type
a Abs Telescope
b) = Dom Type -> Abs Telescope -> Telescope
forall a. a -> Abs (Tele a) -> Tele a
I.ExtendTel (Dom Type -> Abs Telescope -> Telescope)
-> f (Dom Type) -> f (Abs Telescope -> Telescope)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Type -> f Type) -> Dom Type -> f (Dom Type)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Dom' Term a -> f (Dom' Term b)
traverse ((ArgName -> f ArgName) -> Type -> f Type
forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames ArgName -> f ArgName
f) Dom Type
a f (Abs Telescope -> Telescope) -> f (Abs Telescope) -> f Telescope
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> Telescope -> f Telescope)
-> Abs Telescope
-> f (Abs Telescope)
forall {f :: * -> *} {t} {a}.
Applicative f =>
(ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs ArgName -> f ArgName
f (ArgName -> f ArgName) -> Telescope -> f Telescope
forall (f :: * -> *).
Applicative f =>
(ArgName -> f ArgName) -> Telescope -> f Telescope
onNamesTel Abs Telescope
b
onNamesTm :: (ArgName -> f ArgName) -> Term -> f Term
onNamesTm ArgName -> f ArgName
f = \case
I.Var Int
x Elims
es -> Int -> Elims -> Term
I.Var Int
x (Elims -> Term) -> f Elims -> f Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> f ArgName) -> Elims -> f Elims
onNamesElims ArgName -> f ArgName
f Elims
es
I.Def QName
q Elims
es -> QName -> Elims -> Term
I.Def QName
q (Elims -> Term) -> f Elims -> f Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> f ArgName) -> Elims -> f Elims
onNamesElims ArgName -> f ArgName
f Elims
es
I.Con ConHead
c ConInfo
ci Elims
args -> ConHead -> ConInfo -> Elims -> Term
I.Con ConHead
c ConInfo
ci (Elims -> Term) -> f Elims -> f Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> f ArgName) -> Elims -> f Elims
onNamesArgs ArgName -> f ArgName
f Elims
args
I.Lam ArgInfo
i Abs Term
b -> ArgInfo -> Abs Term -> Term
I.Lam ArgInfo
i (Abs Term -> Term) -> f (Abs Term) -> f Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> Term -> f Term)
-> Abs Term
-> f (Abs Term)
forall {f :: * -> *} {t} {a}.
Applicative f =>
(ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs ArgName -> f ArgName
f (ArgName -> f ArgName) -> Term -> f Term
onNamesTm Abs Term
b
I.Pi Dom Type
a Abs Type
b -> Dom Type -> Abs Type -> Term
I.Pi (Dom Type -> Abs Type -> Term)
-> f (Dom Type) -> f (Abs Type -> Term)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Type -> f Type) -> Dom Type -> f (Dom Type)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Dom' Term a -> f (Dom' Term b)
traverse ((ArgName -> f ArgName) -> Type -> f Type
forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames ArgName -> f ArgName
f) Dom Type
a f (Abs Type -> Term) -> f (Abs Type) -> f Term
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> Type -> f Type)
-> Abs Type
-> f (Abs Type)
forall {f :: * -> *} {t} {a}.
Applicative f =>
(ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs ArgName -> f ArgName
f (ArgName -> f ArgName) -> Type -> f Type
forall (m :: * -> *).
Applicative m =>
(ArgName -> m ArgName) -> Type -> m Type
onNames Abs Type
b
I.DontCare Term
v -> Term -> Term
I.DontCare (Term -> Term) -> f Term -> f Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ArgName -> f ArgName) -> Term -> f Term
onNamesTm ArgName -> f ArgName
f Term
v
v :: Term
v@I.Lit{} -> Term -> f Term
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v
v :: Term
v@I.Sort{} -> Term -> f Term
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v
v :: Term
v@I.Level{} -> Term -> f Term
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v
v :: Term
v@I.MetaV{} -> Term -> f Term
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v
v :: Term
v@I.Dummy{} -> Term -> f Term
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term
v
onNamesElims :: (ArgName -> f ArgName) -> Elims -> f Elims
onNamesElims ArgName -> f ArgName
f = (Elim' Term -> f (Elim' Term)) -> Elims -> f Elims
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((Elim' Term -> f (Elim' Term)) -> Elims -> f Elims)
-> (Elim' Term -> f (Elim' Term)) -> Elims -> f Elims
forall a b. (a -> b) -> a -> b
$ (Term -> f Term) -> Elim' Term -> f (Elim' Term)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Elim' a -> f (Elim' b)
traverse ((Term -> f Term) -> Elim' Term -> f (Elim' Term))
-> (Term -> f Term) -> Elim' Term -> f (Elim' Term)
forall a b. (a -> b) -> a -> b
$ (ArgName -> f ArgName) -> Term -> f Term
onNamesTm ArgName -> f ArgName
f
onNamesArgs :: (ArgName -> f ArgName) -> Elims -> f Elims
onNamesArgs ArgName -> f ArgName
f = (Elim' Term -> f (Elim' Term)) -> Elims -> f Elims
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((Elim' Term -> f (Elim' Term)) -> Elims -> f Elims)
-> (Elim' Term -> f (Elim' Term)) -> Elims -> f Elims
forall a b. (a -> b) -> a -> b
$ (Term -> f Term) -> Elim' Term -> f (Elim' Term)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Elim' a -> f (Elim' b)
traverse ((Term -> f Term) -> Elim' Term -> f (Elim' Term))
-> (Term -> f Term) -> Elim' Term -> f (Elim' Term)
forall a b. (a -> b) -> a -> b
$ (ArgName -> f ArgName) -> Term -> f Term
onNamesTm ArgName -> f ArgName
f
onNamesAbs :: (ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs ArgName -> f ArgName
f = (ArgName -> f ArgName)
-> (ArgName -> f ArgName)
-> ((ArgName -> f ArgName) -> t -> f a)
-> Abs t
-> f (Abs a)
forall {f :: * -> *} {t} {t} {a}.
Applicative f =>
t
-> (ArgName -> f ArgName) -> (t -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs' ArgName -> f ArgName
f (ArgName -> ArgName
stringToArgName (ArgName -> ArgName)
-> (ArgName -> f ArgName) -> ArgName -> f ArgName
forall (m :: * -> *) b c a.
Functor m =>
(b -> c) -> (a -> m b) -> a -> m c
<.> ArgName -> f ArgName
f (ArgName -> f ArgName)
-> (ArgName -> ArgName) -> ArgName -> f ArgName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArgName -> ArgName
argNameToString)
onNamesAbs' :: t
-> (ArgName -> f ArgName) -> (t -> t -> f a) -> Abs t -> f (Abs a)
onNamesAbs' t
f ArgName -> f ArgName
f' t -> t -> f a
nd (Abs ArgName
s t
x) = ArgName -> a -> Abs a
forall a. ArgName -> a -> Abs a
Abs (ArgName -> a -> Abs a) -> f ArgName -> f (a -> Abs a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ArgName -> f ArgName
f' ArgName
s f (a -> Abs a) -> f a -> f (Abs a)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> t -> t -> f a
nd t
f t
x
onNamesAbs' t
f ArgName -> f ArgName
f' t -> t -> f a
nd (NoAbs ArgName
s t
x) = ArgName -> a -> Abs a
forall a. ArgName -> a -> Abs a
NoAbs (ArgName -> a -> Abs a) -> f ArgName -> f (a -> Abs a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ArgName -> f ArgName
f' ArgName
s f (a -> Abs a) -> f a -> f (Abs a)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> t -> t -> f a
nd t
f t
x
unW :: a -> m a
unW a
"w" = a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
".w"
unW a
s = a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
s
renameVar :: ArgName -> StateT [NamedArg Expr] Identity ArgName
renameVar ArgName
"w" = StateT [NamedArg Expr] Identity ArgName
betterName
renameVar ArgName
s = ArgName -> StateT [NamedArg Expr] Identity ArgName
forall a. a -> StateT [NamedArg Expr] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ArgName
s
betterName :: StateT [NamedArg Expr] Identity ArgName
betterName = do
[NamedArg Expr]
xs <- StateT [NamedArg Expr] Identity [NamedArg Expr]
forall s (m :: * -> *). MonadState s m => m s
get
case [NamedArg Expr]
xs of
[] -> StateT [NamedArg Expr] Identity ArgName
forall a. HasCallStack => a
__IMPOSSIBLE__
NamedArg Expr
arg : [NamedArg Expr]
args -> do
[NamedArg Expr] -> StateT [NamedArg Expr] Identity ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put [NamedArg Expr]
args
ArgName -> StateT [NamedArg Expr] Identity ArgName
forall a. a -> StateT [NamedArg Expr] Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (ArgName -> StateT [NamedArg Expr] Identity ArgName)
-> ArgName -> StateT [NamedArg Expr] Identity ArgName
forall a b. (a -> b) -> a -> b
$ if
| Arg ArgInfo
_ (Named Maybe NamedName
_ (A.Var Name
x)) <- NamedArg Expr
arg -> Name -> ArgName
forall a. Pretty a => a -> ArgName
prettyShow (Name -> ArgName) -> Name -> ArgName
forall a b. (a -> b) -> a -> b
$ Name -> Name
A.nameConcrete Name
x
| Just ArgName
x <- NamedArg Expr -> Maybe ArgName
forall a. (LensNamed a, NameOf a ~ NamedName) => a -> Maybe ArgName
bareNameOf NamedArg Expr
arg -> ArgName -> ArgName
argNameToString ArgName
x
| Bool
otherwise -> ArgName
"w"
contextOfMeta :: InteractionId -> Rewrite -> TCM [ResponseContextEntry]
contextOfMeta :: InteractionId -> Rewrite -> TCM [ResponseContextEntry]
contextOfMeta InteractionId
ii Rewrite
norm = InteractionId
-> TCM [ResponseContextEntry] -> TCM [ResponseContextEntry]
forall (m :: * -> *) a.
(MonadDebug m, MonadFail m, ReadTCState m, MonadError TCErr m,
MonadTCEnv m, MonadTrace m) =>
InteractionId -> m a -> m a
withInteractionId InteractionId
ii (TCM [ResponseContextEntry] -> TCM [ResponseContextEntry])
-> TCM [ResponseContextEntry] -> TCM [ResponseContextEntry]
forall a b. (a -> b) -> a -> b
$ do
Closure Range
info <- MetaVariable -> Closure Range
getMetaInfo (MetaVariable -> Closure Range)
-> TCMT IO MetaVariable -> TCMT IO (Closure Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta (MetaId -> TCMT IO MetaVariable)
-> TCMT IO MetaId -> TCMT IO MetaVariable
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii)
Closure Range
-> TCM [ResponseContextEntry] -> TCM [ResponseContextEntry]
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo Closure Range
info (TCM [ResponseContextEntry] -> TCM [ResponseContextEntry])
-> TCM [ResponseContextEntry] -> TCM [ResponseContextEntry]
forall a b. (a -> b) -> a -> b
$ do
[ContextEntry]
cxt <- TCMT IO [ContextEntry]
forall (m :: * -> *). MonadTCEnv m => m [ContextEntry]
getContext
let localVars :: [ContextEntry]
localVars = (Int -> ContextEntry -> ContextEntry)
-> [Int] -> [ContextEntry] -> [ContextEntry]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> ContextEntry -> ContextEntry
forall a. Subst a => Int -> a -> a
raise [Int
1..] [ContextEntry]
cxt
[(Name, Open LetBinding)]
letVars <- Map Name (Open LetBinding) -> [(Name, Open LetBinding)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Name (Open LetBinding) -> [(Name, Open LetBinding)])
-> TCMT IO (Map Name (Open LetBinding))
-> TCMT IO [(Name, Open LetBinding)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (TCEnv -> Map Name (Open LetBinding))
-> TCMT IO (Map Name (Open LetBinding))
forall (m :: * -> *) a. MonadTCEnv m => (TCEnv -> a) -> m a
asksTC TCEnv -> Map Name (Open LetBinding)
envLetBindings
[ResponseContextEntry]
-> [ResponseContextEntry] -> [ResponseContextEntry]
forall a. [a] -> [a] -> [a]
(++) ([ResponseContextEntry]
-> [ResponseContextEntry] -> [ResponseContextEntry])
-> TCM [ResponseContextEntry]
-> TCMT IO ([ResponseContextEntry] -> [ResponseContextEntry])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ContextEntry]
-> (ContextEntry -> TCMT IO (Maybe ResponseContextEntry))
-> TCM [ResponseContextEntry]
forall (m :: * -> *) a b.
Monad m =>
[a] -> (a -> m (Maybe b)) -> m [b]
forMaybeM ([ContextEntry] -> [ContextEntry]
forall a. [a] -> [a]
reverse [ContextEntry]
localVars) ContextEntry -> TCMT IO (Maybe ResponseContextEntry)
mkVar
TCMT IO ([ResponseContextEntry] -> [ResponseContextEntry])
-> TCM [ResponseContextEntry] -> TCM [ResponseContextEntry]
forall a b. TCMT IO (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [(Name, Open LetBinding)]
-> ((Name, Open LetBinding)
-> TCMT IO (Maybe ResponseContextEntry))
-> TCM [ResponseContextEntry]
forall (m :: * -> *) a b.
Monad m =>
[a] -> (a -> m (Maybe b)) -> m [b]
forMaybeM [(Name, Open LetBinding)]
letVars (Name, Open LetBinding) -> TCMT IO (Maybe ResponseContextEntry)
mkLet
where
mkVar :: ContextEntry -> TCM (Maybe ResponseContextEntry)
mkVar :: ContextEntry -> TCMT IO (Maybe ResponseContextEntry)
mkVar Dom{ domInfo :: forall t e. Dom' t e -> ArgInfo
domInfo = ArgInfo
ai, unDom :: forall t e. Dom' t e -> e
unDom = (Name
name, Type
t) } = do
if ArgInfo -> Name -> Bool
shouldHide ArgInfo
ai Name
name then Maybe ResponseContextEntry -> TCMT IO (Maybe ResponseContextEntry)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ResponseContextEntry
forall a. Maybe a
Nothing else ResponseContextEntry -> Maybe ResponseContextEntry
forall a. a -> Maybe a
Just (ResponseContextEntry -> Maybe ResponseContextEntry)
-> TCMT IO ResponseContextEntry
-> TCMT IO (Maybe ResponseContextEntry)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
let n :: Name
n = Name -> Name
nameConcrete Name
name
Name
x <- Name -> TCMT IO (ConOfAbs Name)
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ Name
name
let s :: NameInScope
s = Name -> NameInScope
forall a. LensInScope a => a -> NameInScope
C.isInScope Name
x
Expr
ty <- Type -> TCM Expr
Type -> TCM (ReifiesTo Type)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked (Type -> TCM Expr) -> TCMT IO Type -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Type
t
ResponseContextEntry -> TCMT IO ResponseContextEntry
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ResponseContextEntry -> TCMT IO ResponseContextEntry)
-> ResponseContextEntry -> TCMT IO ResponseContextEntry
forall a b. (a -> b) -> a -> b
$ Name
-> Name
-> Arg Expr
-> Maybe Expr
-> NameInScope
-> ResponseContextEntry
ResponseContextEntry Name
n Name
x (ArgInfo -> Expr -> Arg Expr
forall e. ArgInfo -> e -> Arg e
Arg ArgInfo
ai Expr
ty) Maybe Expr
forall a. Maybe a
Nothing NameInScope
s
mkLet :: (Name, Open M.LetBinding) -> TCM (Maybe ResponseContextEntry)
mkLet :: (Name, Open LetBinding) -> TCMT IO (Maybe ResponseContextEntry)
mkLet (Name
name, Open LetBinding
lb) = do
LetBinding Origin
_ Term
tm !Dom Type
dom <- Open LetBinding -> TCMT IO LetBinding
forall a (m :: * -> *).
(TermSubst a, MonadTCEnv m) =>
Open a -> m a
getOpen Open LetBinding
lb
if ArgInfo -> Name -> Bool
shouldHide (Dom Type -> ArgInfo
forall t e. Dom' t e -> ArgInfo
domInfo Dom Type
dom) Name
name then Maybe ResponseContextEntry -> TCMT IO (Maybe ResponseContextEntry)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ResponseContextEntry
forall a. Maybe a
Nothing else ResponseContextEntry -> Maybe ResponseContextEntry
forall a. a -> Maybe a
Just (ResponseContextEntry -> Maybe ResponseContextEntry)
-> TCMT IO ResponseContextEntry
-> TCMT IO (Maybe ResponseContextEntry)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
let n :: Name
n = Name -> Name
nameConcrete Name
name
Name
x <- Name -> TCMT IO (ConOfAbs Name)
forall a (m :: * -> *).
(ToConcrete a, MonadAbsToCon m) =>
a -> m (ConOfAbs a)
abstractToConcrete_ Name
name
let s :: NameInScope
s = Name -> NameInScope
forall a. LensInScope a => a -> NameInScope
C.isInScope Name
x
Arg Expr
ty <- Dom Type -> TCMT IO (Arg Expr)
Dom Type -> TCM (ReifiesTo (Dom Type))
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked (Dom Type -> TCMT IO (Arg Expr))
-> TCMT IO (Dom Type) -> TCMT IO (Arg Expr)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Dom Type -> TCMT IO (Dom Type)
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Dom Type
dom
Expr
v <- Name -> TCM Expr -> TCM Expr
forall (m :: * -> *) a. MonadTCEnv m => Name -> m a -> m a
removeLetBindingsFrom Name
name (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$ Term -> TCM Expr
Term -> TCMT IO (ReifiesTo Term)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked (Term -> TCM Expr) -> TCM Term -> TCM Expr
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Rewrite -> Term -> TCM Term
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Term
tm
ResponseContextEntry -> TCMT IO ResponseContextEntry
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ResponseContextEntry -> TCMT IO ResponseContextEntry)
-> ResponseContextEntry -> TCMT IO ResponseContextEntry
forall a b. (a -> b) -> a -> b
$ Name
-> Name
-> Arg Expr
-> Maybe Expr
-> NameInScope
-> ResponseContextEntry
ResponseContextEntry Name
n Name
x Arg Expr
ty (Expr -> Maybe Expr
forall a. a -> Maybe a
Just Expr
v) NameInScope
s
shouldHide :: ArgInfo -> A.Name -> Bool
shouldHide :: ArgInfo -> Name -> Bool
shouldHide ArgInfo
ai Name
n = Bool -> Bool
not (ArgInfo -> Bool
forall a. LensHiding a => a -> Bool
isInstance ArgInfo
ai) Bool -> Bool -> Bool
&& (Name -> Bool
forall a. IsNoName a => a -> Bool
isNoName Name
n Bool -> Bool -> Bool
|| Name -> Bool
nameIsRecordName Name
n)
typeInCurrent :: Rewrite -> Expr -> TCM Expr
typeInCurrent :: Rewrite -> Expr -> TCM Expr
typeInCurrent Rewrite
norm Expr
e =
do (Term
_,Type
t) <- TCM (Term, Type) -> TCM (Term, Type)
forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
wakeIrrelevantVars (TCM (Term, Type) -> TCM (Term, Type))
-> TCM (Term, Type) -> TCM (Term, Type)
forall a b. (a -> b) -> a -> b
$ Expr -> TCM (Term, Type)
inferExpr Expr
e
Type
v <- Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm Type
t
Type -> TCM (ReifiesTo Type)
forall i. Reify i => i -> TCM (ReifiesTo i)
reifyUnblocked Type
v
typeInMeta :: InteractionId -> Rewrite -> Expr -> TCM Expr
typeInMeta :: InteractionId -> Rewrite -> Expr -> TCM Expr
typeInMeta InteractionId
ii Rewrite
norm Expr
e =
do MetaId
m <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
Closure Range
mi <- MetaVariable -> Closure Range
getMetaInfo (MetaVariable -> Closure Range)
-> TCMT IO MetaVariable -> TCMT IO (Closure Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
m
Closure Range -> TCM Expr -> TCM Expr
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo Closure Range
mi (TCM Expr -> TCM Expr) -> TCM Expr -> TCM Expr
forall a b. (a -> b) -> a -> b
$
Rewrite -> Expr -> TCM Expr
typeInCurrent Rewrite
norm Expr
e
introTactic :: Bool -> InteractionId -> TCM [String]
introTactic :: Bool -> InteractionId -> TCMT IO Names
introTactic Bool
pmLambda InteractionId
ii = do
MetaId
mi <- InteractionId -> TCMT IO MetaId
forall (m :: * -> *).
(MonadFail m, ReadTCState m, MonadError TCErr m, MonadTCEnv m) =>
InteractionId -> m MetaId
lookupInteractionId InteractionId
ii
MetaVariable
mv <- MetaId -> TCMT IO MetaVariable
forall (m :: * -> *).
(HasCallStack, MonadDebug m, ReadTCState m) =>
MetaId -> m MetaVariable
lookupLocalMeta MetaId
mi
Closure Range -> TCMT IO Names -> TCMT IO Names
forall (m :: * -> *) a.
(MonadTCEnv m, ReadTCState m, MonadTrace m) =>
Closure Range -> m a -> m a
withMetaInfo (MetaVariable -> Closure Range
getMetaInfo MetaVariable
mv) (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ case MetaVariable -> Judgement MetaId
mvJudgement MetaVariable
mv of
HasType MetaId
_ Comparison
_ Type
t -> do
Type
t <- Type -> TCMT IO Type
forall a (m :: * -> *). (Reduce a, MonadReduce m) => a -> m a
reduce (Type -> TCMT IO Type) -> TCMT IO Type -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Type -> Args -> TCMT IO Type
forall a (m :: * -> *).
(PiApplyM a, MonadReduce m, HasBuiltins m) =>
Type -> a -> m Type
forall (m :: * -> *).
(MonadReduce m, HasBuiltins m) =>
Type -> Args -> m Type
piApplyM Type
t (Args -> TCMT IO Type) -> TCMT IO Args -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO Args
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Args
getContextArgs
TelV Telescope
tel' Type
t <- Int -> (Dom Type -> Bool) -> Type -> TCMT IO TelView
forall (m :: * -> *).
(MonadReduce m, MonadAddContext m) =>
Int -> (Dom Type -> Bool) -> Type -> m TelView
telViewUpTo' (-Int
1) Dom Type -> Bool
forall a. LensHiding a => a -> Bool
notVisible Type
t
let fallback :: TCMT IO Names
fallback = do
Bool
cubical <- Maybe Cubical -> Bool
forall a. Maybe a -> Bool
isJust (Maybe Cubical -> Bool)
-> (PragmaOptions -> Maybe Cubical) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> Maybe Cubical
optCubical (PragmaOptions -> Bool) -> TCMT IO PragmaOptions -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
TelV Telescope
tel Type
_ <- (if Bool
cubical then Type -> TCMT IO TelView
forall (m :: * -> *). PureTCM m => Type -> m TelView
telViewPath else Type -> TCMT IO TelView
forall (m :: * -> *).
(MonadReduce m, MonadAddContext m) =>
Type -> m TelView
telView) Type
t
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.intro" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.sep
[ TCMT IO Doc
"introTactic/fallback"
, TCMT IO Doc
"tel' = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
tel'
, TCMT IO Doc
"tel = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
tel
]
case (Telescope
tel', Telescope
tel) of
(Telescope
EmptyTel, Telescope
EmptyTel) -> Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
(Telescope, Telescope)
_ -> ListTel -> TCMT IO Names
introFun (Telescope -> ListTel
forall t. Tele (Dom t) -> [Dom (ArgName, t)]
telToList Telescope
tel' ListTel -> ListTel -> ListTel
forall a. [a] -> [a] -> [a]
++ Telescope -> ListTel
forall t. Tele (Dom t) -> [Dom (ArgName, t)]
telToList Telescope
tel)
case Type -> Term
forall t a. Type'' t a -> a
unEl Type
t of
I.Def QName
d Elims
_ -> do
Definition
def <- QName -> TCMT IO Definition
forall (m :: * -> *). HasConstInfo m => QName -> m Definition
getConstInfo QName
d
case Definition -> Defn
theDef Definition
def of
Datatype{} -> Telescope -> TCMT IO Names -> TCMT IO Names
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
tel' (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ AllowAmbiguousNames -> Type -> TCMT IO Names
introData AllowAmbiguousNames
AmbiguousNothing Type
t
Record{ recNamedCon :: Defn -> Bool
recNamedCon = Bool
name }
| Bool
name -> Telescope -> TCMT IO Names -> TCMT IO Names
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
tel' (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ AllowAmbiguousNames -> Type -> TCMT IO Names
introData AllowAmbiguousNames
AmbiguousConProjs Type
t
| Bool
otherwise -> Telescope -> TCMT IO Names -> TCMT IO Names
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
tel' (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ QName -> TCMT IO Names
introRec QName
d
Defn
_ -> TCMT IO Names
fallback
Term
_ -> TCMT IO Names
fallback
TCMT IO Names -> (TCErr -> TCMT IO Names) -> TCMT IO Names
forall a. TCMT IO a -> (TCErr -> TCMT IO a) -> TCMT IO a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError` \TCErr
_ -> Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
Judgement MetaId
_ -> TCMT IO Names
forall a. HasCallStack => a
__IMPOSSIBLE__
where
conName :: [NamedArg SplitPattern] -> [I.ConHead]
conName :: [NamedArg SplitPattern] -> [ConHead]
conName [NamedArg SplitPattern
p] = [ ConHead
c | I.ConP ConHead
c ConPatternInfo
_ [NamedArg SplitPattern]
_ <- [NamedArg SplitPattern -> SplitPattern
forall a. NamedArg a -> a
namedArg NamedArg SplitPattern
p] ]
conName [NamedArg SplitPattern]
_ = [ConHead]
forall a. HasCallStack => a
__IMPOSSIBLE__
showUnambiguousConName :: AllowAmbiguousNames -> ConHead -> f ArgName
showUnambiguousConName AllowAmbiguousNames
amb ConHead
v =
Doc -> ArgName
forall a. Doc a -> ArgName
render (Doc -> ArgName) -> (QName -> Doc) -> QName -> ArgName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QName -> Doc
forall a. Pretty a => a -> Doc
pretty (QName -> ArgName) -> f QName -> f ArgName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AbsToCon QName -> f QName
forall (m :: * -> *) c. MonadAbsToCon m => AbsToCon c -> m c
runAbsToCon (AllowAmbiguousNames -> QName -> AbsToCon QName
lookupQName AllowAmbiguousNames
amb (QName -> AbsToCon QName) -> QName -> AbsToCon QName
forall a b. (a -> b) -> a -> b
$ ConHead -> QName
I.conName ConHead
v)
showTCM :: PrettyTCM a => a -> TCM String
showTCM :: forall a. PrettyTCM a => a -> TCM ArgName
showTCM a
v = Doc -> ArgName
forall a. Doc a -> ArgName
render (Doc -> ArgName) -> TCMT IO Doc -> TCM ArgName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => a -> m Doc
prettyTCM a
v
introFun :: ListTel -> TCM [String]
introFun :: ListTel -> TCMT IO Names
introFun ListTel
tel = Telescope -> TCMT IO Names -> TCMT IO Names
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
tel' (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ do
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.intro" Int
10 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ do TCMT IO Doc
"introFun" TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM (ListTel -> Telescope
telFromList ListTel
tel)
Bool
imp <- TCMT IO Bool
forall (m :: * -> *). HasOptions m => m Bool
showImplicitArguments
let okHiding0 :: Hiding -> Bool
okHiding0 Hiding
h = Bool
imp Bool -> Bool -> Bool
|| Hiding
h Hiding -> Hiding -> Bool
forall a. Eq a => a -> a -> Bool
== Hiding
NotHidden
allHidden :: Bool
allHidden = Bool -> Bool
not ((Hiding -> Bool) -> [Hiding] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Hiding -> Bool
okHiding0 [Hiding]
hs)
okHiding :: Hiding -> Bool
okHiding = if Bool
allHidden then Bool -> Hiding -> Bool
forall a b. a -> b -> a
const Bool
True else Hiding -> Bool
okHiding0
Names
vars <-
Bool
-> (TCMT IO Names -> TCMT IO Names)
-> TCMT IO Names
-> TCMT IO Names
forall b a. IsBool b => b -> (a -> a) -> a -> a
applyWhen Bool
allHidden TCMT IO Names -> TCMT IO Names
forall (m :: * -> *) a. ReadTCState m => m a -> m a
withShowAllArguments (TCMT IO Names -> TCMT IO Names) -> TCMT IO Names -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$
(Arg Term -> TCM ArgName) -> Args -> TCMT IO Names
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Arg Term -> TCM ArgName
forall a. PrettyTCM a => a -> TCM ArgName
showTCM [ Hiding -> Arg Term -> Arg Term
forall a. LensHiding a => Hiding -> a -> a
setHiding Hiding
h (Arg Term -> Arg Term) -> Arg Term -> Arg Term
forall a b. (a -> b) -> a -> b
$ Term -> Arg Term
forall a. a -> Arg a
defaultArg (Term -> Arg Term) -> Term -> Arg Term
forall a b. (a -> b) -> a -> b
$ Int -> Term
var Int
i :: Arg Term
| (Hiding
h, Int
i) <- [Hiding] -> [Int] -> [(Hiding, Int)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Hiding]
hs ([Int] -> [(Hiding, Int)]) -> [Int] -> [(Hiding, Int)]
forall a b. (a -> b) -> a -> b
$ Int -> [Int]
forall a. Integral a => a -> [a]
downFrom Int
n
, Hiding -> Bool
okHiding Hiding
h
]
if Bool
pmLambda
then Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [ Names -> ArgName
unwords (Names -> ArgName) -> Names -> ArgName
forall a b. (a -> b) -> a -> b
$ [ArgName
"λ", ArgName
"{"] Names -> Names -> Names
forall a. [a] -> [a] -> [a]
++ Names
vars Names -> Names -> Names
forall a. [a] -> [a] -> [a]
++ [ArgName
"→", ArgName
"?", ArgName
"}"] ]
else Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [ Names -> ArgName
unwords (Names -> ArgName) -> Names -> ArgName
forall a b. (a -> b) -> a -> b
$ [ArgName
"λ"] Names -> Names -> Names
forall a. [a] -> [a] -> [a]
++ Names
vars Names -> Names -> Names
forall a. [a] -> [a] -> [a]
++ [ArgName
"→", ArgName
"?"] ]
where
n :: Int
n = ListTel -> Int
forall a. Sized a => a -> Int
size ListTel
tel
hs :: [Hiding]
hs = (Dom (ArgName, Type) -> Hiding) -> ListTel -> [Hiding]
forall a b. (a -> b) -> [a] -> [b]
map Dom (ArgName, Type) -> Hiding
forall a. LensHiding a => a -> Hiding
getHiding ListTel
tel
tel' :: Telescope
tel' = ListTel -> Telescope
telFromList [ ((ArgName, Type) -> (ArgName, Type))
-> Dom (ArgName, Type) -> Dom (ArgName, Type)
forall a b. (a -> b) -> Dom' Term a -> Dom' Term b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ArgName, Type) -> (ArgName, Type)
forall {a} {b}. (Eq a, IsString a) => (a, b) -> (a, b)
makeName Dom (ArgName, Type)
b | Dom (ArgName, Type)
b <- ListTel
tel ]
makeName :: (a, b) -> (a, b)
makeName (a
"_", b
t) = (a
"x", b
t)
makeName (a
x, b
t) = (a
x, b
t)
introData :: AllowAmbiguousNames -> I.Type -> TCM [String]
introData :: AllowAmbiguousNames -> Type -> TCMT IO Names
introData AllowAmbiguousNames
amb Type
t = do
let tel :: Telescope
tel = ListTel -> Telescope
telFromList [(ArgName, Type) -> Dom (ArgName, Type)
forall a. a -> Dom a
defaultDom (ArgName
"_", Type
t)]
pat :: [Arg (Named name DeBruijnPattern)]
pat = [Named name DeBruijnPattern -> Arg (Named name DeBruijnPattern)
forall a. a -> Arg a
defaultArg (Named name DeBruijnPattern -> Arg (Named name DeBruijnPattern))
-> Named name DeBruijnPattern -> Arg (Named name DeBruijnPattern)
forall a b. (a -> b) -> a -> b
$ DeBruijnPattern -> Named name DeBruijnPattern
forall a name. a -> Named name a
unnamed (DeBruijnPattern -> Named name DeBruijnPattern)
-> DeBruijnPattern -> Named name DeBruijnPattern
forall a b. (a -> b) -> a -> b
$ ArgName -> Int -> DeBruijnPattern
forall a. DeBruijn a => ArgName -> Int -> a
debruijnNamedVar ArgName
"c" Int
0]
Bool
cubical <- Maybe Cubical -> Bool
forall a. Maybe a -> Bool
isJust (Maybe Cubical -> Bool)
-> (PragmaOptions -> Maybe Cubical) -> PragmaOptions -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PragmaOptions -> Maybe Cubical
optCubical (PragmaOptions -> Bool) -> TCMT IO PragmaOptions -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO PragmaOptions
forall (m :: * -> *). HasOptions m => m PragmaOptions
pragmaOptions
Either SplitError Covering
r <- (if Bool
cubical then TCM (Either SplitError Covering)
-> TCM (Either SplitError Covering)
forall a. a -> a
id else
Lens' TCState (WithDefault' Bool 'False)
-> (WithDefault' Bool 'False -> WithDefault' Bool 'False)
-> TCM (Either SplitError Covering)
-> TCM (Either SplitError Covering)
forall a b. Lens' TCState a -> (a -> a) -> TCMT IO b -> TCMT IO b
forall (m :: * -> *) a b.
ReadTCState m =>
Lens' TCState a -> (a -> a) -> m b -> m b
locallyTCState ((PragmaOptions -> f PragmaOptions) -> TCState -> f TCState
Lens' TCState PragmaOptions
stPragmaOptions ((PragmaOptions -> f PragmaOptions) -> TCState -> f TCState)
-> ((WithDefault' Bool 'False -> f (WithDefault' Bool 'False))
-> PragmaOptions -> f PragmaOptions)
-> (WithDefault' Bool 'False -> f (WithDefault' Bool 'False))
-> TCState
-> f TCState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (WithDefault' Bool 'False -> f (WithDefault' Bool 'False))
-> PragmaOptions -> f PragmaOptions
forall (f :: * -> *).
Functor f =>
(WithDefault' Bool 'False -> f (WithDefault' Bool 'False))
-> PragmaOptions -> f PragmaOptions
lensOptWithoutK) (WithDefault' Bool 'False
-> WithDefault' Bool 'False -> WithDefault' Bool 'False
forall a b. a -> b -> a
const (Bool -> WithDefault' Bool 'False
forall a (b :: Bool). a -> WithDefault' a b
Value Bool
False)))
(TCM (Either SplitError Covering)
-> TCM (Either SplitError Covering))
-> TCM (Either SplitError Covering)
-> TCM (Either SplitError Covering)
forall a b. (a -> b) -> a -> b
$ Induction
-> Telescope
-> [NamedArg DeBruijnPattern]
-> TCM (Either SplitError Covering)
splitLast Induction
CoInductive Telescope
tel [NamedArg DeBruijnPattern]
forall {name}. [Arg (Named name DeBruijnPattern)]
pat
case Either SplitError Covering
r of
Left SplitError
err -> Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
Right Covering
cov ->
(ConHead -> TCM ArgName) -> [ConHead] -> TCMT IO Names
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (AllowAmbiguousNames -> ConHead -> TCM ArgName
forall {f :: * -> *}.
(MonadFresh NameId f, MonadInteractionPoints f,
MonadStConcreteNames f, PureTCM f, IsString (f Doc), Null (f Doc),
Semigroup (f Doc)) =>
AllowAmbiguousNames -> ConHead -> f ArgName
showUnambiguousConName AllowAmbiguousNames
amb) ([ConHead] -> TCMT IO Names) -> [ConHead] -> TCMT IO Names
forall a b. (a -> b) -> a -> b
$ (SplitClause -> [ConHead]) -> [SplitClause] -> [ConHead]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ([NamedArg SplitPattern] -> [ConHead]
conName ([NamedArg SplitPattern] -> [ConHead])
-> (SplitClause -> [NamedArg SplitPattern])
-> SplitClause
-> [ConHead]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SplitClause -> [NamedArg SplitPattern]
scPats) ([SplitClause] -> [ConHead]) -> [SplitClause] -> [ConHead]
forall a b. (a -> b) -> a -> b
$ Covering -> [SplitClause]
splitClauses Covering
cov
introRec :: QName -> TCM [String]
introRec :: QName -> TCMT IO Names
introRec QName
d = do
[Dom Name]
hfs <- QName -> TCMT IO [Dom Name]
forall (m :: * -> *).
(HasConstInfo m, ReadTCState m, MonadError TCErr m) =>
QName -> m [Dom Name]
getRecordFieldNames QName
d
[Name]
fs <- TCMT IO Bool -> TCMT IO [Name] -> TCMT IO [Name] -> TCMT IO [Name]
forall (m :: * -> *) a. Monad m => m Bool -> m a -> m a -> m a
ifM TCMT IO Bool
forall (m :: * -> *). HasOptions m => m Bool
showImplicitArguments
([Name] -> TCMT IO [Name]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Name] -> TCMT IO [Name]) -> [Name] -> TCMT IO [Name]
forall a b. (a -> b) -> a -> b
$ (Dom Name -> Name) -> [Dom Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Dom Name -> Name
forall t e. Dom' t e -> e
unDom [Dom Name]
hfs)
([Name] -> TCMT IO [Name]
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [ Dom Name -> Name
forall t e. Dom' t e -> e
unDom Dom Name
a | Dom Name
a <- [Dom Name]
hfs, Dom Name -> Bool
forall a. LensHiding a => a -> Bool
visible Dom Name
a ])
let e :: Expr
e = Range -> RecordAssignments -> Expr
C.Rec Range
forall a. Range' a
noRange (RecordAssignments -> Expr) -> RecordAssignments -> Expr
forall a b. (a -> b) -> a -> b
$ [Name] -> (Name -> RecordAssignment) -> RecordAssignments
forall (m :: * -> *) a b. Functor m => m a -> (a -> b) -> m b
for [Name]
fs ((Name -> RecordAssignment) -> RecordAssignments)
-> (Name -> RecordAssignment) -> RecordAssignments
forall a b. (a -> b) -> a -> b
$ \ Name
f ->
FieldAssignment -> RecordAssignment
forall a b. a -> Either a b
Left (FieldAssignment -> RecordAssignment)
-> FieldAssignment -> RecordAssignment
forall a b. (a -> b) -> a -> b
$ Name -> Expr -> FieldAssignment
forall a. Name -> a -> FieldAssignment' a
C.FieldAssignment Name
f (Expr -> FieldAssignment) -> Expr -> FieldAssignment
forall a b. (a -> b) -> a -> b
$ Range -> Maybe Int -> Expr
C.QuestionMark Range
forall a. Range' a
noRange Maybe Int
forall a. Maybe a
Nothing
Names -> TCMT IO Names
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [ Expr -> ArgName
forall a. Pretty a => a -> ArgName
prettyShow Expr
e ]
atTopLevel :: TCM a -> TCM a
atTopLevel :: forall a. TCM a -> TCM a
atTopLevel TCM a
m = TCM a -> TCM a
forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
inConcreteMode (TCM a -> TCM a) -> TCM a -> TCM a
forall a b. (a -> b) -> a -> b
$ do
let err :: TCMT IO a
err = TypeError -> TCMT IO a
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCMT IO a) -> TypeError -> TCMT IO a
forall a b. (a -> b) -> a -> b
$ ArgName -> TypeError
GenericError ArgName
"The file has not been loaded yet."
TCMT IO (Maybe (ModuleName, TopLevelModuleName))
-> TCM a -> ((ModuleName, TopLevelModuleName) -> TCM a) -> TCM a
forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> m b -> (a -> m b) -> m b
caseMaybeM (Lens' TCState (Maybe (ModuleName, TopLevelModuleName))
-> TCMT IO (Maybe (ModuleName, TopLevelModuleName))
forall (m :: * -> *) a. ReadTCState m => Lens' TCState a -> m a
useTC (Maybe (ModuleName, TopLevelModuleName)
-> f (Maybe (ModuleName, TopLevelModuleName)))
-> TCState -> f TCState
Lens' TCState (Maybe (ModuleName, TopLevelModuleName))
stCurrentModule) TCM a
forall {a}. TCMT IO a
err (((ModuleName, TopLevelModuleName) -> TCM a) -> TCM a)
-> ((ModuleName, TopLevelModuleName) -> TCM a) -> TCM a
forall a b. (a -> b) -> a -> b
$ \(ModuleName
current, TopLevelModuleName
topCurrent) -> do
TCMT IO (Maybe ModuleInfo)
-> TCM a -> (ModuleInfo -> TCM a) -> TCM a
forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> m b -> (a -> m b) -> m b
caseMaybeM (TopLevelModuleName -> TCMT IO (Maybe ModuleInfo)
forall (m :: * -> *).
ReadTCState m =>
TopLevelModuleName -> m (Maybe ModuleInfo)
getVisitedModule TopLevelModuleName
topCurrent) TCM a
forall a. HasCallStack => a
__IMPOSSIBLE__ ((ModuleInfo -> TCM a) -> TCM a) -> (ModuleInfo -> TCM a) -> TCM a
forall a b. (a -> b) -> a -> b
$ \ ModuleInfo
mi -> do
let scope :: ScopeInfo
scope = Interface -> ScopeInfo
iInsideScope (Interface -> ScopeInfo) -> Interface -> ScopeInfo
forall a b. (a -> b) -> a -> b
$ ModuleInfo -> Interface
miInterface ModuleInfo
mi
Telescope
tel <- ModuleName -> TCMT IO Telescope
forall (m :: * -> *).
(Functor m, ReadTCState m) =>
ModuleName -> m Telescope
lookupSection ModuleName
current
let names :: [A.Name]
names :: [Name]
names = (LocalVar -> Name) -> [LocalVar] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map LocalVar -> Name
localVar ([LocalVar] -> [Name]) -> [LocalVar] -> [Name]
forall a b. (a -> b) -> a -> b
$ (LocalVar -> Bool) -> [LocalVar] -> [LocalVar]
forall a. (a -> Bool) -> [a] -> [a]
filter ((BindingSource
LetBound BindingSource -> BindingSource -> Bool
forall a. Eq a => a -> a -> Bool
/=) (BindingSource -> Bool)
-> (LocalVar -> BindingSource) -> LocalVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalVar -> BindingSource
localBindingSource)
([LocalVar] -> [LocalVar]) -> [LocalVar] -> [LocalVar]
forall a b. (a -> b) -> a -> b
$ ((Name, LocalVar) -> LocalVar) -> [(Name, LocalVar)] -> [LocalVar]
forall a b. (a -> b) -> [a] -> [b]
map (Name, LocalVar) -> LocalVar
forall a b. (a, b) -> b
snd ([(Name, LocalVar)] -> [LocalVar])
-> [(Name, LocalVar)] -> [LocalVar]
forall a b. (a -> b) -> a -> b
$ [(Name, LocalVar)] -> [(Name, LocalVar)]
forall a. [a] -> [a]
reverse ([(Name, LocalVar)] -> [(Name, LocalVar)])
-> [(Name, LocalVar)] -> [(Name, LocalVar)]
forall a b. (a -> b) -> a -> b
$ ScopeInfo
scope ScopeInfo
-> Lens' ScopeInfo [(Name, LocalVar)] -> [(Name, LocalVar)]
forall o i. o -> Lens' o i -> i
^. ([(Name, LocalVar)] -> f [(Name, LocalVar)])
-> ScopeInfo -> f ScopeInfo
Lens' ScopeInfo [(Name, LocalVar)]
scopeLocals
let types :: [Dom I.Type]
types :: [Dom Type]
types = (Dom (ArgName, Type) -> Dom Type) -> ListTel -> [Dom Type]
forall a b. (a -> b) -> [a] -> [b]
map ((ArgName, Type) -> Type
forall a b. (a, b) -> b
snd ((ArgName, Type) -> Type) -> Dom (ArgName, Type) -> Dom Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (ListTel -> [Dom Type]) -> ListTel -> [Dom Type]
forall a b. (a -> b) -> a -> b
$ Telescope -> ListTel
forall t. Tele (Dom t) -> [Dom (ArgName, t)]
telToList Telescope
tel
gamma :: ListTel' A.Name
gamma :: [ContextEntry]
gamma = [ContextEntry] -> Maybe [ContextEntry] -> [ContextEntry]
forall a. a -> Maybe a -> a
fromMaybe [ContextEntry]
forall a. HasCallStack => a
__IMPOSSIBLE__ (Maybe [ContextEntry] -> [ContextEntry])
-> Maybe [ContextEntry] -> [ContextEntry]
forall a b. (a -> b) -> a -> b
$
(Name -> Dom Type -> ContextEntry)
-> [Name] -> [Dom Type] -> Maybe [ContextEntry]
forall a b c. (a -> b -> c) -> [a] -> [b] -> Maybe [c]
zipWith' (\ Name
x Dom Type
dom -> (Name
x,) (Type -> (Name, Type)) -> Dom Type -> ContextEntry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Dom Type
dom) [Name]
names [Dom Type]
types
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.top" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ TCMT IO Doc
"BasicOps.atTopLevel"
, TCMT IO Doc
" names = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.sep ((Name -> TCMT IO Doc) -> [Name] -> [TCMT IO Doc]
forall a b. (a -> b) -> [a] -> [b]
map Name -> TCMT IO Doc
forall a (m :: * -> *).
(ToConcrete a, Pretty (ConOfAbs a), MonadAbsToCon m) =>
a -> m Doc
prettyA [Name]
names)
, TCMT IO Doc
" types = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.sep ((Dom Type -> TCMT IO Doc) -> [Dom Type] -> [TCMT IO Doc]
forall a b. (a -> b) -> [a] -> [b]
map Dom Type -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Dom Type -> m Doc
prettyTCM [Dom Type]
types)
]
ModuleName -> TCM a -> TCM a
forall (m :: * -> *) a. MonadTCEnv m => ModuleName -> m a -> m a
M.withCurrentModule ModuleName
current (TCM a -> TCM a) -> TCM a -> TCM a
forall a b. (a -> b) -> a -> b
$
ScopeInfo -> TCM a -> TCM a
forall (m :: * -> *) a. ReadTCState m => ScopeInfo -> m a -> m a
withScope_ ScopeInfo
scope (TCM a -> TCM a) -> TCM a -> TCM a
forall a b. (a -> b) -> a -> b
$
[ContextEntry] -> TCM a -> TCM a
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
[ContextEntry] -> m a -> m a
addContext [ContextEntry]
gamma (TCM a -> TCM a) -> TCM a -> TCM a
forall a b. (a -> b) -> a -> b
$ do
CheckpointId
cp <- Lens' TCEnv CheckpointId -> TCMT IO CheckpointId
forall (m :: * -> *) a. MonadTCEnv m => Lens' TCEnv a -> m a
viewTC (CheckpointId -> f CheckpointId) -> TCEnv -> f TCEnv
Lens' TCEnv CheckpointId
eCurrentCheckpoint
(Map ModuleName CheckpointId -> f (Map ModuleName CheckpointId))
-> TCState -> f TCState
Lens' TCState (Map ModuleName CheckpointId)
stModuleCheckpoints Lens' TCState (Map ModuleName CheckpointId)
-> (Map ModuleName CheckpointId -> Map ModuleName CheckpointId)
-> ScopeM ()
forall (m :: * -> *) a.
MonadTCState m =>
Lens' TCState a -> (a -> a) -> m ()
`modifyTCLens` (CheckpointId -> CheckpointId)
-> Map ModuleName CheckpointId -> Map ModuleName CheckpointId
forall a b. (a -> b) -> Map ModuleName a -> Map ModuleName b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CheckpointId -> CheckpointId -> CheckpointId
forall a b. a -> b -> a
const CheckpointId
cp)
TCM a
m
parseName :: Range -> String -> TCM C.QName
parseName :: Range -> ArgName -> TCM QName
parseName Range
r ArgName
s = do
Expr
e <- Range -> ArgName -> TCM Expr
parseExpr Range
r ArgName
s
let failure :: TCM QName
failure = TypeError -> TCM QName
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCM QName) -> TypeError -> TCM QName
forall a b. (a -> b) -> a -> b
$ ArgName -> TypeError
GenericError (ArgName -> TypeError) -> ArgName -> TypeError
forall a b. (a -> b) -> a -> b
$ ArgName
"Not an identifier: " ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ Expr -> ArgName
forall a. Show a => a -> ArgName
show Expr
e ArgName -> ArgName -> ArgName
forall a. [a] -> [a] -> [a]
++ ArgName
"."
TCM QName -> (QName -> TCM QName) -> Maybe QName -> TCM QName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe TCM QName
failure QName -> TCM QName
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe QName -> TCM QName) -> Maybe QName -> TCM QName
forall a b. (a -> b) -> a -> b
$ Expr -> Maybe QName
isQName Expr
e
isQName :: C.Expr -> Maybe C.QName
isQName :: Expr -> Maybe QName
isQName = \case
C.Ident QName
x -> QName -> Maybe QName
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return QName
x
Expr
_ -> Maybe QName
forall a. Maybe a
Nothing
isName :: C.Expr -> Maybe C.Name
isName :: Expr -> Maybe Name
isName = Expr -> Maybe QName
isQName (Expr -> Maybe QName)
-> (QName -> Maybe Name) -> Expr -> Maybe Name
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> \case
C.QName Name
x -> Name -> Maybe Name
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return Name
x
QName
_ -> Maybe Name
forall a. Maybe a
Nothing
moduleContents
:: Rewrite
-> Range
-> String
-> TCM ([C.Name], I.Telescope, [(C.Name, I.Type)])
moduleContents :: Rewrite
-> Range -> ArgName -> TCM ([Name], Telescope, [(Name, Type)])
moduleContents Rewrite
norm Range
rng ArgName
s = Call
-> TCM ([Name], Telescope, [(Name, Type)])
-> TCM ([Name], Telescope, [(Name, Type)])
forall a. Call -> TCMT IO a -> TCMT IO a
forall (m :: * -> *) a. MonadTrace m => Call -> m a -> m a
traceCall Call
ModuleContents (TCM ([Name], Telescope, [(Name, Type)])
-> TCM ([Name], Telescope, [(Name, Type)]))
-> TCM ([Name], Telescope, [(Name, Type)])
-> TCM ([Name], Telescope, [(Name, Type)])
forall a b. (a -> b) -> a -> b
$ do
if ArgName -> Bool
forall a. Null a => a -> Bool
null (ArgName -> ArgName
trim ArgName
s) then Rewrite -> Maybe QName -> TCM ([Name], Telescope, [(Name, Type)])
getModuleContents Rewrite
norm Maybe QName
forall a. Maybe a
Nothing else do
Expr
e <- Range -> ArgName -> TCM Expr
parseExpr Range
rng ArgName
s
case Expr -> Maybe QName
isQName Expr
e of
Maybe QName
Nothing -> Rewrite -> Expr -> TCM ([Name], Telescope, [(Name, Type)])
getRecordContents Rewrite
norm Expr
e
Just QName
x -> do
[AbstractModule]
ms :: [AbstractModule] <- QName -> ScopeInfo -> [AbstractModule]
forall a. InScope a => QName -> ScopeInfo -> [a]
scopeLookup QName
x (ScopeInfo -> [AbstractModule])
-> TCMT IO ScopeInfo -> TCMT IO [AbstractModule]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO ScopeInfo
forall (m :: * -> *). ReadTCState m => m ScopeInfo
getScope
if [AbstractModule] -> Bool
forall a. Null a => a -> Bool
null [AbstractModule]
ms then Rewrite -> Expr -> TCM ([Name], Telescope, [(Name, Type)])
getRecordContents Rewrite
norm Expr
e else Rewrite -> Maybe QName -> TCM ([Name], Telescope, [(Name, Type)])
getModuleContents Rewrite
norm (Maybe QName -> TCM ([Name], Telescope, [(Name, Type)]))
-> Maybe QName -> TCM ([Name], Telescope, [(Name, Type)])
forall a b. (a -> b) -> a -> b
$ QName -> Maybe QName
forall a. a -> Maybe a
Just QName
x
getRecordContents
:: Rewrite
-> C.Expr
-> TCM ([C.Name], I.Telescope, [(C.Name, I.Type)])
getRecordContents :: Rewrite -> Expr -> TCM ([Name], Telescope, [(Name, Type)])
getRecordContents Rewrite
norm Expr
ce = do
Expr
e <- Expr -> ScopeM (AbsOfCon Expr)
forall c. ToAbstract c => c -> ScopeM (AbsOfCon c)
toAbstract Expr
ce
(Term
_, Type
t) <- Expr -> TCM (Term, Type)
inferExpr Expr
e
let notRecordType :: TCMT IO (QName, Args, Defn)
notRecordType = TypeError -> TCMT IO (QName, Args, Defn)
forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
TypeError -> m a
typeError (TypeError -> TCMT IO (QName, Args, Defn))
-> TypeError -> TCMT IO (QName, Args, Defn)
forall a b. (a -> b) -> a -> b
$ Type -> TypeError
ShouldBeRecordType Type
t
(QName
q, Args
vs, Defn
defn) <- TCMT IO (QName, Args, Defn)
-> TCMT IO (Maybe (QName, Args, Defn))
-> TCMT IO (QName, Args, Defn)
forall (m :: * -> *) a. Monad m => m a -> m (Maybe a) -> m a
fromMaybeM TCMT IO (QName, Args, Defn)
notRecordType (TCMT IO (Maybe (QName, Args, Defn))
-> TCMT IO (QName, Args, Defn))
-> TCMT IO (Maybe (QName, Args, Defn))
-> TCMT IO (QName, Args, Defn)
forall a b. (a -> b) -> a -> b
$ Type -> TCMT IO (Maybe (QName, Args, Defn))
forall (m :: * -> *).
PureTCM m =>
Type -> m (Maybe (QName, Args, Defn))
isRecordType Type
t
case Defn
defn of
Record{ recFields :: Defn -> [Dom QName]
recFields = [Dom QName]
fs, recTel :: Defn -> Telescope
recTel = Telescope
rtel } -> do
let xs :: [Name]
xs = (Dom QName -> Name) -> [Dom QName] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (Name -> Name
nameConcrete (Name -> Name) -> (Dom QName -> Name) -> Dom QName -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QName -> Name
qnameName (QName -> Name) -> (Dom QName -> QName) -> Dom QName -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dom QName -> QName
forall t e. Dom' t e -> e
unDom) [Dom QName]
fs
tel :: Telescope
tel = Telescope -> Args -> Telescope
forall t. Apply t => t -> Args -> t
apply Telescope
rtel Args
vs
doms :: [Dom Type]
doms = Telescope -> [Dom Type]
forall a. TermSubst a => Tele (Dom a) -> [Dom a]
flattenTel Telescope
tel
ArgName -> Int -> TCMT IO Doc -> ScopeM ()
forall (m :: * -> *).
MonadDebug m =>
ArgName -> Int -> TCMT IO Doc -> m ()
reportSDoc ArgName
"interaction.contents.record" Int
20 (TCMT IO Doc -> ScopeM ()) -> TCMT IO Doc -> ScopeM ()
forall a b. (a -> b) -> a -> b
$ [TCMT IO Doc] -> TCMT IO Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
TP.vcat
[ TCMT IO Doc
"getRecordContents"
, TCMT IO Doc
" cxt = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> (Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM (Telescope -> TCMT IO Doc) -> TCMT IO Telescope -> TCMT IO Doc
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TCMT IO Telescope
forall (m :: * -> *). (Applicative m, MonadTCEnv m) => m Telescope
getContextTelescope)
, TCMT IO Doc
" tel = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
tel
, TCMT IO Doc
" doms = " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> [Dom Type] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Dom Type] -> m Doc
prettyTCM [Dom Type]
doms
, TCMT IO Doc
" doms'= " TCMT IO Doc -> TCMT IO Doc -> TCMT IO Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
TP.<+> Telescope -> TCMT IO Doc -> TCMT IO Doc
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
Telescope -> m a -> m a
addContext Telescope
tel ([Dom Type] -> TCMT IO Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Dom Type] -> m Doc
prettyTCM [Dom Type]
doms)
]
[Type]
ts <- (Dom Type -> TCMT IO Type) -> [Dom Type] -> TCMT IO [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm (Type -> TCMT IO Type)
-> (Dom Type -> Type) -> Dom Type -> TCMT IO Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dom Type -> Type
forall t e. Dom' t e -> e
unDom) [Dom Type]
doms
([Name], Telescope, [(Name, Type)])
-> TCM ([Name], Telescope, [(Name, Type)])
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], Telescope
tel, [Name] -> [Type] -> [(Name, Type)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Name]
xs [Type]
ts)
Defn
_ -> TCM ([Name], Telescope, [(Name, Type)])
forall a. HasCallStack => a
__IMPOSSIBLE__
getModuleContents
:: Rewrite
-> Maybe C.QName
-> TCM ([C.Name], I.Telescope, [(C.Name, I.Type)])
getModuleContents :: Rewrite -> Maybe QName -> TCM ([Name], Telescope, [(Name, Type)])
getModuleContents Rewrite
norm Maybe QName
mm = do
Scope
modScope <- case Maybe QName
mm of
Maybe QName
Nothing -> TCMT IO Scope
getCurrentScope
Just QName
m -> ModuleName -> TCMT IO Scope
getNamedScope (ModuleName -> TCMT IO Scope)
-> (AbstractModule -> ModuleName)
-> AbstractModule
-> TCMT IO Scope
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AbstractModule -> ModuleName
amodName (AbstractModule -> TCMT IO Scope)
-> TCMT IO AbstractModule -> TCMT IO Scope
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< QName -> TCMT IO AbstractModule
resolveModule QName
m
let modules :: ThingsInScope AbstractModule
modules :: ThingsInScope AbstractModule
modules = Scope -> ThingsInScope AbstractModule
forall a. InScope a => Scope -> ThingsInScope a
exportedNamesInScope Scope
modScope
names :: ThingsInScope AbstractName
names :: ThingsInScope AbstractName
names = Scope -> ThingsInScope AbstractName
forall a. InScope a => Scope -> ThingsInScope a
exportedNamesInScope Scope
modScope
xns :: [(Name, AbstractName)]
xns = [ (Name
x,AbstractName
n) | (Name
x, List1 AbstractName
ns) <- ThingsInScope AbstractName -> [(Name, List1 AbstractName)]
forall k a. Map k a -> [(k, a)]
Map.toList ThingsInScope AbstractName
names, AbstractName
n <- List1 AbstractName -> [Item (List1 AbstractName)]
forall l. IsList l => l -> [Item l]
List1.toList List1 AbstractName
ns ]
[(Name, Type)]
types <- [(Name, AbstractName)]
-> ((Name, AbstractName) -> TCMT IO (Maybe (Name, Type)))
-> TCMT IO [(Name, Type)]
forall (m :: * -> *) a b.
Monad m =>
[a] -> (a -> m (Maybe b)) -> m [b]
forMaybeM [(Name, AbstractName)]
xns (((Name, AbstractName) -> TCMT IO (Maybe (Name, Type)))
-> TCMT IO [(Name, Type)])
-> ((Name, AbstractName) -> TCMT IO (Maybe (Name, Type)))
-> TCMT IO [(Name, Type)]
forall a b. (a -> b) -> a -> b
$ \(Name
x, AbstractName
n) -> do
QName -> TCMT IO (Either SigError Definition)
forall (m :: * -> *).
HasConstInfo m =>
QName -> m (Either SigError Definition)
getConstInfo' (AbstractName -> QName
anameName AbstractName
n) TCMT IO (Either SigError Definition)
-> (Either SigError Definition -> TCMT IO (Maybe (Name, Type)))
-> TCMT IO (Maybe (Name, Type))
forall a b. TCMT IO a -> (a -> TCMT IO b) -> TCMT IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Right Definition
d -> do
Type
t <- Rewrite -> Type -> TCMT IO Type
forall t.
(Reduce t, Simplify t, Instantiate t, Normalise t) =>
Rewrite -> t -> TCM t
normalForm Rewrite
norm (Type -> TCMT IO Type) -> TCMT IO Type -> TCMT IO Type
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Definition -> Type
defType (Definition -> Type) -> TCMT IO Definition -> TCMT IO Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Definition -> TCMT IO Definition
forall (m :: * -> *).
(Functor m, HasConstInfo m, HasOptions m, ReadTCState m,
MonadTCEnv m, MonadDebug m) =>
Definition -> m Definition
instantiateDef Definition
d)
Maybe (Name, Type) -> TCMT IO (Maybe (Name, Type))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (Name, Type) -> TCMT IO (Maybe (Name, Type)))
-> Maybe (Name, Type) -> TCMT IO (Maybe (Name, Type))
forall a b. (a -> b) -> a -> b
$ (Name, Type) -> Maybe (Name, Type)
forall a. a -> Maybe a
Just (Name
x, Type
t)
Left{} -> Maybe (Name, Type) -> TCMT IO (Maybe (Name, Type))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (Name, Type)
forall a. Maybe a
Nothing
([Name], Telescope, [(Name, Type)])
-> TCM ([Name], Telescope, [(Name, Type)])
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (ThingsInScope AbstractModule -> [Name]
forall k a. Map k a -> [k]
Map.keys ThingsInScope AbstractModule
modules, Telescope
forall a. Tele a
EmptyTel, [(Name, Type)]
types)
whyInScope :: FilePath -> String -> TCM WhyInScopeData
whyInScope :: ArgName -> ArgName -> TCM WhyInScopeData
whyInScope ArgName
cwd ArgName
s = do
QName
x <- Range -> ArgName -> TCM QName
parseName Range
forall a. Range' a
noRange ArgName
s
ScopeInfo
scope <- TCMT IO ScopeInfo
forall (m :: * -> *). ReadTCState m => m ScopeInfo
getScope
WhyInScopeData -> TCM WhyInScopeData
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (WhyInScopeData -> TCM WhyInScopeData)
-> WhyInScopeData -> TCM WhyInScopeData
forall a b. (a -> b) -> a -> b
$ QName
-> ArgName
-> Maybe LocalVar
-> [AbstractName]
-> [AbstractModule]
-> WhyInScopeData
WhyInScopeData
QName
x
ArgName
cwd
(QName -> [(QName, LocalVar)] -> Maybe LocalVar
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup QName
x ([(QName, LocalVar)] -> Maybe LocalVar)
-> [(QName, LocalVar)] -> Maybe LocalVar
forall a b. (a -> b) -> a -> b
$ ((Name, LocalVar) -> (QName, LocalVar))
-> [(Name, LocalVar)] -> [(QName, LocalVar)]
forall a b. (a -> b) -> [a] -> [b]
map ((Name -> QName) -> (Name, LocalVar) -> (QName, LocalVar)
forall b c d. (b -> c) -> (b, d) -> (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Name -> QName
C.QName) ([(Name, LocalVar)] -> [(QName, LocalVar)])
-> [(Name, LocalVar)] -> [(QName, LocalVar)]
forall a b. (a -> b) -> a -> b
$ ScopeInfo
scope ScopeInfo
-> Lens' ScopeInfo [(Name, LocalVar)] -> [(Name, LocalVar)]
forall o i. o -> Lens' o i -> i
^. ([(Name, LocalVar)] -> f [(Name, LocalVar)])
-> ScopeInfo -> f ScopeInfo
Lens' ScopeInfo [(Name, LocalVar)]
scopeLocals)
(QName -> ScopeInfo -> [AbstractName]
forall a. InScope a => QName -> ScopeInfo -> [a]
scopeLookup QName
x ScopeInfo
scope)
(QName -> ScopeInfo -> [AbstractModule]
forall a. InScope a => QName -> ScopeInfo -> [a]
scopeLookup QName
x ScopeInfo
scope)