@@ -854,7 +854,8 @@ deriving instance Binary ImplicitInfo
854-- of the 'Bind' constructor for the 'TT' type.
854-- of the 'Bind' constructor for the 'TT' type.
855data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}}
855data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}}
856 -- ^ A function binding
856 -- ^ A function binding
857+ | Pi { binderCount :: RigCount,
857− | Pi { binderImpl :: Maybe ImplicitInfo,
858+ binderImpl :: Maybe ImplicitInfo,
858 binderTy :: !b,
859 binderTy :: !b,
859 binderKind :: !b }
860 binderKind :: !b }
860 -- ^ A binding that occurs in a function type
861 -- ^ A binding that occurs in a function type
@@ -886,7 +887,8 @@ data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}
886 -- substituted - the guess is to keep it
887 -- substituted - the guess is to keep it
887 -- computationally inert while working on other things
888 -- computationally inert while working on other things
888 -- if necessary.
889 -- if necessary.
890+ | PVar { binderCount :: RigCount,
889− | PVar { binderTy :: !b }
891+ binderTy :: !b }
890 -- ^ A pattern variable (these are bound around terms
892 -- ^ A pattern variable (these are bound around terms
891 -- that make up pattern-match clauses)
893 -- that make up pattern-match clauses)
892 | PVTy { binderTy :: !b }
894 | PVTy { binderTy :: !b }
@@ -898,13 +900,13 @@ deriving instance Binary Binder
899instance Sized a => Sized (Binder a) where
901instance Sized a => Sized (Binder a) where
900 size (Lam ty) = 1 + size ty
902 size (Lam ty) = 1 + size ty
901− size (Pi _ ty _) = 1 + size ty
903+ size (Pi _ _ ty _) = 1 + size ty
902 size (Let ty val) = 1 + size ty + size val
904 size (Let ty val) = 1 + size ty + size val
903 size (NLet ty val) = 1 + size ty + size val
905 size (NLet ty val) = 1 + size ty + size val
904 size (Hole ty) = 1 + size ty
906 size (Hole ty) = 1 + size ty
905 size (GHole _ _ ty) = 1 + size ty
907 size (GHole _ _ ty) = 1 + size ty
906 size (Guess ty val) = 1 + size ty + size val
908 size (Guess ty val) = 1 + size ty + size val
907− size (PVar ty) = 1 + size ty
909+ size (PVar _ ty) = 1 + size ty
908 size (PVTy ty) = 1 + size ty
910 size (PVTy ty) = 1 + size ty
910fmapMB :: Monad m => (a -> m b) -> Binder a -> m (Binder b)
912fmapMB :: Monad m => (a -> m b) -> Binder a -> m (Binder b)
@@ -912,10 +914,10 @@ fmapMB f (Let t v) = liftM2 Let (f t) (f v)
912fmapMB f (NLet t v) = liftM2 NLet (f t) (f v)
914fmapMB f (NLet t v) = liftM2 NLet (f t) (f v)
913fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)
915fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)
914fmapMB f (Lam t) = liftM Lam (f t)
916fmapMB f (Lam t) = liftM Lam (f t)
915−fmapMB f (Pi i t k) = liftM2 (Pi i) (f t) (f k)
917+fmapMB f (Pi c i t k) = liftM2 (Pi c i) (f t) (f k)
916fmapMB f (Hole t) = liftM Hole (f t)
918fmapMB f (Hole t) = liftM Hole (f t)
917fmapMB f (GHole i ns t) = liftM (GHole i ns) (f t)
919fmapMB f (GHole i ns t) = liftM (GHole i ns) (f t)
918−fmapMB f (PVar t) = liftM PVar (f t)
920+fmapMB f (PVar c t) = liftM (PVar c) (f t)
919fmapMB f (PVTy t) = liftM PVTy (f t)
921fmapMB f (PVTy t) = liftM PVTy (f t)
921raw_apply :: Raw -> [Raw] -> Raw
923raw_apply :: Raw -> [Raw] -> Raw
@@ -1127,7 +1129,7 @@ isInjective (P (DCon _ _ _) _ _) = True
1127isInjective (P (TCon _ _) _ _) = True
1129isInjective (P (TCon _ _) _ _) = True
1128isInjective (Constant _) = True
1130isInjective (Constant _) = True
1129isInjective (TType x) = True
1131isInjective (TType x) = True
1130−isInjective (Bind _ (Pi _ _ _) sc) = True
1132+isInjective (Bind _ (Pi _ _ _ _) sc) = True
1131isInjective (App _ f a) = isInjective f
1133isInjective (App _ f a) = isInjective f
1132isInjective _ = False
1134isInjective _ = False
@@ -1361,7 +1363,7 @@ freeNames t = nub $ freeNames' t
1362-- | Return the arity of a (normalised) type
1364-- | Return the arity of a (normalised) type
1363arity :: TT n -> Int
1365arity :: TT n -> Int
1364−arity (Bind n (Pi _ t _) sc) = 1 + arity sc
1366+arity (Bind n (Pi _ _ t _) sc) = 1 + arity sc
1365arity _ = 0
1367arity _ = 0
1367-- | Deconstruct an application; returns the function and a list of arguments
1369-- | Deconstruct an application; returns the function and a list of arguments
@@ -1457,22 +1459,22 @@ bindTyArgs b xs = bindAll (map (\ (n, ty) -> (n, b ty)) xs)
1457-- | Return a list of pairs of the names of the outermost 'Pi'-bound
1459-- | Return a list of pairs of the names of the outermost 'Pi'-bound
1458-- variables in the given term, together with their types.
1460-- variables in the given term, together with their types.
1459getArgTys :: TT n -> [(n, TT n)]
1461getArgTys :: TT n -> [(n, TT n)]
1460−getArgTys (Bind n (PVar _) sc) = getArgTys sc
1462+getArgTys (Bind n (PVar _ _) sc) = getArgTys sc
1461getArgTys (Bind n (PVTy _) sc) = getArgTys sc
1463getArgTys (Bind n (PVTy _) sc) = getArgTys sc
1462−getArgTys (Bind n (Pi _ t _) sc) = (n, t) : getArgTys sc
1464+getArgTys (Bind n (Pi _ _ t _) sc) = (n, t) : getArgTys sc
1463getArgTys _ = []
1465getArgTys _ = []
1465getRetTy :: TT n -> TT n
1467getRetTy :: TT n -> TT n
1466−getRetTy (Bind n (PVar _) sc) = getRetTy sc
1468+getRetTy (Bind n (PVar _ _) sc) = getRetTy sc
1467getRetTy (Bind n (PVTy _) sc) = getRetTy sc
1469getRetTy (Bind n (PVTy _) sc) = getRetTy sc
1468−getRetTy (Bind n (Pi _ _ _) sc) = getRetTy sc
1470+getRetTy (Bind n (Pi _ _ _ _) sc) = getRetTy sc
1469getRetTy sc = sc
1471getRetTy sc = sc
1471-- | As getRetTy but substitutes names for de Bruijn indices
1473-- | As getRetTy but substitutes names for de Bruijn indices
1472substRetTy :: TT n -> TT n
1474substRetTy :: TT n -> TT n
1473−substRetTy (Bind n (PVar ty) sc) = substRetTy (substV (P Ref n ty) sc)
1475+substRetTy (Bind n (PVar _ ty) sc) = substRetTy (substV (P Ref n ty) sc)
1474substRetTy (Bind n (PVTy ty) sc) = substRetTy (substV (P Ref n ty) sc)
1476substRetTy (Bind n (PVTy ty) sc) = substRetTy (substV (P Ref n ty) sc)
1475−substRetTy (Bind n (Pi _ ty _) sc) = substRetTy (substV (P Ref n ty) sc)
1477+substRetTy (Bind n (Pi _ _ ty _) sc) = substRetTy (substV (P Ref n ty) sc)
1476substRetTy sc = sc
1478substRetTy sc = sc
@@ -1589,7 +1591,7 @@ prettyEnv env t = prettyEnv' env t False
1590 lbracket <+> text (show i) <+> rbracket
1592 lbracket <+> text (show i) <+> rbracket
1591 | otherwise = text "unbound" <+> text (show i) <+> text "!"
1593 | otherwise = text "unbound" <+> text (show i) <+> text "!"
1592− prettySe p env (Bind n b@(Pi _ t _) sc) debug
1594+ prettySe p env (Bind n b@(Pi _ _ t _) sc) debug
1593 | noOccurrence n sc && not debug =
1595 | noOccurrence n sc && not debug =
1594 bracket p 2 $ prettySb env n b debug <> prettySe 10 ((n, Rig0, b):env) sc debug
1596 bracket p 2 $ prettySb env n b debug <> prettySe 10 ((n, Rig0, b):env) sc debug
1595 prettySe p env (Bind n b sc) debug =
1597 prettySe p env (Bind n b sc) debug =
@@ -1609,8 +1611,11 @@ prettyEnv env t = prettyEnv' env t False
1609 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1611 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
1610 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1612 prettySb env n (Hole t) = prettyB env "?defer" "." n t
1611 prettySb env n (GHole _ _ t) = prettyB env "?gdefer" "." n t
1613 prettySb env n (GHole _ _ t) = prettyB env "?gdefer" "." n t
1612− prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t
1614+ prettySb env n (Pi Rig0 _ t _) = prettyB env "(" ") ->" n t
1615+ prettySb env n (Pi Rig1 _ t _) = prettyB env "(" ") -o" n t
1616+ prettySb env n (Pi RigW _ t _) = prettyB env "(" ") ->" n t
1617+ prettySb env n (PVar Rig1 t) = prettyB env "pat 1 " "." n t
1613− prettySb env n (PVar t) = prettyB env "pat" "." n t
1618+ prettySb env n (PVar _ t) = prettyB env "pat" "." n t
1614 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1619 prettySb env n (PVTy t) = prettyB env "pty" "." n t
1615 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
1620 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
1616 prettySb env n (NLet t v) = prettyBv env "nlet" "in" n t v
1621 prettySb env n (NLet t v) = prettyBv env "nlet" "in" n t v
@@ -1636,12 +1641,13 @@ showEnv' env t dbg = se 10 env t where
1636 = (show $ fstEnv $ env!!i) ++
1641 = (show $ fstEnv $ env!!i) ++
1637 if dbg then "{" ++ show i ++ "}" else ""
1642 if dbg then "{" ++ show i ++ "}" else ""
1638 | otherwise = "!!V " ++ show i ++ "!!"
1643 | otherwise = "!!V " ++ show i ++ "!!"
1639− se p env (Bind n b@(Pi (Just _) t k) sc)
1644+ se p env (Bind n b@(Pi rig (Just _) t k) sc)
1640− = bracket p 2 $ sb env n b ++ se 10 ((n,Rig0,b):env) sc
1645+ = bracket p 2 $ sb env n b ++ se 10 ((n, rig, b):env) sc
1641− se p env (Bind n b@(Pi _ t k) sc)
1646+ se p env (Bind n b@(Pi rig _ t k) sc)
1642− | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ arrow k ++ se 10 ((n,Rig0,b):env) sc
1647+ | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ arrow rig ++ se 10 ((n,Rig0,b):env) sc
1643− where arrow (TType _) = " -> "
1648+ where arrow Rig0 = " -> "
1644− arrow u = " [" ++ show u ++ "] -> "
1649+ arrow Rig1 = " -o "
1650+ arrow RigW = " -> "
1645 se p env (Bind n b sc) = bracket p 2 $ sb env n b ++ se 10 ((n,Rig0,b):env) sc
1651 se p env (Bind n b sc) = bracket p 2 $ sb env n b ++ se 10 ((n,Rig0,b):env) sc
1646 se p env (App _ f a) = bracket p 1 $ se 1 env f ++ " " ++ se 0 env a
1652 se p env (App _ f a) = bracket p 1 $ se 1 env f ++ " " ++ se 0 env a
1647 se p env (Proj x i) = se 1 env x ++ "!" ++ show i
1653 se p env (Proj x i) = se 1 env x ++ "!" ++ show i
@@ -1655,9 +1661,12 @@ showEnv' env t dbg = se 10 env t where
1655 sb env n (Lam t) = showb env "\\ " " => " n t
1661 sb env n (Lam t) = showb env "\\ " " => " n t
1656 sb env n (Hole t) = showb env "? " ". " n t
1662 sb env n (Hole t) = showb env "? " ". " n t
1657 sb env n (GHole i ns t) = showb env "?defer " ". " n t
1663 sb env n (GHole i ns t) = showb env "?defer " ". " n t
1658− sb env n (Pi (Just _) t _) = showb env "{" "} -> " n t
1664+ sb env n (Pi Rig1 (Just _) t _) = showb env "{" "} -o " n t
1665+ sb env n (Pi _ (Just _) t _) = showb env "{" "} -> " n t
1659− sb env n (Pi _ t _) = showb env "(" ") -> " n t
1666+ sb env n (Pi Rig1 _ t _) = showb env "(" ") -0 " n t
1667+ sb env n (Pi _ _ t _) = showb env "(" ") -> " n t
1668+ sb env n (PVar Rig1 t) = showb env "pat 1 " ". " n t
1660− sb env n (PVar t) = showb env "pat " ". " n t
1669+ sb env n (PVar _ t) = showb env "pat " ". " n t
1661 sb env n (PVTy t) = showb env "pty " ". " n t
1670 sb env n (PVTy t) = showb env "pty " ". " n t
1662 sb env n (Let t v) = showbv env "let " " in " n t v
1671 sb env n (Let t v) = showbv env "let " " in " n t v
1663 sb env n (NLet t v) = showbv env "nlet " " in " n t v
1672 sb env n (NLet t v) = showbv env "nlet " " in " n t v
@@ -1765,13 +1774,13 @@ pprintTT bound tm = pp startPrec bound tm
1765 ppb p bound n (Lam ty) sc =
1774 ppb p bound n (Lam ty) sc =
1766 bracket p startPrec . group . align . hang 2 $
1775 bracket p startPrec . group . align . hang 2 $
1767 text "λ" <+> bindingOf n False <+> text "." <> line <> sc
1776 text "λ" <+> bindingOf n False <+> text "." <> line <> sc
1768− ppb p bound n (Pi _ ty k) sc =
1777+ ppb p bound n (Pi rig _ ty k) sc =
1769 bracket p startPrec . group . align $
1778 bracket p startPrec . group . align $
1770 lparen <> (bindingOf n False) <+> colon <+>
1779 lparen <> (bindingOf n False) <+> colon <+>
1771 (group . align) (pp startPrec bound ty) <>
1780 (group . align) (pp startPrec bound ty) <>
1772− rparen <+> mkArrow k <> line <> sc
1781+ rparen <+> mkArrow rig <> line <> sc
1773− where mkArrow (UType UniqueType) = text "⇴"
1782+ where mkArrow Rig1 = text "⇴"
1774− mkArrow (UType NullType) = text "⥛"
1783+ mkArrow Rig0 = text "⥛"
1775 mkArrow _ = text "→"
1784 mkArrow _ = text "→"
1776 ppb p bound n (Let ty val) sc =
1785 ppb p bound n (Let ty val) sc =
1777 bracket p startPrec . group . align $
1786 bracket p startPrec . group . align $
@@ -1800,7 +1809,7 @@ pprintTT bound tm = pp startPrec bound tm
1800 text "?" <> bindingOf n False <+>
1809 text "?" <> bindingOf n False <+>
1801 text "≈" <+> pp startPrec bound val <+>
1810 text "≈" <+> pp startPrec bound val <+>
1802 text "." <> line <> sc
1811 text "." <> line <> sc
1803− ppb p bound n (PVar ty) sc =
1812+ ppb p bound n (PVar _ ty) sc =
1804 bracket p startPrec . group . align . hang 2 $
1813 bracket p startPrec . group . align . hang 2 $
1805 annotate AnnKeyword (text "pat") <+>
1814 annotate AnnKeyword (text "pat") <+>
1806 bindingOf n False <+> colon <+> pp startPrec bound ty <+>
1815 bindingOf n False <+> colon <+> pp startPrec bound ty <+>
@@ -1853,8 +1862,8 @@ pprintRaw bound (RBind n b body) =
1854 ppb (Lam ty) = enclose lparen rparen . group . align . hang 2 $
1863 ppb (Lam ty) = enclose lparen rparen . group . align . hang 2 $
1855 text "Lam" <$> pprintRaw bound ty
1864 text "Lam" <$> pprintRaw bound ty
1856− ppb (Pi _ ty k) = enclose lparen rparen . group . align . hang 2 $
1865+ ppb (Pi _ _ ty k) = enclose lparen rparen . group . align . hang 2 $
1857− vsep [text "Pi", pprintRaw bound ty, pprintRaw bound k]
1866+ vsep [text "Pi", pprintRaw bound ty, pprintRaw bound k]
1858 ppb (Let ty v) = enclose lparen rparen . group . align . hang 2 $
1867 ppb (Let ty v) = enclose lparen rparen . group . align . hang 2 $
1859 vsep [text "Let", pprintRaw bound ty, pprintRaw bound v]
1868 vsep [text "Let", pprintRaw bound ty, pprintRaw bound v]
1860 ppb (NLet ty v) = enclose lparen rparen . group . align . hang 2 $
1869 ppb (NLet ty v) = enclose lparen rparen . group . align . hang 2 $
@@ -1865,8 +1874,8 @@ pprintRaw bound (RBind n b body) =
1865 text "GHole" <$> pprintRaw bound ty
1874 text "GHole" <$> pprintRaw bound ty
1866 ppb (Guess ty v) = enclose lparen rparen . group . align . hang 2 $
1875 ppb (Guess ty v) = enclose lparen rparen . group . align . hang 2 $
1867 vsep [text "Guess", pprintRaw bound ty, pprintRaw bound v]
1876 vsep [text "Guess", pprintRaw bound ty, pprintRaw bound v]
1868− ppb (PVar ty) = enclose lparen rparen . group . align . hang 2 $
1877+ ppb (PVar _ ty) = enclose lparen rparen . group . align . hang 2 $
1869− text "PVar" <$> pprintRaw bound ty
1878+ text "PVar" <$> pprintRaw bound ty
1870 ppb (PVTy ty) = enclose lparen rparen . group . align . hang 2 $
1879 ppb (PVTy ty) = enclose lparen rparen . group . align . hang 2 $
1871 text "PVTy" <$> pprintRaw bound ty
1880 text "PVTy" <$> pprintRaw bound ty
1872pprintRaw bound (RApp f x) =
1881pprintRaw bound (RApp f x) =