{-# OPTIONS_GHC -Wunused-imports #-}
{-# LANGUAGE NondecreasingIndentation #-}
module Agda.TypeChecking.Rules.LHS.Unify.LeftInverse where
import Prelude hiding ((!!), null)
import Control.Monad
import Control.Monad.State
import Control.Monad.Except
import Data.Functor
import qualified Agda.TypeChecking.Monad.Benchmark as Bench
import Agda.Syntax.Common
import Agda.Syntax.Internal
import Agda.TypeChecking.Monad
import Agda.TypeChecking.Primitive hiding (Nat)
import Agda.TypeChecking.Names
import Agda.TypeChecking.Reduce
import Agda.TypeChecking.Pretty
import Agda.TypeChecking.Substitute
import Agda.TypeChecking.Telescope
import Agda.TypeChecking.Records
import Agda.TypeChecking.Rules.LHS.Problem
import Agda.TypeChecking.Rules.LHS.Unify.Types
import Agda.Utils.List
import Agda.Utils.Maybe
import Agda.Utils.Monad
import Agda.Utils.Null
import Agda.Utils.Size
import Agda.Utils.Impossible
data DigestedUnifyStep
= DSolution Int (Dom Type) (FlexibleVar Int) Term (Either () ())
| DEtaExpandVar (FlexibleVar Int) QName Args
instance PrettyTCM DigestedUnifyStep where
prettyTCM :: forall (m :: * -> *). MonadPretty m => DigestedUnifyStep -> m Doc
prettyTCM (DSolution Int
a Dom Type
b FlexibleVar Int
c Term
d Either () ()
e) = UnifyStep -> m Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
prettyTCM (Int
-> Dom Type -> FlexibleVar Int -> Term -> Either () () -> UnifyStep
Solution Int
a Dom Type
b FlexibleVar Int
c Term
d Either () ()
e)
prettyTCM (DEtaExpandVar FlexibleVar Int
a QName
b [Arg Term]
c) = UnifyStep -> m Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
prettyTCM (FlexibleVar Int -> QName -> [Arg Term] -> UnifyStep
EtaExpandVar FlexibleVar Int
a QName
b [Arg Term]
c)
data DigestedUnifyLogEntry
= DUnificationStep UnifyState DigestedUnifyStep UnifyOutput
type DigestedUnifyLog = [(DigestedUnifyLogEntry,UnifyState)]
digestUnifyLog :: UnifyLog -> Either NoLeftInv DigestedUnifyLog
digestUnifyLog :: UnifyLog -> Either NoLeftInv DigestedUnifyLog
digestUnifyLog UnifyLog
log = UnifyLog
-> ((UnifyLogEntry, UnifyState)
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState))
-> Either NoLeftInv DigestedUnifyLog
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM UnifyLog
log \(UnificationStep UnifyState
s UnifyStep
step UnifyOutput
out, UnifyState
s') -> do
let illegal :: Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
illegal = NoLeftInv -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. a -> Either a b
Left (NoLeftInv -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState))
-> NoLeftInv
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. (a -> b) -> a -> b
$ UnifyStep -> NoLeftInv
Illegal UnifyStep
step
unsupported :: Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
unsupported = NoLeftInv -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. a -> Either a b
Left (NoLeftInv -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState))
-> NoLeftInv
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. (a -> b) -> a -> b
$ UnifyStep -> NoLeftInv
UnsupportedYet UnifyStep
step
ret :: DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
ret DigestedUnifyStep
step = (DigestedUnifyLogEntry, UnifyState)
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a. a -> Either NoLeftInv a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (UnifyState
-> DigestedUnifyStep -> UnifyOutput -> DigestedUnifyLogEntry
DUnificationStep UnifyState
s DigestedUnifyStep
step UnifyOutput
out, UnifyState
s')
case UnifyStep
step of
Solution Int
a Dom Type
b FlexibleVar Int
c Term
d Either () ()
e -> DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
ret (DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState))
-> DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. (a -> b) -> a -> b
$ Int
-> Dom Type
-> FlexibleVar Int
-> Term
-> Either () ()
-> DigestedUnifyStep
DSolution Int
a Dom Type
b FlexibleVar Int
c Term
d Either () ()
e
EtaExpandVar FlexibleVar Int
a QName
b [Arg Term]
c -> DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
ret (DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState))
-> DigestedUnifyStep
-> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a b. (a -> b) -> a -> b
$ FlexibleVar Int -> QName -> [Arg Term] -> DigestedUnifyStep
DEtaExpandVar FlexibleVar Int
a QName
b [Arg Term]
c
Deletion{} -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
illegal
TypeConInjectivity{} -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
illegal
Conflict{} -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a. HasCallStack => a
__IMPOSSIBLE__
LitConflict{} -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a. HasCallStack => a
__IMPOSSIBLE__
Cycle{} -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
forall a. HasCallStack => a
__IMPOSSIBLE__
UnifyStep
_ -> Either NoLeftInv (DigestedUnifyLogEntry, UnifyState)
unsupported
instance PrettyTCM NoLeftInv where
prettyTCM :: forall (m :: * -> *). MonadPretty m => NoLeftInv -> m Doc
prettyTCM (UnsupportedYet UnifyStep
s) = [m Doc] -> m Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
fsep ([m Doc] -> m Doc) -> [m Doc] -> m Doc
forall a b. (a -> b) -> a -> b
$ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"It relies on" [m Doc] -> [m Doc] -> [m Doc]
forall a. [a] -> [a] -> [a]
++ [UnifyStep -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
explainStep UnifyStep
s m Doc -> m Doc -> m Doc
forall a. Semigroup a => a -> a -> a
<> m Doc
","] [m Doc] -> [m Doc] -> [m Doc]
forall a. [a] -> [a] -> [a]
++ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"which is not yet supported"
prettyTCM NoLeftInv
UnsupportedCxt = String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
fwords String
"it relies on higher-dimensional unification, which is not yet supported"
prettyTCM (Illegal UnifyStep
s) = [m Doc] -> m Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
fsep ([m Doc] -> m Doc) -> [m Doc] -> m Doc
forall a b. (a -> b) -> a -> b
$ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"It relies on" [m Doc] -> [m Doc] -> [m Doc]
forall a. [a] -> [a] -> [a]
++ [UnifyStep -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
explainStep UnifyStep
s m Doc -> m Doc -> m Doc
forall a. Semigroup a => a -> a -> a
<> m Doc
","] [m Doc] -> [m Doc] -> [m Doc]
forall a. [a] -> [a] -> [a]
++ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"which is incompatible with" [m Doc] -> [m Doc] -> [m Doc]
forall a. [a] -> [a] -> [a]
++ [String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
text String
"Cubical Agda"]
prettyTCM NoLeftInv
NoCubical = String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
fwords String
"Cubical Agda is disabled"
prettyTCM NoLeftInv
WithKEnabled = String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
fwords String
"The K rule is enabled"
prettyTCM NoLeftInv
SplitOnStrict = String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
fwords String
"It splits on a type in SSet"
prettyTCM NoLeftInv
SplitOnFlat = String -> m Doc
forall (m :: * -> *). Applicative m => String -> m Doc
fwords String
"It splits on a @♭ argument"
prettyTCM (CantTransport Closure (Abs Type)
t) = [m Doc] -> m Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
fsep ([m Doc] -> m Doc) -> [m Doc] -> m Doc
forall a b. (a -> b) -> a -> b
$ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"The type" [m Doc] -> [m Doc] -> [m Doc]
forall a. Semigroup a => a -> a -> a
<> [Closure (Abs Type) -> m Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Closure (Abs Type) -> m Doc
prettyTCM Closure (Abs Type)
t] [m Doc] -> [m Doc] -> [m Doc]
forall a. Semigroup a => a -> a -> a
<> String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"can not be transported"
prettyTCM (CantTransport' Closure Type
t) = [m Doc] -> m Doc
forall (m :: * -> *) (t :: * -> *).
(Applicative m, Foldable t) =>
t (m Doc) -> m Doc
fsep ([m Doc] -> m Doc) -> [m Doc] -> m Doc
forall a b. (a -> b) -> a -> b
$ String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"The type" [m Doc] -> [m Doc] -> [m Doc]
forall a. Semigroup a => a -> a -> a
<> [Closure Type -> m Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Closure Type -> m Doc
prettyTCM Closure Type
t] [m Doc] -> [m Doc] -> [m Doc]
forall a. Semigroup a => a -> a -> a
<> String -> [m Doc]
forall (m :: * -> *). Applicative m => String -> [m Doc]
pwords String
"can not be transported"
data NoLeftInv
= UnsupportedYet {NoLeftInv -> UnifyStep
badStep :: UnifyStep}
| Illegal {badStep :: UnifyStep}
| NoCubical
| WithKEnabled
| SplitOnStrict
| SplitOnFlat
| UnsupportedCxt
| CantTransport (Closure (Abs Type))
| CantTransport' (Closure Type)
deriving Int -> NoLeftInv -> ShowS
[NoLeftInv] -> ShowS
NoLeftInv -> String
(Int -> NoLeftInv -> ShowS)
-> (NoLeftInv -> String)
-> ([NoLeftInv] -> ShowS)
-> Show NoLeftInv
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NoLeftInv -> ShowS
showsPrec :: Int -> NoLeftInv -> ShowS
$cshow :: NoLeftInv -> String
show :: NoLeftInv -> String
$cshowList :: [NoLeftInv] -> ShowS
showList :: [NoLeftInv] -> ShowS
Show
buildLeftInverse :: UnifyState -> UnifyLog -> TCM (Either NoLeftInv (Substitution, Substitution))
buildLeftInverse :: UnifyState
-> UnifyLog -> TCM (Either NoLeftInv (Substitution, Substitution))
buildLeftInverse UnifyState
s0 UnifyLog
log = Account (BenchPhase (TCMT IO))
-> TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall (m :: * -> *) c.
MonadBench m =>
Account (BenchPhase m) -> m c -> m c
Bench.billTo [BenchPhase (TCMT IO)
Phase
Bench.UnifyIndices, BenchPhase (TCMT IO)
Phase
Bench.CubicalLeftInversion] (TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution)))
-> TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a b. (a -> b) -> a -> b
$ case UnifyLog -> Either NoLeftInv DigestedUnifyLog
digestUnifyLog UnifyLog
log of
Left NoLeftInv
no -> do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv.badstep" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"No Left Inverse:" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> UnifyStep -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
prettyTCM (NoLeftInv -> UnifyStep
badStep NoLeftInv
no)
Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NoLeftInv -> Either NoLeftInv (Substitution, Substitution)
forall a b. a -> Either a b
Left NoLeftInv
no)
Right DigestedUnifyLog
log -> do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv.badstep" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ do
cubical <- TCMT IO (Maybe Cubical)
forall (m :: * -> *). HasOptions m => m (Maybe Cubical)
cubicalOption
"cubical:" <+> text (show cubical)
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv.badstep" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ do
pathp <- BuiltinId -> TCMT IO (Maybe Term)
forall (m :: * -> *) a.
(HasBuiltins m, IsBuiltin a) =>
a -> m (Maybe Term)
getTerm' BuiltinId
builtinPathP
"pathp:" <+> text (show $ isJust pathp)
let
cond :: TCMT IO Bool
cond = [TCMT IO Bool] -> TCMT IO Bool
forall (f :: * -> *) (m :: * -> *).
(Foldable f, Monad m) =>
f (m Bool) -> m Bool
andM
[ Context -> Bool
forall a. Null a => a -> Bool
null (Context -> Bool) -> TCMT IO Context -> TCMT IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TCMT IO Context
forall (m :: * -> *). MonadTCEnv m => m Context
getContext
]
compose :: [(Retract, Term)] -> ExceptT NoLeftInv TCM Retract
compose :: [(Retract, Term)] -> ExceptT NoLeftInv (TCMT IO) Retract
compose [] = ExceptT NoLeftInv (TCMT IO) Retract
forall a. HasCallStack => a
__IMPOSSIBLE__
compose [(Retract
xs, Term
_)] = Retract -> ExceptT NoLeftInv (TCMT IO) Retract
forall a. a -> ExceptT NoLeftInv (TCMT IO) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Retract
xs
compose ((Retract
x, Term
t):[(Retract, Term)]
xs) = do
r <- [(Retract, Term)] -> ExceptT NoLeftInv (TCMT IO) Retract
compose [(Retract, Term)]
xs
ExceptT $ composeRetract x t r <&> \case
Left Closure (Abs Type)
e -> NoLeftInv -> Either NoLeftInv Retract
forall a b. a -> Either a b
Left (Closure (Abs Type) -> NoLeftInv
CantTransport Closure (Abs Type)
e)
Right Retract
x -> Retract -> Either NoLeftInv Retract
forall a b. b -> Either a b
Right Retract
x
TCMT IO Bool
-> TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall (m :: * -> *) a. Monad m => m Bool -> m a -> m a -> m a
ifNotM TCMT IO Bool
cond (Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution)))
-> Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a b. (a -> b) -> a -> b
$ NoLeftInv -> Either NoLeftInv (Substitution, Substitution)
forall a b. a -> Either a b
Left NoLeftInv
UnsupportedCxt) (TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution)))
-> TCM (Either NoLeftInv (Substitution, Substitution))
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a b. (a -> b) -> a -> b
$ do
equivs <- DigestedUnifyLog
-> ((DigestedUnifyLogEntry, UnifyState)
-> TCMT IO (Either NoLeftInv (Retract, Term)))
-> TCMT IO [Either NoLeftInv (Retract, Term)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM DigestedUnifyLog
log (((DigestedUnifyLogEntry, UnifyState)
-> TCMT IO (Either NoLeftInv (Retract, Term)))
-> TCMT IO [Either NoLeftInv (Retract, Term)])
-> ((DigestedUnifyLogEntry, UnifyState)
-> TCMT IO (Either NoLeftInv (Retract, Term)))
-> TCMT IO [Either NoLeftInv (Retract, Term)]
forall a b. (a -> b) -> a -> b
$ (DigestedUnifyLogEntry
-> UnifyState -> TCMT IO (Either NoLeftInv (Retract, Term)))
-> (DigestedUnifyLogEntry, UnifyState)
-> TCMT IO (Either NoLeftInv (Retract, Term))
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry DigestedUnifyLogEntry
-> UnifyState -> TCMT IO (Either NoLeftInv (Retract, Term))
buildEquiv
case sequence equivs of
Left NoLeftInv
no -> do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv.badstep" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"No Left Inverse:" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> UnifyStep -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
prettyTCM (NoLeftInv -> UnifyStep
badStep NoLeftInv
no)
Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NoLeftInv -> Either NoLeftInv (Substitution, Substitution)
forall a b. a -> Either a b
Left NoLeftInv
no)
Right [(Retract, Term)]
xs -> ExceptT NoLeftInv (TCMT IO) Retract
-> TCM (Either NoLeftInv Retract)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT ([(Retract, Term)] -> ExceptT NoLeftInv (TCMT IO) Retract
compose [(Retract, Term)]
xs) TCM (Either NoLeftInv Retract)
-> (Either NoLeftInv Retract
-> TCM (Either NoLeftInv (Substitution, Substitution)))
-> TCM (Either NoLeftInv (Substitution, Substitution))
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
Left NoLeftInv
no -> Either NoLeftInv (Substitution, Substitution)
-> TCM (Either NoLeftInv (Substitution, Substitution))
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NoLeftInv -> Either NoLeftInv (Substitution, Substitution)
forall a b. a -> Either a b
Left NoLeftInv
no)
Right (Telescope
_, Substitution
_, Substitution
tau0, Substitution
leftInv0) -> do
let tau :: Substitution
tau = Substitution
tau0 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Int -> Substitution
forall a. Int -> Substitution' a
raiseS Int
1
unview <- TCMT IO (IntervalView -> Term)
forall (m :: * -> *). HasBuiltins m => m (IntervalView -> Term)
intervalUnview'
let replaceAt Int
n a
x [a]
xs = [a]
xs0 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs1
where ([a]
xs0,a
_:[a]
xs1) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
xs
let max Term
r Term
s = IntervalView -> Term
unview (IntervalView -> Term) -> IntervalView -> Term
forall a b. (a -> b) -> a -> b
$ Arg Term -> Arg Term -> IntervalView
IMax (Term -> Arg Term
forall e. e -> Arg e
argN Term
r) (Term -> Arg Term
forall e. e -> Arg e
argN Term
s)
neg Term
r = IntervalView -> Term
unview (IntervalView -> Term) -> IntervalView -> Term
forall a b. (a -> b) -> a -> b
$ Arg Term -> IntervalView
INeg (Term -> Arg Term
forall e. e -> Arg e
argN Term
r)
let phieq = Term -> Term
neg (Int -> Term
var Int
0) Term -> Term -> Term
`max` Int -> Term
var (Telescope -> Int
forall a. Sized a => a -> Int
size (UnifyState -> Telescope
eqTel UnifyState
s0) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
let leftInv = Impossible -> [Term] -> Substitution
forall a. DeBruijn a => Impossible -> [a] -> Substitution' a
termsS Impossible
forall a. HasCallStack => a
__IMPOSSIBLE__ ([Term] -> Substitution) -> [Term] -> Substitution
forall a b. (a -> b) -> a -> b
$ Int -> Term -> [Term] -> [Term]
forall {a}. Int -> a -> [a] -> [a]
replaceAt (Telescope -> Int
forall a. Sized a => a -> Int
size (UnifyState -> Telescope
varTel UnifyState
s0)) Term
phieq ([Term] -> [Term]) -> [Term] -> [Term]
forall a b. (a -> b) -> a -> b
$ (Int -> Term) -> [Int] -> [Term]
forall a b. (a -> b) -> [a] -> [b]
map (Substitution -> Int -> Term
forall a. EndoSubst a => Substitution' a -> Int -> a
lookupS Substitution
leftInv0) ([Int] -> [Term]) -> [Int] -> [Term]
forall a b. (a -> b) -> a -> b
$ Int -> [Int]
forall a. Integral a => a -> [a]
downFrom (Telescope -> Int
forall a. Sized a => a -> Int
size (UnifyState -> Telescope
varTel UnifyState
s0) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Telescope -> Int
forall a. Sized a => a -> Int
size (UnifyState -> Telescope
eqTel UnifyState
s0))
let working_tel = Telescope -> Telescope -> Telescope
forall t. Abstract t => Telescope -> t -> t
abstract (UnifyState -> Telescope
varTel UnifyState
s0) (Dom Type -> Abs Telescope -> Telescope
forall a. a -> Abs (Tele a) -> Tele a
ExtendTel Dom Type
HasCallStack => Dom Type
__DUMMY_DOM__ (Abs Telescope -> Telescope) -> Abs Telescope -> Telescope
forall a b. (a -> b) -> a -> b
$ String -> Telescope -> Abs Telescope
forall a. String -> a -> Abs a
Abs String
"phi0" (Telescope -> Abs Telescope) -> Telescope -> Abs Telescope
forall a b. (a -> b) -> a -> b
$ (UnifyState -> Telescope
eqTel UnifyState
s0))
reportSDoc "tc.lhs.unify.inv" 20 $ "=== before mod"
do
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "tau0 :" <+> prettyTCM tau0
addContext working_tel $ addContext ("r" :: String, __DUMMY_DOM__)
$ reportSDoc "tc.lhs.unify.inv" 20 $ "leftInv0: " <+> prettyTCM leftInv0
reportSDoc "tc.lhs.unify.inv" 20 $ "=== after mod"
do
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "tau :" <+> prettyTCM tau
addContext working_tel $ addContext ("r" :: String, __DUMMY_DOM__)
$ reportSDoc "tc.lhs.unify.inv" 20 $ "leftInv: " <+> prettyTCM leftInv
return $ Right (tau,leftInv)
type Retract = (Telescope, Substitution, Substitution, Substitution)
termsS :: DeBruijn a => Impossible -> [a] -> Substitution' a
termsS :: forall a. DeBruijn a => Impossible -> [a] -> Substitution' a
termsS Impossible
e [a]
xs = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
xs [a] -> Substitution' a -> Substitution' a
forall a. DeBruijn a => [a] -> Substitution' a -> Substitution' a
++# Impossible -> Substitution' a
forall a. Impossible -> Substitution' a
EmptyS Impossible
e
composeRetract :: Retract -> Term -> Retract -> TCM (Either (Closure (Abs Type)) Retract)
composeRetract :: Retract
-> Term -> Retract -> TCM (Either (Closure (Abs Type)) Retract)
composeRetract (Telescope
prob0,Substitution
rho0,Substitution
tau0,Substitution
leftInv0) Term
phi0 (Telescope
prob1,Substitution
rho1,Substitution
tau1,Substitution
leftInv1) = do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"=== composing"
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"Γ0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Telescope -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
prob0
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"tau0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
tau0
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"Γ1 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Telescope -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Telescope -> m Doc
prettyTCM Telescope
prob1
Telescope -> TCMT IO () -> TCMT IO ()
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
prob1 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"tau1 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
tau1
let prob :: Telescope
prob = Telescope
prob0
let rho :: Substitution
rho = Substitution
rho1 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Substitution
rho0
let tau :: Substitution
tau = Substitution
tau0 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Substitution
tau1
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"tau :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
tau
let step0 :: Substitution
step0 = Int -> Substitution -> Substitution
forall a. Int -> Substitution' a -> Substitution' a
liftS Int
1 Substitution
tau0 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Substitution
leftInv1 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Substitution
rho0
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ (String, Dom Type) -> TCMT IO () -> TCMT IO ()
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
(String, Dom Type) -> m a -> m a
addContext (String
"r" :: String, Dom Type
HasCallStack => Dom Type
__DUMMY_DOM__) (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"leftInv0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
leftInv0
Telescope -> TCMT IO () -> TCMT IO ()
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
prob1 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"rho0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
rho0
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"tau0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
tau0
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"rhos0[tau0] :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM (Substitution
tau0 Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Substitution
rho0)
Telescope -> TCMT IO () -> TCMT IO ()
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
prob1 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ (String, Dom Type) -> TCMT IO () -> TCMT IO ()
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
(String, Dom Type) -> m a -> m a
addContext (String
"r" :: String, Dom Type
HasCallStack => Dom Type
__DUMMY_DOM__) (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"leftInv1 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
leftInv1
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ (String, Dom Type) -> TCMT IO () -> TCMT IO ()
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
(String, Dom Type) -> m a -> m a
addContext (String
"r" :: String, Dom Type
HasCallStack => Dom Type
__DUMMY_DOM__) (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"step0 :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
step0
interval <- TCMT IO Type
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Type
primIntervalType
max <- primIMax
neg <- primINeg
result <- sequenceA <$> do
addContext prob0 $ runNamesT (teleNames prob0) $ do
phi <- open phi0
g0 <- open $ raise (size prob0) prob0
step0 <- open $ Abs "i" $ step0 `applySubst` teleArgs prob0
leftInv0 <- open $ Abs "i" $ map unArg $ leftInv0 `applySubst` teleArgs prob0
bind "i" $ \ forall b. (Subst b, DeBruijn b) => NamesT (TCMT IO) b
i -> (String, Dom Type)
-> NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term])
-> NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term])
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
(String, Dom Type) -> m a -> m a
addContext (String
"i" :: String, Type -> Dom Type
forall a. a -> Dom a
defaultDom Type
interval) (NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term])
-> NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term]))
-> NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term])
-> NamesT (TCMT IO) (Either (Closure (Abs Type)) [Term])
forall a b. (a -> b) -> a -> b
$ do
tel <- String
-> ((forall b. (Subst b, DeBruijn b) => NamesT (TCMT IO) b)
-> NamesT (TCMT IO) Telescope)
-> NamesT (TCMT IO) (Abs Telescope)
forall (m :: * -> *) a.
Monad m =>
String
-> ((forall b. (Subst b, DeBruijn b) => NamesT m b) -> NamesT m a)
-> NamesT m (Abs a)
bind String
"_" (((forall b. (Subst b, DeBruijn b) => NamesT (TCMT IO) b)
-> NamesT (TCMT IO) Telescope)
-> NamesT (TCMT IO) (Abs Telescope))
-> ((forall b. (Subst b, DeBruijn b) => NamesT (TCMT IO) b)
-> NamesT (TCMT IO) Telescope)
-> NamesT (TCMT IO) (Abs Telescope)
forall a b. (a -> b) -> a -> b
$ \ (NamesT (TCMT IO) Term
_ :: NamesT tcm Term) -> NamesT (TCMT IO) Telescope
g0
step0i <- lazyAbsApp <$> step0 <*> i
face <- pure max <@> (pure neg <@> i) <@> phi
leftInv0 <- leftInv0
i <- i
lift $ runExceptT (map unArg <$> transpSysTel' True tel [(i, leftInv0)] face step0i)
case result of
Left Closure (Abs Type)
cl -> Either (Closure (Abs Type)) Retract
-> TCM (Either (Closure (Abs Type)) Retract)
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Closure (Abs Type) -> Either (Closure (Abs Type)) Retract
forall a b. a -> Either a b
Left Closure (Abs Type)
cl)
Right Abs [Term]
leftInv -> do
let sigma :: Substitution
sigma = Impossible -> [Term] -> Substitution
forall a. DeBruijn a => Impossible -> [a] -> Substitution' a
termsS Impossible
forall a. HasCallStack => a
__IMPOSSIBLE__ ([Term] -> Substitution) -> [Term] -> Substitution
forall a b. (a -> b) -> a -> b
$ Abs [Term] -> [Term]
forall a. Subst a => Abs a -> a
absBody Abs [Term]
leftInv
String -> Int -> TCMT IO () -> TCMT IO ()
forall (m :: * -> *). MonadDebug m => String -> Int -> m () -> m ()
verboseS String
"tc.lhs.unify.inv" Int
20 do
Telescope -> TCMT IO () -> TCMT IO ()
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
prob0 (TCMT IO () -> TCMT IO ()) -> TCMT IO () -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ (String, Dom Type) -> TCMT IO () -> TCMT IO ()
forall b (m :: * -> *) a.
(AddContext b, MonadAddContext m) =>
b -> m a -> m a
forall (m :: * -> *) a.
MonadAddContext m =>
(String, Dom Type) -> m a -> m a
addContext (String
"r" :: String, Dom Type
HasCallStack => Dom Type
__DUMMY_DOM__) do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"leftInv :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> [Term] -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => [Term] -> m Doc
prettyTCM (Abs [Term] -> [Term]
forall a. Subst a => Abs a -> a
absBody Abs [Term]
leftInv)
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
40 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"leftInv :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> [Term] -> TCM Doc
forall (m :: * -> *) a. (Applicative m, Pretty a) => a -> m Doc
pretty (Abs [Term] -> [Term]
forall a. Subst a => Abs a -> a
absBody Abs [Term]
leftInv)
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
40 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"leftInvSub :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall (m :: * -> *) a. (Applicative m, Pretty a) => a -> m Doc
pretty Substitution
sigma
Either (Closure (Abs Type)) Retract
-> TCM (Either (Closure (Abs Type)) Retract)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either (Closure (Abs Type)) Retract
-> TCM (Either (Closure (Abs Type)) Retract))
-> Either (Closure (Abs Type)) Retract
-> TCM (Either (Closure (Abs Type)) Retract)
forall a b. (a -> b) -> a -> b
$ Retract -> Either (Closure (Abs Type)) Retract
forall a b. b -> Either a b
Right (Telescope
prob, Substitution
rho, Substitution
tau, Substitution
sigma)
buildEquiv :: DigestedUnifyLogEntry -> UnifyState -> TCM (Either NoLeftInv (Retract,Term))
buildEquiv :: DigestedUnifyLogEntry
-> UnifyState -> TCMT IO (Either NoLeftInv (Retract, Term))
buildEquiv (DUnificationStep UnifyState
st step :: DigestedUnifyStep
step@(DSolution Int
k Dom Type
ty FlexibleVar Int
fx Term
tm Either () ()
side) UnifyOutput
output) UnifyState
next = ExceptT NoLeftInv (TCMT IO) (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term))
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT NoLeftInv (TCMT IO) (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term)))
-> ExceptT NoLeftInv (TCMT IO) (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term))
forall a b. (a -> b) -> a -> b
$ do
let
cantTransport' :: ExceptT (Closure Type) TCM b -> ExceptT NoLeftInv TCM b
cantTransport' :: forall b.
ExceptT (Closure Type) (TCMT IO) b -> ExceptT NoLeftInv (TCMT IO) b
cantTransport' ExceptT (Closure Type) (TCMT IO) b
m = (Closure Type -> NoLeftInv)
-> ExceptT (Closure Type) (TCMT IO) b
-> ExceptT NoLeftInv (TCMT IO) b
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT Closure Type -> NoLeftInv
CantTransport' ExceptT (Closure Type) (TCMT IO) b
m
cantTransport :: ExceptT (Closure (Abs Type)) TCM b -> ExceptT NoLeftInv TCM b
cantTransport :: forall b.
ExceptT (Closure (Abs Type)) (TCMT IO) b
-> ExceptT NoLeftInv (TCMT IO) b
cantTransport ExceptT (Closure (Abs Type)) (TCMT IO) b
m = (Closure (Abs Type) -> NoLeftInv)
-> ExceptT (Closure (Abs Type)) (TCMT IO) b
-> ExceptT NoLeftInv (TCMT IO) b
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT Closure (Abs Type) -> NoLeftInv
CantTransport ExceptT (Closure (Abs Type)) (TCMT IO) b
m
String -> Int -> TCM Doc -> ExceptT NoLeftInv (TCMT IO) ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> ExceptT NoLeftInv (TCMT IO) ())
-> TCM Doc -> ExceptT NoLeftInv (TCMT IO) ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"step unifyState:" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> UnifyState -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => UnifyState -> m Doc
prettyTCM UnifyState
st
String -> Int -> TCM Doc -> ExceptT NoLeftInv (TCMT IO) ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> ExceptT NoLeftInv (TCMT IO) ())
-> TCM Doc -> ExceptT NoLeftInv (TCMT IO) ()
forall a b. (a -> b) -> a -> b
$ TCM Doc
"step step:" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Telescope -> TCM Doc -> TCM 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 (UnifyState -> Telescope
varTel UnifyState
st) (DigestedUnifyStep -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => DigestedUnifyStep -> m Doc
prettyTCM DigestedUnifyStep
step)
unview <- ExceptT NoLeftInv (TCMT IO) (IntervalView -> Term)
forall (m :: * -> *). HasBuiltins m => m (IntervalView -> Term)
intervalUnview'
cxt <- getContextTelescope
reportSDoc "tc.lhs.unify.inv" 20 $ "context:" <+> prettyTCM cxt
let
m = UnifyState -> Int
varCount UnifyState
st
gamma = UnifyState -> Telescope
varTel UnifyState
st
eqs = UnifyState -> Telescope
eqTel UnifyState
st
u = UnifyState -> [Arg Term]
eqLHS UnifyState
st [Arg Term] -> Int -> Arg Term
forall a. HasCallStack => [a] -> Int -> a
!! Int
k
v = UnifyState -> [Arg Term]
eqRHS UnifyState
st [Arg Term] -> Int -> Arg Term
forall a. HasCallStack => [a] -> Int -> a
!! Int
k
x = FlexibleVar Int -> Int
forall a. FlexibleVar a -> a
flexVar FlexibleVar Int
fx
neqs = Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
eqs
phis = Int
1
interval <- lift $ primIntervalType
let gamma_phis = Telescope -> Telescope -> Telescope
forall t. Abstract t => Telescope -> t -> t
abstract Telescope
gamma (Telescope -> Telescope) -> Telescope -> Telescope
forall a b. (a -> b) -> a -> b
$ ListTel -> Telescope
telFromList (ListTel -> Telescope) -> ListTel -> Telescope
forall a b. (a -> b) -> a -> b
$
(Int -> Dom (String, Type)) -> [Int] -> ListTel
forall a b. (a -> b) -> [a] -> [b]
map ((String, Type) -> Dom (String, Type)
forall a. a -> Dom a
defaultDom ((String, Type) -> Dom (String, Type))
-> (Int -> (String, Type)) -> Int -> Dom (String, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,Type
interval) (String -> (String, Type))
-> (Int -> String) -> Int -> (String, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"phi" String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> (Int -> String) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show) [Int
0 .. Int
phis Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
working_tel <- abstract gamma_phis <$>
cantTransport' (pathTelescope' (raise phis $ eqTel st) (raise phis $ eqLHS st) (raise phis $ eqRHS st))
reportSDoc "tc.lhs.unify.inv" 20 $ vcat
[ "working tel:" <+> prettyTCM (working_tel :: Telescope)
, addContext working_tel $ "working tel args:" <+> prettyTCM (teleArgs working_tel :: [Arg Term])
]
(tau,leftInv,phi) <- addContext working_tel $ runNamesT [] $ do
let raiseFrom Telescope
tel Term
x = Int -> Term -> Term
forall a. Subst a => Int -> a -> a
raise (Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
working_tel Int -> Int -> Int
forall a. Num a => a -> a -> a
- Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
tel) Term
x
u <- open . raiseFrom gamma . unArg $ u
v <- open . raiseFrom gamma . unArg $ v
let phi = Telescope -> Term -> Term
raiseFrom Telescope
gamma_phis (Term -> Term) -> Term -> Term
forall a b. (a -> b) -> a -> b
$ Int -> Term
var Int
0
let all_args = Telescope -> [Arg Term]
forall a t. DeBruijn a => Tele (Dom t) -> [Arg a]
teleArgs Telescope
working_tel
let bindSplit (Telescope
tel1,a
tel2) = (Telescope
tel1,Names -> a -> AbsN a
forall a. Names -> a -> AbsN a
AbsN (Telescope -> Names
teleNames Telescope
tel1) a
tel2)
let (gamma1, xxi) = bindSplit $ splitTelescopeAt (size gamma - x - 1) working_tel
let (gamma1_args,xxi_args) = splitAt (size gamma1) all_args
(_x_arg:xi_args) = xxi_args
(x_arg:xi0,k_arg:xi1) = splitAt ((size gamma - size gamma1) + phis + k) xxi_args
let
xxi_here :: Telescope
xxi_here = AbsN Telescope -> [SubstArg Telescope] -> Telescope
forall a. Subst a => AbsN a -> [SubstArg a] -> a
absAppN AbsN Telescope
xxi ([SubstArg Telescope] -> Telescope)
-> [SubstArg Telescope] -> Telescope
forall a b. (a -> b) -> a -> b
$ (Arg Term -> SubstArg Telescope)
-> [Arg Term] -> [SubstArg Telescope]
forall a b. (a -> b) -> [a] -> [b]
map Arg Term -> Term
Arg Term -> SubstArg Telescope
forall e. Arg e -> e
unArg [Arg Term]
gamma1_args
let (xpre,krest) = bindSplit $ splitTelescopeAt ((size gamma - size gamma1) + phis + k) xxi_here
k_arg <- open $ unArg k_arg
xpre <- open xpre
krest <- open krest
delta <- bindN ["x","eq"] $ \ [NamesT (ExceptT NoLeftInv (TCMT IO)) Term
x,NamesT (ExceptT NoLeftInv (TCMT IO)) Term
eq] -> do
let pre :: NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
pre = Telescope -> Term -> Telescope
forall t. Apply t => t -> Term -> t
apply1 (Telescope -> Term -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Telescope)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
xpre NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
x
NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
-> (Vars (ExceptT NoLeftInv (TCMT IO))
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall (m :: * -> *) a.
(Monad m, Abstract a) =>
NamesT m Telescope -> (Vars m -> NamesT m a) -> NamesT m a
abstractN NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
pre ((Vars (ExceptT NoLeftInv (TCMT IO))
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope)
-> (Vars (ExceptT NoLeftInv (TCMT IO))
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall a b. (a -> b) -> a -> b
$ \ Vars (ExceptT NoLeftInv (TCMT IO))
args ->
Telescope -> Term -> Telescope
forall t. Apply t => t -> Term -> t
apply1 (Telescope -> Term -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Telescope)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (AbsN Telescope)
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) (SubstArg Telescope)]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall (m :: * -> *) a.
(Monad m, Subst a) =>
NamesT m (AbsN a) -> [NamesT m (SubstArg a)] -> NamesT m a
applyN NamesT (ExceptT NoLeftInv (TCMT IO)) (AbsN Telescope)
krest (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
xNamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
forall a. a -> [a] -> [a]
:[NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
Vars (ExceptT NoLeftInv (TCMT IO))
args) NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
eq
let d_zero_args = [Arg Term]
xi0 [Arg Term] -> [Arg Term] -> [Arg Term]
forall a. [a] -> [a] -> [a]
++ [Arg Term]
xi1
reportSDoc "tc.lhs.unify.inv" 20 $ "size delta:" <+> text (show $ size $ unAbsN delta)
reportSDoc "tc.lhs.unify.inv" 20 $ "size d0args:" <+> text (show $ size d_zero_args)
let appSide = case Either () ()
side of
Left{} -> Term -> Term
forall a. a -> a
id
Right{} -> IntervalView -> Term
unview (IntervalView -> Term) -> (Term -> IntervalView) -> Term -> Term
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg Term -> IntervalView
INeg (Arg Term -> IntervalView)
-> (Term -> Arg Term) -> Term -> IntervalView
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term -> Arg Term
forall e. e -> Arg e
argN
let
csingl NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i = (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Arg Term))
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
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 ((Term -> Arg Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Arg Term)
forall a b.
(a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Term -> Arg Term
forall e. e -> Arg e
defaultArg) ([NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term])
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b. (a -> b) -> a -> b
$ NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
csingl' NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i
csingl' NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i = [ NamesT (ExceptT NoLeftInv (TCMT IO)) Term
k_arg NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term,
NamesT (ExceptT NoLeftInv (TCMT IO)) Term,
NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (m :: * -> *).
Applicative m =>
m Term -> (m Term, m Term, m Term) -> m Term
<@@> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
u, NamesT (ExceptT NoLeftInv (TCMT IO)) Term
v, Term -> Term
appSide (Term -> Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i)
, String
-> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (m :: * -> *).
Monad m =>
String -> (NamesT m Term -> NamesT m Term) -> NamesT m Term
lam String
"j" ((NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall a b. (a -> b) -> a -> b
$ \ NamesT (ExceptT NoLeftInv (TCMT IO)) Term
j ->
let r :: Term -> Term -> Term
r Term
i Term
j = case Either () ()
side of
Left{} -> IntervalView -> Term
unview (Arg Term -> Arg Term -> IntervalView
IMax (Term -> Arg Term
forall e. e -> Arg e
argN Term
j) (Term -> Arg Term
forall e. e -> Arg e
argN Term
i))
Right{} -> IntervalView -> Term
unview (Arg Term -> Arg Term -> IntervalView
IMin (Term -> Arg Term
forall e. e -> Arg e
argN Term
j) (Term -> Arg Term
forall e. e -> Arg e
argN (Term -> Arg Term)
-> (IntervalView -> Term) -> IntervalView -> Arg Term
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntervalView -> Term
unview (IntervalView -> Arg Term) -> IntervalView -> Arg Term
forall a b. (a -> b) -> a -> b
$ Arg Term -> IntervalView
INeg (Arg Term -> IntervalView) -> Arg Term -> IntervalView
forall a b. (a -> b) -> a -> b
$ Term -> Arg Term
forall e. e -> Arg e
argN Term
i))
in NamesT (ExceptT NoLeftInv (TCMT IO)) Term
k_arg NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term,
NamesT (ExceptT NoLeftInv (TCMT IO)) Term,
NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (m :: * -> *).
Applicative m =>
m Term -> (m Term, m Term, m Term) -> m Term
<@@> (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
u, NamesT (ExceptT NoLeftInv (TCMT IO)) Term
v, Term -> Term -> Term
r (Term -> Term -> Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Term)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> Term)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
j)
]
let replaceAt Int
n a
x [a]
xs = [a]
xs0 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs1
where ([a]
xs0,a
_:[a]
xs1) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
xs
dropAt Int
n [a]
xs = [a]
xs0 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
xs1
where ([a]
xs0,a
_:[a]
xs1) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
xs
delta <- open delta
d <- bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i -> NamesT (ExceptT NoLeftInv (TCMT IO)) (AbsN Telescope)
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) (SubstArg Telescope)]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall (m :: * -> *) a.
(Monad m, Subst a) =>
NamesT m (AbsN a) -> [NamesT m (SubstArg a)] -> NamesT m a
applyN NamesT (ExceptT NoLeftInv (TCMT IO)) (AbsN Telescope)
delta (NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> [NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
csingl' NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i)
let flag = Bool
True
tau <- (gamma1_args ++) <$>
lift (cantTransport (transpTel' flag d phi d_zero_args))
reportSDoc "tc.lhs.unify.inv" 20 $ "tau :" <+> prettyTCM (map (setHiding NotHidden) tau)
leftInv <- do
gamma1_args <- open gamma1_args
phi <- open phi
xi0 <- open xi0
xi1 <- open xi1
delta0 <- bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i -> Telescope -> [Arg Term] -> Telescope
forall t. Apply t => t -> [Arg Term] -> t
apply (Telescope -> [Arg Term] -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
-> NamesT (ExceptT NoLeftInv (TCMT IO)) ([Arg Term] -> Telescope)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
xpre NamesT (ExceptT NoLeftInv (TCMT IO)) ([Arg Term] -> Telescope)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Telescope
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int -> [Arg Term] -> [Arg Term]
forall a. Int -> [a] -> [a]
take Int
1 ([Arg Term] -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
(a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
csingl NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i)
delta0 <- open delta0
xi0f <- bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i -> do
m <- Bool
-> Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term]
forall (m :: * -> *).
(PureTCM m, MonadError TCErr m) =>
Bool
-> Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) m [Arg Term]
trFillTel' Bool
flag (Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs Telescope)
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs Telescope)
delta0 NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
([Arg Term]
-> Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
phi NamesT
(ExceptT NoLeftInv (TCMT IO))
([Arg Term]
-> Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
xi0 NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i
lift (cantTransport m)
xi0f <- open xi0f
delta1 <- bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i -> do
args <- (Arg Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(NamesT (ExceptT NoLeftInv (TCMT IO)) Term))
-> [Arg Term]
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
[NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
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 (Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
forall (m :: * -> *) a.
(Monad m, Subst a) =>
a -> NamesT m (NamesT m a)
open (Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(NamesT (ExceptT NoLeftInv (TCMT IO)) Term))
-> (Arg Term -> Term)
-> Arg Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(NamesT (ExceptT NoLeftInv (TCMT IO)) Term)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg Term -> Term
forall e. Arg e -> e
unArg) ([Arg Term]
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
[NamesT (ExceptT NoLeftInv (TCMT IO)) Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
[NamesT (ExceptT NoLeftInv (TCMT IO)) Term]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Abs [Arg Term] -> Term -> [Arg Term]
Abs [Arg Term] -> SubstArg [Arg Term] -> [Arg Term]
forall a. Subst a => Abs a -> SubstArg a -> a
lazyAbsApp (Abs [Arg Term] -> Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
xi0f NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i)
apply <$> applyN krest (take 1 (csingl' i) ++ args) <*> (drop 1 `fmap` csingl i)
delta1 <- open delta1
xi1f <- bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i -> do
m <- Bool
-> Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term]
forall (m :: * -> *).
(PureTCM m, MonadError TCErr m) =>
Bool
-> Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) m [Arg Term]
trFillTel' Bool
flag (Abs Telescope
-> Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs Telescope)
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs Telescope)
delta1 NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term
-> [Arg Term]
-> Term
-> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
([Arg Term]
-> Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
phi NamesT
(ExceptT NoLeftInv (TCMT IO))
([Arg Term]
-> Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
xi1 NamesT
(ExceptT NoLeftInv (TCMT IO))
(Term -> ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT
(ExceptT NoLeftInv (TCMT IO))
(ExceptT (Closure (Abs Type)) (TCMT IO) [Arg Term])
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i
lift (cantTransport m)
xi1f <- open xi1f
fmap absBody $ bind "i" $ \ forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i' -> do
let +++ :: m [a] -> m [a] -> m [a]
(+++) m [a]
m = ([a] -> [a] -> [a]) -> m [a] -> m [a] -> m [a]
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++) m [a]
m
i :: NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i = ExceptT NoLeftInv (TCMT IO) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl (TCMT IO Term -> ExceptT NoLeftInv (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> ExceptT NoLeftInv m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift TCMT IO Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primINeg) NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
forall b.
(Subst b, DeBruijn b) =>
NamesT (ExceptT NoLeftInv (TCMT IO)) b
i'
do
NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
gamma1_args NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall {m :: * -> *} {a}. Monad m => m [a] -> m [a] -> m [a]
+++ (Int -> [Arg Term] -> [Arg Term]
forall a. Int -> [a] -> [a]
take Int
1 ([Arg Term] -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
(a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
csingl NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall {m :: * -> *} {a}. Monad m => m [a] -> m [a] -> m [a]
+++ ((Abs [Arg Term] -> Term -> [Arg Term]
Abs [Arg Term] -> SubstArg [Arg Term] -> [Arg Term]
forall a. Subst a => Abs a -> SubstArg a -> a
lazyAbsApp (Abs [Arg Term] -> Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
xi0f NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i) NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall {m :: * -> *} {a}. Monad m => m [a] -> m [a] -> m [a]
+++ (Int -> [Arg Term] -> [Arg Term]
forall a. Int -> [a] -> [a]
drop Int
1 ([Arg Term] -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
(a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
csingl NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall {m :: * -> *} {a}. Monad m => m [a] -> m [a] -> m [a]
+++ (Abs [Arg Term] -> Term -> [Arg Term]
Abs [Arg Term] -> SubstArg [Arg Term] -> [Arg Term]
forall a. Subst a => Abs a -> SubstArg a -> a
lazyAbsApp (Abs [Arg Term] -> Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NamesT (ExceptT NoLeftInv (TCMT IO)) (Abs [Arg Term])
xi1f NamesT (ExceptT NoLeftInv (TCMT IO)) (Term -> [Arg Term])
-> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
-> NamesT (ExceptT NoLeftInv (TCMT IO)) [Arg Term]
forall a b.
NamesT (ExceptT NoLeftInv (TCMT IO)) (a -> b)
-> NamesT (ExceptT NoLeftInv (TCMT IO)) a
-> NamesT (ExceptT NoLeftInv (TCMT IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> NamesT (ExceptT NoLeftInv (TCMT IO)) Term
i))))
return (tau,leftInv,phi)
iz <- lift $ primIZero
io <- lift $ primIOne
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "tau :" <+> prettyTCM (map (setHiding NotHidden) tau)
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "tauS :" <+> prettyTCM (termsS __IMPOSSIBLE__ $ map unArg tau)
addContext working_tel $ addContext ("r" :: String, defaultDom interval)
$ reportSDoc "tc.lhs.unify.inv" 20 $ "leftInv: " <+> prettyTCM (map (setHiding NotHidden) leftInv)
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "leftInv[0]:" <+> (prettyTCM =<< reduce (subst 0 iz $ map (setHiding NotHidden) leftInv))
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "leftInv[1]:" <+> (prettyTCM =<< reduce (subst 0 io $ map (setHiding NotHidden) leftInv))
addContext working_tel $ reportSDoc "tc.lhs.unify.inv" 20 $ "[rho]tau :" <+>
prettyTCM (applySubst (termsS __IMPOSSIBLE__ $ map unArg tau) $ fromPatternSubstitution
$ raise (size (eqTel st) - 1 + phis )
$ unifySubst output)
reportSDoc "tc.lhs.unify.inv" 20 $ "."
let rho0 = PatternSubstitution -> Substitution
fromPatternSubstitution (PatternSubstitution -> Substitution)
-> PatternSubstitution -> Substitution
forall a b. (a -> b) -> a -> b
$ UnifyOutput -> PatternSubstitution
unifySubst UnifyOutput
output
addContext (varTel next) $ addContext (eqTel next) $ reportSDoc "tc.lhs.unify.inv" 20 $
"prf :" <+> prettyTCM (fromPatternSubstitution $ unifyProof output)
let c0 = ArgInfo -> Abs Term -> Term
Lam ArgInfo
defaultArgInfo (Abs Term -> Term) -> Abs Term -> Term
forall a b. (a -> b) -> a -> b
$ String -> Term -> Abs Term
forall a. String -> a -> Abs a
Abs String
"i" (Term -> Abs Term) -> Term -> Abs Term
forall a b. (a -> b) -> a -> b
$ Int -> Term -> Term
forall a. Subst a => Int -> a -> a
raise Int
1 (Term -> Term) -> Term -> Term
forall a b. (a -> b) -> a -> b
$ Substitution -> Int -> Term
forall a. EndoSubst a => Substitution' a -> Int -> a
lookupS (PatternSubstitution -> Substitution
fromPatternSubstitution (PatternSubstitution -> Substitution)
-> PatternSubstitution -> Substitution
forall a b. (a -> b) -> a -> b
$ UnifyOutput -> PatternSubstitution
unifyProof UnifyOutput
output) (Int
neqs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
let c = Int -> Substitution -> Substitution
forall a. Int -> Substitution' a -> Substitution' a
liftS (Telescope -> Int
forall a. Sized a => a -> Int
size (Telescope -> Int) -> Telescope -> Int
forall a b. (a -> b) -> a -> b
$ UnifyState -> Telescope
eqTel UnifyState
next) (Int -> Substitution
forall a. Int -> Substitution' a
raiseS Int
1) Substitution' (SubstArg Term) -> Term -> Term
forall a. Subst a => Substitution' (SubstArg a) -> a -> a
`applySubst` Term
c0
addContext (varTel next) $ addContext ("φ" :: String, __DUMMY_DOM__) $ addContext (raise 1 $ eqTel next) $
reportSDoc "tc.lhs.unify.inv" 20 $ "c :" <+> prettyTCM c
let rho = Int -> Term -> Substitution
forall a. DeBruijn a => Int -> a -> Substitution' a
singletonS (Int
neqs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Term
c Substitution -> Substitution -> Substitution
forall a.
EndoSubst a =>
Substitution' a -> Substitution' a -> Substitution' a
`composeS` Int -> Substitution -> Substitution
forall a. Int -> Substitution' a -> Substitution' a
liftS (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
neqs) Substitution
rho0
reportSDoc "tc.lhs.unify.inv" 20 $ text "old_sizes: " <+> pretty (size $ varTel st, size $ eqTel st)
reportSDoc "tc.lhs.unify.inv" 20 $ text "new_sizes: " <+> pretty (size $ varTel next, size $ eqTel next)
addContext (varTel next) $ addContext ("φ" :: String, __DUMMY_DOM__) $ addContext (raise 1 $ eqTel next) $
reportSDoc "tc.lhs.unify.inv" 20 $ "rho :" <+> prettyTCM rho
return $ ((working_tel
, rho
, termsS __IMPOSSIBLE__ $ map unArg tau
, termsS __IMPOSSIBLE__ $ map unArg leftInv)
, phi)
buildEquiv (DUnificationStep UnifyState
st step :: DigestedUnifyStep
step@(DEtaExpandVar FlexibleVar Int
fv QName
_d [Arg Term]
_args) UnifyOutput
output) UnifyState
next = ((Retract, Term) -> Either NoLeftInv (Retract, Term))
-> TCMT IO (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term))
forall a b. (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Retract, Term) -> Either NoLeftInv (Retract, Term)
forall a b. b -> Either a b
Right (TCMT IO (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term)))
-> TCMT IO (Retract, Term)
-> TCMT IO (Either NoLeftInv (Retract, Term))
forall a b. (a -> b) -> a -> b
$ do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 TCM Doc
"buildEquiv EtaExpandVar"
let
gamma :: Telescope
gamma = UnifyState -> Telescope
varTel UnifyState
st
eqs :: Telescope
eqs = UnifyState -> Telescope
eqTel UnifyState
st
x :: Int
x = FlexibleVar Int -> Int
forall a. FlexibleVar a -> a
flexVar FlexibleVar Int
fv
neqs :: Int
neqs = Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
eqs
phis :: Int
phis = Int
1
interval <- TCMT IO Type
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Type
primIntervalType
let gamma_phis = Telescope -> Telescope -> Telescope
forall t. Abstract t => Telescope -> t -> t
abstract Telescope
gamma (Telescope -> Telescope) -> Telescope -> Telescope
forall a b. (a -> b) -> a -> b
$ ListTel -> Telescope
telFromList (ListTel -> Telescope) -> ListTel -> Telescope
forall a b. (a -> b) -> a -> b
$
(Int -> Dom (String, Type)) -> [Int] -> ListTel
forall a b. (a -> b) -> [a] -> [b]
map ((String, Type) -> Dom (String, Type)
forall a. a -> Dom a
defaultDom ((String, Type) -> Dom (String, Type))
-> (Int -> (String, Type)) -> Int -> Dom (String, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,Type
interval) (String -> (String, Type))
-> (Int -> String) -> Int -> (String, Type)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"phi" String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> (Int -> String) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show) [Int
0 .. Int
phis Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
working_tel <- abstract gamma_phis <$>
pathTelescope (raise phis $ eqTel st) (raise phis $ eqLHS st) (raise phis $ eqRHS st)
let raiseFrom Telescope
tel Int
x = (Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
working_tel Int -> Int -> Int
forall a. Num a => a -> a -> a
- Telescope -> Int
forall a. Sized a => a -> Int
size Telescope
tel) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x
let phi = Int -> Term
var (Int -> Term) -> Int -> Term
forall a b. (a -> b) -> a -> b
$ Telescope -> Int -> Int
raiseFrom Telescope
gamma_phis Int
0
caseMaybeM (expandRecordVar (raiseFrom gamma x) working_tel) __IMPOSSIBLE__ $ \ (Telescope
_,Substitution
tau,Substitution
rho,Telescope
_) -> do
String -> Int -> TCM Doc -> TCMT IO ()
forall (m :: * -> *).
MonadDebug m =>
String -> Int -> TCM Doc -> m ()
reportSDoc String
"tc.lhs.unify.inv" Int
20 (TCM Doc -> TCMT IO ()) -> TCM Doc -> TCMT IO ()
forall a b. (a -> b) -> a -> b
$ Telescope -> TCM Doc -> TCM 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
working_tel (TCM Doc -> TCM Doc) -> TCM Doc -> TCM Doc
forall a b. (a -> b) -> a -> b
$ TCM Doc
"tau :" TCM Doc -> TCM Doc -> TCM Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> Substitution -> TCM Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => Substitution -> m Doc
prettyTCM Substitution
tau
(Retract, Term) -> TCMT IO (Retract, Term)
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Retract, Term) -> TCMT IO (Retract, Term))
-> (Retract, Term) -> TCMT IO (Retract, Term)
forall a b. (a -> b) -> a -> b
$ ((Telescope
working_tel,Substitution
rho,Substitution
tau,Int -> Substitution
forall a. Int -> Substitution' a
raiseS Int
1),Term
phi)
{-# SPECIALIZE explainStep :: UnifyStep -> TCM Doc #-}
explainStep :: MonadPretty m => UnifyStep -> m Doc
explainStep :: forall (m :: * -> *). MonadPretty m => UnifyStep -> m Doc
explainStep Injectivity{injectConstructor :: UnifyStep -> ConHead
injectConstructor = ConHead
ch} =
m Doc
"injectivity of the data constructor" m Doc -> m Doc -> m Doc
forall (m :: * -> *). Applicative m => m Doc -> m Doc -> m Doc
<+> QName -> m Doc
forall a (m :: * -> *). (PrettyTCM a, MonadPretty m) => a -> m Doc
forall (m :: * -> *). MonadPretty m => QName -> m Doc
prettyTCM (ConHead -> QName
conName ConHead
ch)
explainStep TypeConInjectivity{} = m Doc
"injectivity of type constructors"
explainStep Deletion{} = m Doc
"the K rule"
explainStep Solution{} = m Doc
"substitution in Setω"
explainStep Conflict{} = m Doc
"the disjointness of data constructors"
explainStep LitConflict{} = m Doc
"the disjointness of literal values"
explainStep Cycle{} = m Doc
"the impossibility of cyclic values"
explainStep EtaExpandVar{} = m Doc
"eta-expansion of variables"
explainStep EtaExpandEquation{} = m Doc
"eta-expansion of equations"
explainStep StripSizeSuc{} = m Doc
"the injectivity of size successors"
explainStep SkipIrrelevantEquation{} = m Doc
"ignoring irrelevant equations"