{-# OPTIONS_GHC -fno-warn-orphans #-}
module Agda.Auto.SearchControl where
import Control.Monad
import Data.IORef
import Control.Monad.State
import Data.Maybe (mapMaybe, fromMaybe)
import Agda.Syntax.Common (Hiding(..))
import Agda.Auto.NarrowingSearch
import Agda.Auto.Syntax
import Agda.Utils.Impossible
instance Refinable (ArgList o) (RefInfo o) where
refinements :: RefInfo o
-> [RefInfo o]
-> Metavar (ArgList o) (RefInfo o)
-> IO [Move' (RefInfo o) (ArgList o)]
refinements RefInfo o
_ [RefInfo o]
infos Metavar (ArgList o) (RefInfo o)
_ = [Move' (RefInfo o) (ArgList o)]
-> IO [Move' (RefInfo o) (ArgList o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (ArgList o)]
-> IO [Move' (RefInfo o) (ArgList o)])
-> [Move' (RefInfo o) (ArgList o)]
-> IO [Move' (RefInfo o) (ArgList o)]
forall a b. (a -> b) -> a -> b
$ (RefCreateEnv (RefInfo o) (ArgList o)
-> Move' (RefInfo o) (ArgList o))
-> [RefCreateEnv (RefInfo o) (ArgList o)]
-> [Move' (RefInfo o) (ArgList o)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Cost
-> RefCreateEnv (RefInfo o) (ArgList o)
-> Move' (RefInfo o) (ArgList o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
0) ([RefCreateEnv (RefInfo o) (ArgList o)]
-> [Move' (RefInfo o) (ArgList o)])
-> [RefCreateEnv (RefInfo o) (ArgList o)]
-> [Move' (RefInfo o) (ArgList o)]
forall a b. (a -> b) -> a -> b
$
[ ArgList o -> RefCreateEnv (RefInfo o) (ArgList o)
forall (m :: * -> *) a. Monad m => a -> m a
return ArgList o
forall o. ArgList o
ALNil, Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
cons Hiding
NotHidden, Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
cons Hiding
Hidden ]
[RefCreateEnv (RefInfo o) (ArgList o)]
-> [RefCreateEnv (RefInfo o) (ArgList o)]
-> [RefCreateEnv (RefInfo o) (ArgList o)]
forall a. [a] -> [a] -> [a]
++ if [RefInfo o] -> Bool
getIsDep [RefInfo o]
infos then []
else [ Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
proj Hiding
NotHidden, Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
proj Hiding
Hidden ]
where
getIsDep :: [RefInfo o] -> Bool
getIsDep :: [RefInfo o] -> Bool
getIsDep (RefInfo o
x : [RefInfo o]
xs) = case RefInfo o
x of
RICheckElim Bool
isDep -> Bool
isDep
RefInfo o
_ -> [RefInfo o] -> Bool
getIsDep [RefInfo o]
xs
getIsDep [RefInfo o]
_ = Bool
forall a. HasCallStack => a
__IMPOSSIBLE__
proj :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
proj :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
proj Hiding
hid = MArgList o
-> MM (ConstRef o) (RefInfo o) -> Hiding -> MArgList o -> ArgList o
forall o.
MArgList o
-> MM (ConstRef o) (RefInfo o) -> Hiding -> MArgList o -> ArgList o
ALProj (MArgList o
-> MM (ConstRef o) (RefInfo o)
-> Hiding
-> MArgList o
-> ArgList o)
-> RefCreateEnv (RefInfo o) (MArgList o)
-> RefCreateEnv
(RefInfo o)
(MM (ConstRef o) (RefInfo o) -> Hiding -> MArgList o -> ArgList o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv (RefInfo o) (MArgList o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder RefCreateEnv
(RefInfo o)
(MM (ConstRef o) (RefInfo o) -> Hiding -> MArgList o -> ArgList o)
-> RefCreateEnv (RefInfo o) (MM (ConstRef o) (RefInfo o))
-> RefCreateEnv (RefInfo o) (Hiding -> MArgList o -> ArgList o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RefCreateEnv (RefInfo o) (MM (ConstRef o) (RefInfo o))
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
RefCreateEnv (RefInfo o) (Hiding -> MArgList o -> ArgList o)
-> RefCreateEnv (RefInfo o) Hiding
-> RefCreateEnv (RefInfo o) (MArgList o -> ArgList o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Hiding -> RefCreateEnv (RefInfo o) Hiding
forall (m :: * -> *) a. Monad m => a -> m a
return Hiding
hid RefCreateEnv (RefInfo o) (MArgList o -> ArgList o)
-> RefCreateEnv (RefInfo o) (MArgList o)
-> RefCreateEnv (RefInfo o) (ArgList o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RefCreateEnv (RefInfo o) (MArgList o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
cons :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
cons :: Hiding -> RefCreateEnv (RefInfo o) (ArgList o)
cons Hiding
hid = Hiding -> MExp o -> MArgList o -> ArgList o
forall o. Hiding -> MExp o -> MArgList o -> ArgList o
ALCons Hiding
hid (MExp o -> MArgList o -> ArgList o)
-> RefCreateEnv (RefInfo o) (MExp o)
-> RefCreateEnv (RefInfo o) (MArgList o -> ArgList o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv (RefInfo o) (MExp o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder RefCreateEnv (RefInfo o) (MArgList o -> ArgList o)
-> RefCreateEnv (RefInfo o) (MArgList o)
-> RefCreateEnv (RefInfo o) (ArgList o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RefCreateEnv (RefInfo o) (MArgList o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
data ExpRefInfo o = ExpRefInfo
{ ExpRefInfo o -> Maybe (RefInfo o)
eriMain :: Maybe (RefInfo o)
, ExpRefInfo o -> [RefInfo o]
eriUnifs :: [RefInfo o]
, ExpRefInfo o -> Bool
eriInfTypeUnknown :: Bool
, ExpRefInfo o -> Bool
eriIsEliminand :: Bool
, ExpRefInfo o -> Maybe ([UId o], [Elr o])
eriUsedVars :: Maybe ([UId o], [Elr o])
, ExpRefInfo o -> Maybe Bool
eriIotaStep :: Maybe Bool
, ExpRefInfo o -> Bool
eriPickSubsVar :: Bool
, ExpRefInfo o -> Maybe EqReasoningState
eriEqRState :: Maybe EqReasoningState
}
initExpRefInfo :: ExpRefInfo o
initExpRefInfo :: ExpRefInfo o
initExpRefInfo = ExpRefInfo :: forall o.
Maybe (RefInfo o)
-> [RefInfo o]
-> Bool
-> Bool
-> Maybe ([UId o], [Elr o])
-> Maybe Bool
-> Bool
-> Maybe EqReasoningState
-> ExpRefInfo o
ExpRefInfo
{ eriMain :: Maybe (RefInfo o)
eriMain = Maybe (RefInfo o)
forall a. Maybe a
Nothing
, eriUnifs :: [RefInfo o]
eriUnifs = []
, eriInfTypeUnknown :: Bool
eriInfTypeUnknown = Bool
False
, eriIsEliminand :: Bool
eriIsEliminand = Bool
False
, eriUsedVars :: Maybe ([UId o], [Elr o])
eriUsedVars = Maybe ([UId o], [Elr o])
forall a. Maybe a
Nothing
, eriIotaStep :: Maybe Bool
eriIotaStep = Maybe Bool
forall a. Maybe a
Nothing
, eriPickSubsVar :: Bool
eriPickSubsVar = Bool
False
, eriEqRState :: Maybe EqReasoningState
eriEqRState = Maybe EqReasoningState
forall a. Maybe a
Nothing
}
getinfo :: [RefInfo o] -> ExpRefInfo o
getinfo :: [RefInfo o] -> ExpRefInfo o
getinfo = (ExpRefInfo o -> RefInfo o -> ExpRefInfo o)
-> ExpRefInfo o -> [RefInfo o] -> ExpRefInfo o
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl ExpRefInfo o -> RefInfo o -> ExpRefInfo o
forall o. ExpRefInfo o -> RefInfo o -> ExpRefInfo o
step ExpRefInfo o
forall o. ExpRefInfo o
initExpRefInfo where
step :: ExpRefInfo o -> RefInfo o -> ExpRefInfo o
step :: ExpRefInfo o -> RefInfo o -> ExpRefInfo o
step ExpRefInfo o
eri x :: RefInfo o
x@RIMainInfo{} = ExpRefInfo o
eri { eriMain :: Maybe (RefInfo o)
eriMain = RefInfo o -> Maybe (RefInfo o)
forall a. a -> Maybe a
Just RefInfo o
x }
step ExpRefInfo o
eri x :: RefInfo o
x@RIUnifInfo{} = ExpRefInfo o
eri { eriUnifs :: [RefInfo o]
eriUnifs = RefInfo o
x RefInfo o -> [RefInfo o] -> [RefInfo o]
forall a. a -> [a] -> [a]
: ExpRefInfo o -> [RefInfo o]
forall o. ExpRefInfo o -> [RefInfo o]
eriUnifs ExpRefInfo o
eri }
step ExpRefInfo o
eri RefInfo o
RIInferredTypeUnknown = ExpRefInfo o
eri { eriInfTypeUnknown :: Bool
eriInfTypeUnknown = Bool
True }
step ExpRefInfo o
eri RefInfo o
RINotConstructor = ExpRefInfo o
eri { eriIsEliminand :: Bool
eriIsEliminand = Bool
True }
step ExpRefInfo o
eri (RIUsedVars [UId o]
nuids [Elr o]
nused) = ExpRefInfo o
eri { eriUsedVars :: Maybe ([UId o], [Elr o])
eriUsedVars = ([UId o], [Elr o]) -> Maybe ([UId o], [Elr o])
forall a. a -> Maybe a
Just ([UId o]
nuids, [Elr o]
nused) }
step ExpRefInfo o
eri (RIIotaStep Bool
semif) = ExpRefInfo o
eri { eriIotaStep :: Maybe Bool
eriIotaStep = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
iota' } where
iota' :: Bool
iota' = Bool
semif Bool -> Bool -> Bool
|| (Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True Maybe Bool -> Maybe Bool -> Bool
forall a. Eq a => a -> a -> Bool
==) (ExpRefInfo o -> Maybe Bool
forall o. ExpRefInfo o -> Maybe Bool
eriIotaStep ExpRefInfo o
eri)
step ExpRefInfo o
eri RefInfo o
RIPickSubsvar = ExpRefInfo o
eri { eriPickSubsVar :: Bool
eriPickSubsVar = Bool
True }
step ExpRefInfo o
eri (RIEqRState EqReasoningState
s) = ExpRefInfo o
eri { eriEqRState :: Maybe EqReasoningState
eriEqRState = EqReasoningState -> Maybe EqReasoningState
forall a. a -> Maybe a
Just EqReasoningState
s }
step ExpRefInfo o
eri RefInfo o
_ = ExpRefInfo o
forall a. HasCallStack => a
__IMPOSSIBLE__
univar :: [CAction o] -> Nat -> Maybe Nat
univar :: [CAction o] -> Nat -> Maybe Nat
univar [CAction o]
cl Nat
v = [CAction o] -> Nat -> Nat -> Maybe Nat
forall o. [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName [CAction o]
cl Nat
v Nat
0 where
getOutsideName :: [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName :: [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName [] Nat
v Nat
v' = Nat -> Maybe Nat
forall a. a -> Maybe a
Just (Nat
v' Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
+ Nat
v)
getOutsideName (Weak Nat
n : [CAction o]
_) Nat
v Nat
v' | Nat
v Nat -> Nat -> Bool
forall a. Ord a => a -> a -> Bool
< Nat
n = Maybe Nat
forall a. Maybe a
Nothing
getOutsideName (Weak Nat
n : [CAction o]
xs) Nat
v Nat
v' = [CAction o] -> Nat -> Nat -> Maybe Nat
forall o. [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName [CAction o]
xs (Nat
v Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
n) Nat
v'
getOutsideName (Sub ICExp o
_ : [CAction o]
xs) Nat
v Nat
v' = [CAction o] -> Nat -> Nat -> Maybe Nat
forall o. [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName [CAction o]
xs Nat
v (Nat
v' Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
+ Nat
1)
getOutsideName (CAction o
Skip : [CAction o]
_) Nat
0 Nat
v' = Nat -> Maybe Nat
forall a. a -> Maybe a
Just Nat
v'
getOutsideName (CAction o
Skip : [CAction o]
xs) Nat
v Nat
v' = [CAction o] -> Nat -> Nat -> Maybe Nat
forall o. [CAction o] -> Nat -> Nat -> Maybe Nat
getOutsideName [CAction o]
xs (Nat
v Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1) (Nat
v' Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
+ Nat
1)
subsvars :: [CAction o] -> [Nat]
subsvars :: [CAction o] -> [Nat]
subsvars = Nat -> [CAction o] -> [Nat]
forall o. Nat -> [CAction o] -> [Nat]
f Nat
0 where
f :: Nat -> [CAction o] -> [Nat]
f :: Nat -> [CAction o] -> [Nat]
f Nat
n [] = []
f Nat
n (Weak Nat
_ : [CAction o]
xs) = Nat -> [CAction o] -> [Nat]
forall o. Nat -> [CAction o] -> [Nat]
f Nat
n [CAction o]
xs
f Nat
n (Sub ICExp o
_ : [CAction o]
xs) = Nat
n Nat -> [Nat] -> [Nat]
forall a. a -> [a] -> [a]
: Nat -> [CAction o] -> [Nat]
forall o. Nat -> [CAction o] -> [Nat]
f (Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
+ Nat
1) [CAction o]
xs
f Nat
n (CAction o
Skip : [CAction o]
xs) = Nat -> [CAction o] -> [Nat]
forall o. Nat -> [CAction o] -> [Nat]
f (Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
+ Nat
1) [CAction o]
xs
type Move o = Move' (RefInfo o) (Exp o)
newAbs :: MId -> RefCreateEnv blk (Abs (MM a blk))
newAbs :: MId -> RefCreateEnv blk (Abs (MM a blk))
newAbs MId
mid = MId -> MM a blk -> Abs (MM a blk)
forall a. MId -> a -> Abs a
Abs MId
mid (MM a blk -> Abs (MM a blk))
-> RefCreateEnv blk (MM a blk) -> RefCreateEnv blk (Abs (MM a blk))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv blk (MM a blk)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
newLam :: Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
newLam :: Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
newLam Hiding
hid MId
mid = Hiding -> Abs (MExp o) -> Exp o
forall o. Hiding -> Abs (MExp o) -> Exp o
Lam Hiding
hid (Abs (MExp o) -> Exp o)
-> RefCreateEnv (RefInfo o) (Abs (MExp o))
-> RefCreateEnv (RefInfo o) (Exp o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MId -> RefCreateEnv (RefInfo o) (Abs (MExp o))
forall blk a. MId -> RefCreateEnv blk (Abs (MM a blk))
newAbs MId
mid
newPi :: UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
newPi :: UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
newPi UId o
uid Bool
dep Hiding
hid = Maybe (UId o) -> Hiding -> Bool -> MExp o -> Abs (MExp o) -> Exp o
forall o.
Maybe (UId o) -> Hiding -> Bool -> MExp o -> Abs (MExp o) -> Exp o
Pi (UId o -> Maybe (UId o)
forall a. a -> Maybe a
Just UId o
uid) Hiding
hid Bool
dep (MExp o -> Abs (MExp o) -> Exp o)
-> RefCreateEnv (RefInfo o) (MExp o)
-> RefCreateEnv (RefInfo o) (Abs (MExp o) -> Exp o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv (RefInfo o) (MExp o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder RefCreateEnv (RefInfo o) (Abs (MExp o) -> Exp o)
-> RefCreateEnv (RefInfo o) (Abs (MExp o))
-> RefCreateEnv (RefInfo o) (Exp o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> MId -> RefCreateEnv (RefInfo o) (Abs (MExp o))
forall blk a. MId -> RefCreateEnv blk (Abs (MM a blk))
newAbs MId
NoId
foldArgs :: [(Hiding, MExp o)] -> MArgList o
foldArgs :: [(Hiding, MExp o)] -> MArgList o
foldArgs = ((Hiding, MExp o) -> MArgList o -> MArgList o)
-> MArgList o -> [(Hiding, MExp o)] -> MArgList o
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\ (Hiding
h, MExp o
a) MArgList o
sp -> ArgList o -> MArgList o
forall a blk. a -> MM a blk
NotM (ArgList o -> MArgList o) -> ArgList o -> MArgList o
forall a b. (a -> b) -> a -> b
$ Hiding -> MExp o -> MArgList o -> ArgList o
forall o. Hiding -> MExp o -> MArgList o -> ArgList o
ALCons Hiding
h MExp o
a MArgList o
sp) (ArgList o -> MArgList o
forall a blk. a -> MM a blk
NotM ArgList o
forall o. ArgList o
ALNil)
newArgs' :: [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs' :: [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs' [Hiding]
h [MExp o]
tms = [(Hiding, MExp o)] -> MArgList o
forall o. [(Hiding, MExp o)] -> MArgList o
foldArgs ([(Hiding, MExp o)] -> MArgList o)
-> ([MExp o] -> [(Hiding, MExp o)]) -> [MExp o] -> MArgList o
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Hiding] -> [MExp o] -> [(Hiding, MExp o)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Hiding]
h ([MExp o] -> [(Hiding, MExp o)])
-> ([MExp o] -> [MExp o]) -> [MExp o] -> [(Hiding, MExp o)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([MExp o] -> [MExp o] -> [MExp o]
forall a. [a] -> [a] -> [a]
++ [MExp o]
tms) ([MExp o] -> MArgList o)
-> RefCreateEnv (RefInfo o) [MExp o]
-> RefCreateEnv (RefInfo o) (MArgList o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Nat
-> RefCreateEnv (RefInfo o) (MExp o)
-> RefCreateEnv (RefInfo o) [MExp o]
forall (m :: * -> *) a. Applicative m => Nat -> m a -> m [a]
replicateM Nat
size RefCreateEnv (RefInfo o) (MExp o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
where size :: Nat
size = [Hiding] -> Nat
forall (t :: * -> *) a. Foldable t => t a -> Nat
length [Hiding]
h Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- [MExp o] -> Nat
forall (t :: * -> *) a. Foldable t => t a -> Nat
length [MExp o]
tms
newArgs :: [Hiding] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs :: [Hiding] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs [Hiding]
h = [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
forall o.
[Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs' [Hiding]
h []
newApp' :: UId o -> ConstRef o -> [Hiding] -> [MExp o] ->
RefCreateEnv (RefInfo o) (Exp o)
newApp' :: UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
newApp' UId o
meta ConstRef o
cst [Hiding]
hds [MExp o]
tms =
Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
forall o.
Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
App (UId o -> Maybe (UId o)
forall a. a -> Maybe a
Just UId o
meta) (OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (OKHandle (RefInfo o))
-> RefCreateEnv (RefInfo o) (Elr o -> MArgList o -> Exp o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv (RefInfo o) (OKHandle (RefInfo o))
forall blk. RefCreateEnv blk (OKHandle blk)
newOKHandle RefCreateEnv (RefInfo o) (Elr o -> MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (Elr o)
-> RefCreateEnv (RefInfo o) (MArgList o -> Exp o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Elr o -> RefCreateEnv (RefInfo o) (Elr o)
forall (m :: * -> *) a. Monad m => a -> m a
return (ConstRef o -> Elr o
forall o. ConstRef o -> Elr o
Const ConstRef o
cst) RefCreateEnv (RefInfo o) (MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (MArgList o)
-> RefCreateEnv (RefInfo o) (Exp o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
forall o.
[Hiding] -> [MExp o] -> RefCreateEnv (RefInfo o) (MArgList o)
newArgs' [Hiding]
hds [MExp o]
tms
newApp :: UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp :: UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta ConstRef o
cst [Hiding]
hds = UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
newApp' UId o
meta ConstRef o
cst [Hiding]
hds []
eqStep :: UId o -> EqReasoningConsts o -> Move o
eqStep :: UId o -> EqReasoningConsts o -> Move o
eqStep UId o
meta EqReasoningConsts o
eqrc = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costEqStep (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcStep EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
NotHidden]
eqEnd :: UId o -> EqReasoningConsts o -> Move o
eqEnd :: UId o -> EqReasoningConsts o -> Move o
eqEnd UId o
meta EqReasoningConsts o
eqrc = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costEqEnd (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcEnd EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden]
eqCong :: UId o -> EqReasoningConsts o -> Move o
eqCong :: UId o -> EqReasoningConsts o -> Move o
eqCong UId o
meta EqReasoningConsts o
eqrc = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costEqCong (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcCong EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden]
eqSym :: UId o -> EqReasoningConsts o -> Move o
eqSym :: UId o -> EqReasoningConsts o -> Move o
eqSym UId o
meta EqReasoningConsts o
eqrc = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costEqSym (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcSym EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden]
eqBeginStep2 :: UId o -> EqReasoningConsts o -> Move o
eqBeginStep2 :: UId o -> EqReasoningConsts o -> Move o
eqBeginStep2 UId o
meta EqReasoningConsts o
eqrc = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costEqStep (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ do
Exp o
e1 <- UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> ConstRef o -> [Hiding] -> RefCreateEnv (RefInfo o) (Exp o)
newApp UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcStep EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
NotHidden]
Exp o
e2 <- UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
newApp' UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcStep EqReasoningConsts o
eqrc)
[Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden, Hiding
NotHidden]
[Exp o -> MExp o
forall a blk. a -> MM a blk
NotM Exp o
e1]
UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o
-> ConstRef o
-> [Hiding]
-> [MExp o]
-> RefCreateEnv (RefInfo o) (Exp o)
newApp' UId o
meta (EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcBegin EqReasoningConsts o
eqrc) [Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
Hidden, Hiding
NotHidden]
[Exp o -> MExp o
forall a blk. a -> MM a blk
NotM Exp o
e2]
pickUid :: forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
pickUid :: [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
pickUid [UId o]
used [Maybe (UId o)]
seen = (Maybe (UId o), Bool)
-> (Maybe (UId o) -> (Maybe (UId o), Bool))
-> Maybe (Maybe (UId o))
-> (Maybe (UId o), Bool)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Maybe (UId o)] -> Maybe (UId o)
forall a. [a] -> a
head [Maybe (UId o)]
seen, Bool
False) (, Bool
True) (Maybe (Maybe (UId o)) -> (Maybe (UId o), Bool))
-> Maybe (Maybe (UId o)) -> (Maybe (UId o), Bool)
forall a b. (a -> b) -> a -> b
$ [Maybe (UId o)] -> Maybe (Maybe (UId o))
firstUnused [Maybe (UId o)]
seen where
firstUnused :: [Maybe (UId o)] -> Maybe (Maybe (UId o))
firstUnused :: [Maybe (UId o)] -> Maybe (Maybe (UId o))
firstUnused [] = Maybe (Maybe (UId o))
forall a. Maybe a
Nothing
firstUnused (Maybe (UId o)
Nothing : [Maybe (UId o)]
_) = Maybe (UId o) -> Maybe (Maybe (UId o))
forall a. a -> Maybe a
Just Maybe (UId o)
forall a. Maybe a
Nothing
firstUnused (mu :: Maybe (UId o)
mu@(Just UId o
u) : [Maybe (UId o)]
us) =
if UId o
u UId o -> [UId o] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [UId o]
used then [Maybe (UId o)] -> Maybe (Maybe (UId o))
firstUnused [Maybe (UId o)]
us else Maybe (UId o) -> Maybe (Maybe (UId o))
forall a. a -> Maybe a
Just Maybe (UId o)
mu
instance Refinable (Exp o) (RefInfo o) where
refinements :: RefInfo o
-> [RefInfo o]
-> Metavar (Exp o) (RefInfo o)
-> IO [Move' (RefInfo o) (Exp o)]
refinements RefInfo o
envinfo [RefInfo o]
infos Metavar (Exp o) (RefInfo o)
meta =
let
hints :: [(ConstRef o, HintMode)]
hints = RefInfo o -> [(ConstRef o, HintMode)]
forall o. RefInfo o -> [(ConstRef o, HintMode)]
rieHints RefInfo o
envinfo
deffreevars :: Nat
deffreevars = RefInfo o -> Nat
forall o. RefInfo o -> Nat
rieDefFreeVars RefInfo o
envinfo
meqr :: Maybe (EqReasoningConsts o)
meqr = RefInfo o -> Maybe (EqReasoningConsts o)
forall o. RefInfo o -> Maybe (EqReasoningConsts o)
rieEqReasoningConsts RefInfo o
envinfo
ExpRefInfo { eriMain :: forall o. ExpRefInfo o -> Maybe (RefInfo o)
eriMain = Just (RIMainInfo Nat
n HNExp o
tt Bool
iotastepdone)
, eriUnifs :: forall o. ExpRefInfo o -> [RefInfo o]
eriUnifs = [RefInfo o]
unis
, eriInfTypeUnknown :: forall o. ExpRefInfo o -> Bool
eriInfTypeUnknown = Bool
inftypeunknown
, eriIsEliminand :: forall o. ExpRefInfo o -> Bool
eriIsEliminand = Bool
iseliminand
, eriUsedVars :: forall o. ExpRefInfo o -> Maybe ([UId o], [Elr o])
eriUsedVars = Just ([Metavar (Exp o) (RefInfo o)]
uids, [Elr o]
usedvars)
, eriIotaStep :: forall o. ExpRefInfo o -> Maybe Bool
eriIotaStep = Maybe Bool
iotastep
, eriPickSubsVar :: forall o. ExpRefInfo o -> Bool
eriPickSubsVar = Bool
picksubsvar
, eriEqRState :: forall o. ExpRefInfo o -> Maybe EqReasoningState
eriEqRState = Maybe EqReasoningState
meqrstate
} = [RefInfo o] -> ExpRefInfo o
forall o. [RefInfo o] -> ExpRefInfo o
getinfo [RefInfo o]
infos
eqrstate :: EqReasoningState
eqrstate = EqReasoningState -> Maybe EqReasoningState -> EqReasoningState
forall a. a -> Maybe a -> a
fromMaybe EqReasoningState
EqRSNone Maybe EqReasoningState
meqrstate
set :: Nat -> m (Exp o)
set Nat
l = Exp o -> m (Exp o)
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp o -> m (Exp o)) -> Exp o -> m (Exp o)
forall a b. (a -> b) -> a -> b
$ Sort -> Exp o
forall o. Sort -> Exp o
Sort (Nat -> Sort
Set Nat
l)
in case [RefInfo o]
unis of
[] ->
let
eqr :: EqReasoningConsts o
eqr = EqReasoningConsts o
-> Maybe (EqReasoningConsts o) -> EqReasoningConsts o
forall a. a -> Maybe a -> a
fromMaybe EqReasoningConsts o
forall a. HasCallStack => a
__IMPOSSIBLE__ Maybe (EqReasoningConsts o)
meqr
eq_end :: Move' (RefInfo o) (Exp o)
eq_end = Metavar (Exp o) (RefInfo o)
-> EqReasoningConsts o -> Move' (RefInfo o) (Exp o)
forall o. UId o -> EqReasoningConsts o -> Move o
eqEnd Metavar (Exp o) (RefInfo o)
meta EqReasoningConsts o
eqr
eq_step :: Move' (RefInfo o) (Exp o)
eq_step = Metavar (Exp o) (RefInfo o)
-> EqReasoningConsts o -> Move' (RefInfo o) (Exp o)
forall o. UId o -> EqReasoningConsts o -> Move o
eqStep Metavar (Exp o) (RefInfo o)
meta EqReasoningConsts o
eqr
eq_cong :: Move' (RefInfo o) (Exp o)
eq_cong = Metavar (Exp o) (RefInfo o)
-> EqReasoningConsts o -> Move' (RefInfo o) (Exp o)
forall o. UId o -> EqReasoningConsts o -> Move o
eqCong Metavar (Exp o) (RefInfo o)
meta EqReasoningConsts o
eqr
eq_sym :: Move' (RefInfo o) (Exp o)
eq_sym = Metavar (Exp o) (RefInfo o)
-> EqReasoningConsts o -> Move' (RefInfo o) (Exp o)
forall o. UId o -> EqReasoningConsts o -> Move o
eqSym Metavar (Exp o) (RefInfo o)
meta EqReasoningConsts o
eqr
eq_begin_step2 :: Move' (RefInfo o) (Exp o)
eq_begin_step2 = Metavar (Exp o) (RefInfo o)
-> EqReasoningConsts o -> Move' (RefInfo o) (Exp o)
forall o. UId o -> EqReasoningConsts o -> Move o
eqBeginStep2 Metavar (Exp o) (RefInfo o)
meta EqReasoningConsts o
eqr
adjustCost :: Cost -> Cost
adjustCost Cost
i = if Bool
inftypeunknown then Cost
costInferredTypeUnkown else Cost
i
varcost :: Nat -> Cost
varcost Nat
v | Nat
v Nat -> Nat -> Bool
forall a. Ord a => a -> a -> Bool
< Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
deffreevars = Cost -> Cost
adjustCost (Cost -> Cost) -> Cost -> Cost
forall a b. (a -> b) -> a -> b
$
if Nat
v Nat -> [Nat] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ((Elr o -> Maybe Nat) -> [Elr o] -> [Nat]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Elr o -> Maybe Nat
forall o. Elr o -> Maybe Nat
getVar [Elr o]
usedvars)
then Cost
costAppVarUsed else Cost
costAppVar
varcost Nat
v | Bool
otherwise = Cost -> Cost
adjustCost Cost
costAppHint
varapps :: [Move' (RefInfo o) (Exp o)]
varapps = (Nat -> Move' (RefInfo o) (Exp o))
-> [Nat] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (\ Nat
v -> Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Nat -> Cost
varcost Nat
v) (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall a b. (a -> b) -> a -> b
$ Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
forall a. Maybe a
Nothing (Nat -> Elr o
forall o. Nat -> Elr o
Var Nat
v)) [Nat
0..Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1]
hintapps :: [Move' (RefInfo o) (Exp o)]
hintapps = ((ConstRef o, HintMode) -> Move' (RefInfo o) (Exp o))
-> [(ConstRef o, HintMode)] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (\(ConstRef o
c, HintMode
hm) -> Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (ConstRef o -> HintMode -> Cost
cost ConstRef o
c HintMode
hm) (Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
forall a. Maybe a
Nothing (ConstRef o -> Elr o
forall o. ConstRef o -> Elr o
Const ConstRef o
c))) [(ConstRef o, HintMode)]
hints
where
cost :: ConstRef o -> HintMode -> Cost
cost :: ConstRef o -> HintMode -> Cost
cost ConstRef o
c HintMode
hm = Cost -> Cost
adjustCost (Cost -> Cost) -> Cost -> Cost
forall a b. (a -> b) -> a -> b
$ case (Maybe Bool
iotastep , HintMode
hm) of
(Just Bool
_ , HintMode
_ ) -> Cost
costIotaStep
(Maybe Bool
Nothing , HintMode
HMNormal) ->
if ConstRef o
c ConstRef o -> [ConstRef o] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ((Elr o -> Maybe (ConstRef o)) -> [Elr o] -> [ConstRef o]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Elr o -> Maybe (ConstRef o)
forall o. Elr o -> Maybe (ConstRef o)
getConst [Elr o]
usedvars)
then Cost
costAppHintUsed else Cost
costAppHint
(Maybe Bool
Nothing , HintMode
HMRecCall) ->
if ConstRef o
c ConstRef o -> [ConstRef o] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ((Elr o -> Maybe (ConstRef o)) -> [Elr o] -> [ConstRef o]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Elr o -> Maybe (ConstRef o)
forall o. Elr o -> Maybe (ConstRef o)
getConst [Elr o]
usedvars)
then Cost
costAppRecCallUsed else Cost
costAppRecCall
generics :: [Move' (RefInfo o) (Exp o)]
generics = [Move' (RefInfo o) (Exp o)]
varapps [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
hintapps
in case HNExp o -> HNExp' o
forall a o. WithSeenUIds a o -> a
rawValue HNExp o
tt of
HNExp' o
_ | EqReasoningState
eqrstate EqReasoningState -> EqReasoningState -> Bool
forall a. Eq a => a -> a -> Bool
== EqReasoningState
EqRSChain ->
[Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return [Move' (RefInfo o) (Exp o)
eq_end, Move' (RefInfo o) (Exp o)
eq_step]
HNPi Hiding
hid Bool
_ ICExp o
_ (Abs MId
id ICExp o
_) -> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)])
-> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> a -> b
$
Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Cost -> Cost
adjustCost (if Bool
iotastepdone then Cost
costLamUnfold else Cost
costLam)) (Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
forall o. Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
newLam Hiding
hid MId
id)
Move' (RefInfo o) (Exp o)
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. a -> [a] -> [a]
: Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costAbsurdLam (Exp o -> RefCreateEnv (RefInfo o) (Exp o)
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp o -> RefCreateEnv (RefInfo o) (Exp o))
-> Exp o -> RefCreateEnv (RefInfo o) (Exp o)
forall a b. (a -> b) -> a -> b
$ Hiding -> Exp o
forall o. Hiding -> Exp o
AbsurdLambda Hiding
hid)
Move' (RefInfo o) (Exp o)
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. a -> [a] -> [a]
: [Move' (RefInfo o) (Exp o)]
generics
HNSort (Set Nat
l) -> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)])
-> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> a -> b
$
(Nat -> Move' (RefInfo o) (Exp o))
-> [Nat] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Cost -> Cost
adjustCost Cost
costSort) (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> (Nat -> RefCreateEnv (RefInfo o) (Exp o))
-> Nat
-> Move' (RefInfo o) (Exp o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Nat -> RefCreateEnv (RefInfo o) (Exp o)
forall (m :: * -> *) o. Monad m => Nat -> m (Exp o)
set) [Nat
0..Nat
l Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1]
[Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ (Hiding -> Move' (RefInfo o) (Exp o))
-> [Hiding] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Cost -> Cost
adjustCost Cost
costPi) (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> (Hiding -> RefCreateEnv (RefInfo o) (Exp o))
-> Hiding
-> Move' (RefInfo o) (Exp o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metavar (Exp o) (RefInfo o)
-> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
newPi Metavar (Exp o) (RefInfo o)
meta Bool
True) [Hiding
NotHidden, Hiding
Hidden]
[Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
generics
HNApp (Const ConstRef o
c) ICArgList o
_ -> do
ConstDef o
cd <- ConstRef o -> IO (ConstDef o)
forall a. IORef a -> IO a
readIORef ConstRef o
c
[Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)])
-> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> a -> b
$ case ConstDef o -> DeclCont o
forall o. ConstDef o -> DeclCont o
cdcont ConstDef o
cd of
Datatype [ConstRef o]
cons [ConstRef o]
_ | EqReasoningState
eqrstate EqReasoningState -> EqReasoningState -> Bool
forall a. Eq a => a -> a -> Bool
== EqReasoningState
EqRSNone ->
(ConstRef o -> Move' (RefInfo o) (Exp o))
-> [ConstRef o] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (\ConstRef o
c -> Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Cost -> Cost
adjustCost (Cost -> Cost) -> Cost -> Cost
forall a b. (a -> b) -> a -> b
$ case Maybe Bool
iotastep of
Just Bool
True -> Cost
costUnification
Maybe Bool
_ -> if [ConstRef o] -> Nat
forall (t :: * -> *) a. Foldable t => t a -> Nat
length [ConstRef o]
cons Nat -> Nat -> Bool
forall a. Ord a => a -> a -> Bool
<= Nat
1
then Cost
costAppConstructorSingle
else Cost
costAppConstructor)
(RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall a b. (a -> b) -> a -> b
$ Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
forall a. Maybe a
Nothing (ConstRef o -> Elr o
forall o. ConstRef o -> Elr o
Const ConstRef o
c)) [ConstRef o]
cons
[Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
generics
[Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ (Bool -> [()]
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool
-> (EqReasoningConsts o -> Bool)
-> Maybe (EqReasoningConsts o)
-> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False ((ConstRef o
c ConstRef o -> ConstRef o -> Bool
forall a. Eq a => a -> a -> Bool
==) (ConstRef o -> Bool)
-> (EqReasoningConsts o -> ConstRef o)
-> EqReasoningConsts o
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EqReasoningConsts o -> ConstRef o
forall o. EqReasoningConsts o -> ConstRef o
eqrcId) Maybe (EqReasoningConsts o)
meqr)
[()] -> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> [Move' (RefInfo o) (Exp o)
eq_sym, Move' (RefInfo o) (Exp o)
eq_cong, Move' (RefInfo o) (Exp o)
eq_begin_step2])
DeclCont o
_ | EqReasoningState
eqrstate EqReasoningState -> EqReasoningState -> Bool
forall a. Eq a => a -> a -> Bool
== EqReasoningState
EqRSPrf1 -> [Move' (RefInfo o) (Exp o)]
generics [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)
eq_sym, Move' (RefInfo o) (Exp o)
eq_cong]
DeclCont o
_ | EqReasoningState
eqrstate EqReasoningState -> EqReasoningState -> Bool
forall a. Eq a => a -> a -> Bool
== EqReasoningState
EqRSPrf2 -> [Move' (RefInfo o) (Exp o)]
generics [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)
eq_cong]
DeclCont o
_ -> [Move' (RefInfo o) (Exp o)]
generics
HNExp' o
_ -> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return [Move' (RefInfo o) (Exp o)]
generics
(RIUnifInfo [CAction o]
cl HNExp o
hne : [RefInfo o]
_) ->
let
subsvarapps :: [Move' (RefInfo o) (Exp o)]
subsvarapps = (Nat -> Move' (RefInfo o) (Exp o))
-> [Nat] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costUnification (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> (Nat -> RefCreateEnv (RefInfo o) (Exp o))
-> Nat
-> Move' (RefInfo o) (Exp o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
forall a. Maybe a
Nothing (Elr o -> RefCreateEnv (RefInfo o) (Exp o))
-> (Nat -> Elr o) -> Nat -> RefCreateEnv (RefInfo o) (Exp o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Nat -> Elr o
forall o. Nat -> Elr o
Var) ([CAction o] -> [Nat]
forall o. [CAction o] -> [Nat]
subsvars [CAction o]
cl)
mlam :: [Move' (RefInfo o) (Exp o)]
mlam = case HNExp o -> HNExp' o
forall a o. WithSeenUIds a o -> a
rawValue HNExp o
tt of
HNPi Hiding
hid Bool
_ ICExp o
_ (Abs MId
id ICExp o
_) -> [Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costUnification (Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
forall o. Hiding -> MId -> RefCreateEnv (RefInfo o) (Exp o)
newLam Hiding
hid MId
id)]
HNExp' o
_ -> []
generics :: [Move' (RefInfo o) (Exp o)]
generics = [Move' (RefInfo o) (Exp o)]
mlam [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
subsvarapps
in
[Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)])
-> [Move' (RefInfo o) (Exp o)] -> IO [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> a -> b
$ case HNExp o -> HNExp' o
forall a o. WithSeenUIds a o -> a
rawValue HNExp o
hne of
HNApp (Var Nat
v) ICArgList o
_ ->
let (Maybe (Metavar (Exp o) (RefInfo o))
uid, Bool
isunique) = [Metavar (Exp o) (RefInfo o)]
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
pickUid [Metavar (Exp o) (RefInfo o)]
uids ([Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool))
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall a b. (a -> b) -> a -> b
$ HNExp o -> [Maybe (Metavar (Exp o) (RefInfo o))]
forall a o. WithSeenUIds a o -> [Maybe (UId o)]
seenUIds HNExp o
hne
uni :: [Move' (RefInfo o) (Exp o)]
uni = case [CAction o] -> Nat -> Maybe Nat
forall o. [CAction o] -> Nat -> Maybe Nat
univar [CAction o]
cl Nat
v of
Just Nat
v | Nat
v Nat -> Nat -> Bool
forall a. Ord a => a -> a -> Bool
< Nat
n -> [Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Bool -> Cost
costUnificationIf Bool
isunique) (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall a b. (a -> b) -> a -> b
$ Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
uid (Nat -> Elr o
forall o. Nat -> Elr o
Var Nat
v)]
Maybe Nat
_ -> []
in [Move' (RefInfo o) (Exp o)]
uni [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
generics
HNApp (Const ConstRef o
c) ICArgList o
_ ->
let (Maybe (Metavar (Exp o) (RefInfo o))
uid, Bool
isunique) = [Metavar (Exp o) (RefInfo o)]
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
pickUid [Metavar (Exp o) (RefInfo o)]
uids ([Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool))
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall a b. (a -> b) -> a -> b
$ HNExp o -> [Maybe (Metavar (Exp o) (RefInfo o))]
forall a o. WithSeenUIds a o -> [Maybe (UId o)]
seenUIds HNExp o
hne
in Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Bool -> Cost
costUnificationIf Bool
isunique) (Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
uid (ConstRef o -> Elr o
forall o. ConstRef o -> Elr o
Const ConstRef o
c)) Move' (RefInfo o) (Exp o)
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. a -> [a] -> [a]
: [Move' (RefInfo o) (Exp o)]
generics
HNLam{} -> [Move' (RefInfo o) (Exp o)]
generics
HNPi Hiding
hid Bool
possdep ICExp o
_ Abs (ICExp o)
_ ->
let (Maybe (Metavar (Exp o) (RefInfo o))
uid, Bool
isunique) = [Metavar (Exp o) (RefInfo o)]
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall o. [UId o] -> [Maybe (UId o)] -> (Maybe (UId o), Bool)
pickUid [Metavar (Exp o) (RefInfo o)]
uids ([Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool))
-> [Maybe (Metavar (Exp o) (RefInfo o))]
-> (Maybe (Metavar (Exp o) (RefInfo o)), Bool)
forall a b. (a -> b) -> a -> b
$ HNExp o -> [Maybe (Metavar (Exp o) (RefInfo o))]
forall a o. WithSeenUIds a o -> [Maybe (UId o)]
seenUIds HNExp o
hne
in Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move (Bool -> Cost
costUnificationIf Bool
isunique) (Metavar (Exp o) (RefInfo o)
-> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
forall o.
UId o -> Bool -> Hiding -> RefCreateEnv (RefInfo o) (Exp o)
newPi (Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Metavar (Exp o) (RefInfo o)
forall a. a -> Maybe a -> a
fromMaybe Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
uid) Bool
possdep Hiding
hid) Move' (RefInfo o) (Exp o)
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. a -> [a] -> [a]
: [Move' (RefInfo o) (Exp o)]
generics
HNSort (Set Nat
l) -> (Nat -> Move' (RefInfo o) (Exp o))
-> [Nat] -> [Move' (RefInfo o) (Exp o)]
forall a b. (a -> b) -> [a] -> [b]
map (Cost
-> RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costUnification (RefCreateEnv (RefInfo o) (Exp o) -> Move' (RefInfo o) (Exp o))
-> (Nat -> RefCreateEnv (RefInfo o) (Exp o))
-> Nat
-> Move' (RefInfo o) (Exp o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Nat -> RefCreateEnv (RefInfo o) (Exp o)
forall (m :: * -> *) o. Monad m => Nat -> m (Exp o)
set) [Nat
0..Nat
l] [Move' (RefInfo o) (Exp o)]
-> [Move' (RefInfo o) (Exp o)] -> [Move' (RefInfo o) (Exp o)]
forall a. [a] -> [a] -> [a]
++ [Move' (RefInfo o) (Exp o)]
generics
HNSort Sort
_ -> [Move' (RefInfo o) (Exp o)]
generics
[RefInfo o]
_ -> IO [Move' (RefInfo o) (Exp o)]
forall a. HasCallStack => a
__IMPOSSIBLE__
where
app :: Nat -> UId o -> Maybe (UId o) -> Elr o ->
RefCreateEnv (RefInfo o) (Exp o)
app :: Nat
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Elr o
-> RefCreateEnv (RefInfo o) (Exp o)
app Nat
n Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
muid Elr o
elr = do
MM (ArgList o) (RefInfo o)
p <- RefCreateEnv (RefInfo o) (MM (ArgList o) (RefInfo o))
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
MM (ArgList o) (RefInfo o)
p <- case Elr o
elr of
Var{} -> MM (ArgList o) (RefInfo o)
-> RefCreateEnv (RefInfo o) (MM (ArgList o) (RefInfo o))
forall (m :: * -> *) a. Monad m => a -> m a
return MM (ArgList o) (RefInfo o)
p
Const ConstRef o
c -> do
ConstDef o
cd <- StateT (IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o)
-> RefCreateEnv (RefInfo o) (ConstDef o)
forall blk a.
StateT (IORef [SubConstraints blk], Nat) IO a -> RefCreateEnv blk a
RefCreateEnv (StateT (IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o)
-> RefCreateEnv (RefInfo o) (ConstDef o))
-> StateT (IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o)
-> RefCreateEnv (RefInfo o) (ConstDef o)
forall a b. (a -> b) -> a -> b
$ IO (ConstDef o)
-> StateT (IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO (ConstDef o)
-> StateT
(IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o))
-> IO (ConstDef o)
-> StateT (IORef [SubConstraints (RefInfo o)], Nat) IO (ConstDef o)
forall a b. (a -> b) -> a -> b
$ ConstRef o -> IO (ConstDef o)
forall a. IORef a -> IO a
readIORef ConstRef o
c
let dfvapp :: Nat -> Nat -> MM (ArgList o) (RefInfo o)
dfvapp Nat
0 Nat
_ = MM (ArgList o) (RefInfo o)
p
dfvapp Nat
i Nat
n = ArgList o -> MM (ArgList o) (RefInfo o)
forall a blk. a -> MM a blk
NotM (ArgList o -> MM (ArgList o) (RefInfo o))
-> ArgList o -> MM (ArgList o) (RefInfo o)
forall a b. (a -> b) -> a -> b
$ Hiding -> MExp o -> MM (ArgList o) (RefInfo o) -> ArgList o
forall o. Hiding -> MExp o -> MArgList o -> ArgList o
ALCons Hiding
NotHidden
(Exp o -> MExp o
forall a blk. a -> MM a blk
NotM (Exp o -> MExp o) -> Exp o -> MExp o
forall a b. (a -> b) -> a -> b
$ Maybe (Metavar (Exp o) (RefInfo o))
-> OKHandle (RefInfo o)
-> Elr o
-> MM (ArgList o) (RefInfo o)
-> Exp o
forall o.
Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
App Maybe (Metavar (Exp o) (RefInfo o))
forall a. Maybe a
Nothing (OKVal -> OKHandle (RefInfo o)
forall a blk. a -> MM a blk
NotM (OKVal -> OKHandle (RefInfo o)) -> OKVal -> OKHandle (RefInfo o)
forall a b. (a -> b) -> a -> b
$ OKVal
OKVal) (Nat -> Elr o
forall o. Nat -> Elr o
Var Nat
n) (ArgList o -> MM (ArgList o) (RefInfo o)
forall a blk. a -> MM a blk
NotM ArgList o
forall o. ArgList o
ALNil))
(Nat -> Nat -> MM (ArgList o) (RefInfo o)
dfvapp (Nat
i Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1) (Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1))
MM (ArgList o) (RefInfo o)
-> RefCreateEnv (RefInfo o) (MM (ArgList o) (RefInfo o))
forall (m :: * -> *) a. Monad m => a -> m a
return (MM (ArgList o) (RefInfo o)
-> RefCreateEnv (RefInfo o) (MM (ArgList o) (RefInfo o)))
-> MM (ArgList o) (RefInfo o)
-> RefCreateEnv (RefInfo o) (MM (ArgList o) (RefInfo o))
forall a b. (a -> b) -> a -> b
$ Nat -> Nat -> MM (ArgList o) (RefInfo o)
dfvapp (ConstDef o -> Nat
forall o. ConstDef o -> Nat
cddeffreevars ConstDef o
cd) (Nat
n Nat -> Nat -> Nat
forall a. Num a => a -> a -> a
- Nat
1)
OKHandle (RefInfo o)
okh <- RefCreateEnv (RefInfo o) (OKHandle (RefInfo o))
forall blk. RefCreateEnv blk (OKHandle blk)
newOKHandle
Exp o -> RefCreateEnv (RefInfo o) (Exp o)
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp o -> RefCreateEnv (RefInfo o) (Exp o))
-> Exp o -> RefCreateEnv (RefInfo o) (Exp o)
forall a b. (a -> b) -> a -> b
$ Maybe (Metavar (Exp o) (RefInfo o))
-> OKHandle (RefInfo o)
-> Elr o
-> MM (ArgList o) (RefInfo o)
-> Exp o
forall o.
Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
App (Metavar (Exp o) (RefInfo o) -> Maybe (Metavar (Exp o) (RefInfo o))
forall a. a -> Maybe a
Just (Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o)))
-> Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
forall a b. (a -> b) -> a -> b
$ Metavar (Exp o) (RefInfo o)
-> Maybe (Metavar (Exp o) (RefInfo o))
-> Metavar (Exp o) (RefInfo o)
forall a. a -> Maybe a -> a
fromMaybe Metavar (Exp o) (RefInfo o)
meta Maybe (Metavar (Exp o) (RefInfo o))
muid) OKHandle (RefInfo o)
okh Elr o
elr MM (ArgList o) (RefInfo o)
p
extraref :: UId o -> [Maybe (UId o)] -> ConstRef o -> Move o
UId o
meta [Maybe (UId o)]
seenuids ConstRef o
c = Cost -> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
costAppExtraRef (RefCreateEnv (RefInfo o) (Exp o) -> Move o)
-> RefCreateEnv (RefInfo o) (Exp o) -> Move o
forall a b. (a -> b) -> a -> b
$ Maybe (UId o) -> Elr o -> RefCreateEnv (RefInfo o) (Exp o)
app ([Maybe (UId o)] -> Maybe (UId o)
forall a. [a] -> a
head [Maybe (UId o)]
seenuids) (ConstRef o -> Elr o
forall o. ConstRef o -> Elr o
Const ConstRef o
c)
where
app :: Maybe (UId o) -> Elr o -> RefCreateEnv (RefInfo o) (Exp o)
app Maybe (UId o)
muid Elr o
elr = Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
forall o.
Maybe (UId o)
-> OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o
App (UId o -> Maybe (UId o)
forall a. a -> Maybe a
Just (UId o -> Maybe (UId o)) -> UId o -> Maybe (UId o)
forall a b. (a -> b) -> a -> b
$ UId o -> Maybe (UId o) -> UId o
forall a. a -> Maybe a -> a
fromMaybe UId o
meta Maybe (UId o)
muid)
(OKHandle (RefInfo o) -> Elr o -> MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (OKHandle (RefInfo o))
-> RefCreateEnv (RefInfo o) (Elr o -> MArgList o -> Exp o)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RefCreateEnv (RefInfo o) (OKHandle (RefInfo o))
forall blk. RefCreateEnv blk (OKHandle blk)
newOKHandle RefCreateEnv (RefInfo o) (Elr o -> MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (Elr o)
-> RefCreateEnv (RefInfo o) (MArgList o -> Exp o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Elr o -> RefCreateEnv (RefInfo o) (Elr o)
forall (m :: * -> *) a. Monad m => a -> m a
return Elr o
elr RefCreateEnv (RefInfo o) (MArgList o -> Exp o)
-> RefCreateEnv (RefInfo o) (MArgList o)
-> RefCreateEnv (RefInfo o) (Exp o)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RefCreateEnv (RefInfo o) (MArgList o)
forall blk a. RefCreateEnv blk (MM a blk)
newPlaceholder
instance Refinable (ICExp o) (RefInfo o) where
refinements :: RefInfo o
-> [RefInfo o]
-> Metavar (ICExp o) (RefInfo o)
-> IO [Move' (RefInfo o) (ICExp o)]
refinements RefInfo o
_ [RefInfo o]
infos Metavar (ICExp o) (RefInfo o)
_ =
let (RICopyInfo ICExp o
e : [RefInfo o]
_) = [RefInfo o]
infos
in [Move' (RefInfo o) (ICExp o)] -> IO [Move' (RefInfo o) (ICExp o)]
forall (m :: * -> *) a. Monad m => a -> m a
return [Cost
-> RefCreateEnv (RefInfo o) (ICExp o)
-> Move' (RefInfo o) (ICExp o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
0 (ICExp o -> RefCreateEnv (RefInfo o) (ICExp o)
forall (m :: * -> *) a. Monad m => a -> m a
return ICExp o
e)]
instance Refinable (ConstRef o) (RefInfo o) where
refinements :: RefInfo o
-> [RefInfo o]
-> Metavar (ConstRef o) (RefInfo o)
-> IO [Move' (RefInfo o) (ConstRef o)]
refinements RefInfo o
_ [RICheckProjIndex [ConstRef o]
projs] Metavar (ConstRef o) (RefInfo o)
_ = [Move' (RefInfo o) (ConstRef o)]
-> IO [Move' (RefInfo o) (ConstRef o)]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Move' (RefInfo o) (ConstRef o)]
-> IO [Move' (RefInfo o) (ConstRef o)])
-> [Move' (RefInfo o) (ConstRef o)]
-> IO [Move' (RefInfo o) (ConstRef o)]
forall a b. (a -> b) -> a -> b
$ (ConstRef o -> Move' (RefInfo o) (ConstRef o))
-> [ConstRef o] -> [Move' (RefInfo o) (ConstRef o)]
forall a b. (a -> b) -> [a] -> [b]
map (Cost
-> RefCreateEnv (RefInfo o) (ConstRef o)
-> Move' (RefInfo o) (ConstRef o)
forall blk a. Cost -> RefCreateEnv blk a -> Move' blk a
Move Cost
0 (RefCreateEnv (RefInfo o) (ConstRef o)
-> Move' (RefInfo o) (ConstRef o))
-> (ConstRef o -> RefCreateEnv (RefInfo o) (ConstRef o))
-> ConstRef o
-> Move' (RefInfo o) (ConstRef o)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstRef o -> RefCreateEnv (RefInfo o) (ConstRef o)
forall (m :: * -> *) a. Monad m => a -> m a
return) [ConstRef o]
projs
refinements RefInfo o
_ [RefInfo o]
_ Metavar (ConstRef o) (RefInfo o)
_ = IO [Move' (RefInfo o) (ConstRef o)]
forall a. HasCallStack => a
__IMPOSSIBLE__
costIncrease, costUnificationOccurs, costUnification, costAppVar,
costAppVarUsed, costAppHint, costAppHintUsed, costAppRecCall,
costAppRecCallUsed, costAppConstructor, costAppConstructorSingle,
costAppExtraRef, costLam, costLamUnfold, costPi, costSort, costIotaStep,
costInferredTypeUnkown, costAbsurdLam
:: Cost
costUnificationIf :: Bool -> Cost
costUnificationIf :: Bool -> Cost
costUnificationIf Bool
b = if Bool
b then Cost
costUnification else Cost
costUnificationOccurs
costIncrease :: Cost
costIncrease = Cost
1000
costUnificationOccurs :: Cost
costUnificationOccurs = Cost
100
costUnification :: Cost
costUnification = Cost
0000
costAppVar :: Cost
costAppVar = Cost
0000
costAppVarUsed :: Cost
costAppVarUsed = Cost
1000
costAppHint :: Cost
costAppHint = Cost
3000
costAppHintUsed :: Cost
costAppHintUsed = Cost
5000
costAppRecCall :: Cost
costAppRecCall = Cost
0
costAppRecCallUsed :: Cost
costAppRecCallUsed = Cost
10000
costAppConstructor :: Cost
costAppConstructor = Cost
1000
costAppConstructorSingle :: Cost
costAppConstructorSingle = Cost
0000
= Cost
1000
costLam :: Cost
costLam = Cost
0000
costLamUnfold :: Cost
costLamUnfold = Cost
1000
costPi :: Cost
costPi = Cost
1000003
costSort :: Cost
costSort = Cost
1000004
costIotaStep :: Cost
costIotaStep = Cost
3000
costInferredTypeUnkown :: Cost
costInferredTypeUnkown = Cost
1000006
costAbsurdLam :: Cost
costAbsurdLam = Cost
0
costEqStep, costEqEnd, costEqSym, costEqCong :: Cost
costEqStep :: Cost
costEqStep = Cost
2000
costEqEnd :: Cost
costEqEnd = Cost
0
costEqSym :: Cost
costEqSym = Cost
0
costEqCong :: Cost
costEqCong = Cost
500
prioNo, prioTypeUnknown, prioTypecheckArgList, prioInferredTypeUnknown,
prioCompBeta, prioCompBetaStructured, prioCompareArgList, prioCompIota,
prioCompChoice, prioCompUnif, prioCompCopy, prioNoIota, prioAbsurdLambda,
prioProjIndex
:: Prio
prioNo :: Prio
prioNo = (-Prio
1)
prioTypeUnknown :: Prio
prioTypeUnknown = Prio
0
prioTypecheckArgList :: Prio
prioTypecheckArgList = Prio
3000
prioInferredTypeUnknown :: Prio
prioInferredTypeUnknown = Prio
4000
prioCompBeta :: Prio
prioCompBeta = Prio
4000
prioCompBetaStructured :: Prio
prioCompBetaStructured = Prio
4000
prioCompIota :: Prio
prioCompIota = Prio
4000
prioCompChoice :: Prio
prioCompChoice = Prio
5000
prioCompUnif :: Prio
prioCompUnif = Prio
6000
prioCompCopy :: Prio
prioCompCopy = Prio
8000
prioCompareArgList :: Prio
prioCompareArgList = Prio
7000
prioNoIota :: Prio
prioNoIota = Prio
500
prioAbsurdLambda :: Prio
prioAbsurdLambda = Prio
1000
prioProjIndex :: Prio
prioProjIndex = Prio
3000
prioTypecheck :: Bool -> Prio
prioTypecheck :: Bool -> Prio
prioTypecheck Bool
False = Prio
1000
prioTypecheck Bool
True = Prio
0
instance Trav a => Trav [a] where
type Block [a] = Block a
trav :: (forall b. TravWith b (Block [a]) => MM b (Block b) -> m ())
-> [a] -> m ()
trav forall b. TravWith b (Block [a]) => MM b (Block b) -> m ()
_ [] = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
trav forall b. TravWith b (Block [a]) => MM b (Block b) -> m ()
f (a
x:[a]
xs) = (forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block a) => MM b (Block b) -> m ()
forall b. TravWith b (Block [a]) => MM b (Block b) -> m ()
f a
x m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (forall b. TravWith b (Block [a]) => MM b (Block b) -> m ())
-> [a] -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block [a]) => MM b (Block b) -> m ()
f [a]
xs
instance Trav (MId, CExp o) where
type Block (MId, CExp o) = RefInfo o
trav :: (forall b.
TravWith b (Block (MId, CExp o)) =>
MM b (Block b) -> m ())
-> (MId, CExp o) -> m ()
trav forall b.
TravWith b (Block (MId, CExp o)) =>
MM b (Block b) -> m ()
f (MId
_, CExp o
ce) = (forall b. TravWith b (Block (CExp o)) => MM b (Block b) -> m ())
-> CExp o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b.
TravWith b (Block (MId, CExp o)) =>
MM b (Block b) -> m ()
forall b. TravWith b (Block (CExp o)) => MM b (Block b) -> m ()
f CExp o
ce
instance Trav (TrBr a o) where
type Block (TrBr a o) = RefInfo o
trav :: (forall b. TravWith b (Block (TrBr a o)) => MM b (Block b) -> m ())
-> TrBr a o -> m ()
trav forall b. TravWith b (Block (TrBr a o)) => MM b (Block b) -> m ()
f (TrBr [MExp o]
es a
_) = (forall b. TravWith b (Block [MExp o]) => MM b (Block b) -> m ())
-> [MExp o] -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block [MExp o]) => MM b (Block b) -> m ()
forall b. TravWith b (Block (TrBr a o)) => MM b (Block b) -> m ()
f [MExp o]
es
instance Trav (Exp o) where
type Block (Exp o) = RefInfo o
trav :: (forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ())
-> Exp o -> m ()
trav forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ()
f = \case
App Maybe (UId o)
_ OKHandle (RefInfo o)
_ Elr o
_ MArgList o
args -> (forall b.
TravWith b (Block (MArgList o)) =>
MM b (Block b) -> m ())
-> MArgList o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MArgList o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ()
f MArgList o
args
Lam Hiding
_ (Abs MId
_ MExp o
b) -> (forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ())
-> MExp o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ()
f MExp o
b
Pi Maybe (UId o)
_ Hiding
_ Bool
_ MExp o
it (Abs MId
_ MExp o
ot) -> (forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ())
-> MExp o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ()
f MExp o
it m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ())
-> MExp o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (Exp o)) => MM b (Block b) -> m ()
f MExp o
ot
Sort Sort
_ -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
AbsurdLambda{} -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
instance Trav (ArgList o) where
type Block (ArgList o) = RefInfo o
trav :: (forall b.
TravWith b (Block (ArgList o)) =>
MM b (Block b) -> m ())
-> ArgList o -> m ()
trav forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
_ ArgList o
ALNil = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
trav forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f (ALCons Hiding
_ MExp o
arg MArgList o
args) = (forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ())
-> MExp o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MExp o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f MExp o
arg m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (forall b.
TravWith b (Block (MArgList o)) =>
MM b (Block b) -> m ())
-> MArgList o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MArgList o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f MArgList o
args
trav forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f (ALProj MArgList o
eas MM (ConstRef o) (RefInfo o)
_ Hiding
_ MArgList o
as) = (forall b.
TravWith b (Block (MArgList o)) =>
MM b (Block b) -> m ())
-> MArgList o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MArgList o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f MArgList o
eas m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (forall b.
TravWith b (Block (MArgList o)) =>
MM b (Block b) -> m ())
-> MArgList o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MArgList o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f MArgList o
as
trav forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f (ALConPar MArgList o
args) = (forall b.
TravWith b (Block (MArgList o)) =>
MM b (Block b) -> m ())
-> MArgList o -> m ()
forall a (m :: * -> *).
(Trav a, Monad m) =>
(forall b. TravWith b (Block a) => MM b (Block b) -> m ())
-> a -> m ()
trav forall b. TravWith b (Block (MArgList o)) => MM b (Block b) -> m ()
forall b. TravWith b (Block (ArgList o)) => MM b (Block b) -> m ()
f MArgList o
args