@@ -854,7 +854,8 @@ deriving instance Binary ImplicitInfo
854854-- of the 'Bind' constructor for the 'TT' type.
855855data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}}
856856 -- ^ A function binding
857− | Pi { binderImpl :: Maybe ImplicitInfo,
857+ | Pi { binderCount :: RigCount,
858+ binderImpl :: Maybe ImplicitInfo,
858859 binderTy :: !b,
859860 binderKind :: !b }
860861 -- ^ A binding that occurs in a function type
@@ -886,7 +887,8 @@ data Binder b = Lam { binderTy :: !b {-^ type annotation for bound variable-}
886887 -- substituted - the guess is to keep it
887888 -- computationally inert while working on other things
888889 -- if necessary.
889− | PVar { binderTy :: !b }
890+ | PVar { binderCount :: RigCount,
891+ binderTy :: !b }
890892 -- ^ A pattern variable (these are bound around terms
891893 -- that make up pattern-match clauses)
892894 | PVTy { binderTy :: !b }
@@ -898,13 +900,13 @@ deriving instance Binary Binder
898900
899901instance Sized a => Sized (Binder a) where
900902 size (Lam ty) = 1 + size ty
901− size (Pi _ ty _) = 1 + size ty
903+ size (Pi _ _ ty _) = 1 + size ty
902904 size (Let ty val) = 1 + size ty + size val
903905 size (NLet ty val) = 1 + size ty + size val
904906 size (Hole ty) = 1 + size ty
905907 size (GHole _ _ ty) = 1 + size ty
906908 size (Guess ty val) = 1 + size ty + size val
907− size (PVar ty) = 1 + size ty
909+ size (PVar _ ty) = 1 + size ty
908910 size (PVTy ty) = 1 + size ty
909911
910912fmapMB :: 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)
912914fmapMB f (NLet t v) = liftM2 NLet (f t) (f v)
913915fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)
914916fmapMB 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)
916918fmapMB f (Hole t) = liftM Hole (f t)
917919fmapMB 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)
919921fmapMB f (PVTy t) = liftM PVTy (f t)
920922
921923raw_apply :: Raw -> [Raw] -> Raw
@@ -1127,7 +1129,7 @@ isInjective (P (DCon _ _ _) _ _) = True
11271129isInjective (P (TCon _ _) _ _) = True
11281130isInjective (Constant _) = True
11291131isInjective (TType x) = True
1130−isInjective (Bind _ (Pi _ _ _) sc) = True
1132+isInjective (Bind _ (Pi _ _ _ _) sc) = True
11311133isInjective (App _ f a) = isInjective f
11321134isInjective _ = False
11331135
@@ -1361,7 +1363,7 @@ freeNames t = nub $ freeNames' t
13611363
13621364-- | Return the arity of a (normalised) type
13631365arity :: TT n -> Int
1364−arity (Bind n (Pi _ t _) sc) = 1 + arity sc
1366+arity (Bind n (Pi _ _ t _) sc) = 1 + arity sc
13651367arity _ = 0
13661368
13671369-- | 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)
14571459-- | Return a list of pairs of the names of the outermost 'Pi'-bound
14581460-- variables in the given term, together with their types.
14591461getArgTys :: TT n -> [(n, TT n)]
1460−getArgTys (Bind n (PVar _) sc) = getArgTys sc
1462+getArgTys (Bind n (PVar _ _) sc) = getArgTys sc
14611463getArgTys (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
14631465getArgTys _ = []
14641466
14651467getRetTy :: TT n -> TT n
1466−getRetTy (Bind n (PVar _) sc) = getRetTy sc
1468+getRetTy (Bind n (PVar _ _) sc) = getRetTy sc
14671469getRetTy (Bind n (PVTy _) sc) = getRetTy sc
1468−getRetTy (Bind n (Pi _ _ _) sc) = getRetTy sc
1470+getRetTy (Bind n (Pi _ _ _ _) sc) = getRetTy sc
14691471getRetTy sc = sc
14701472
14711473-- | As getRetTy but substitutes names for de Bruijn indices
14721474substRetTy :: 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)
14741476substRetTy (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)
14761478substRetTy sc = sc
14771479
14781480
@@ -1589,7 +1591,7 @@ prettyEnv env t = prettyEnv' env t False
15891591 else
15901592 lbracket <+> text (show i) <+> rbracket
15911593 | 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
15931595 | noOccurrence n sc && not debug =
15941596 bracket p 2 $ prettySb env n b debug <> prettySe 10 ((n, Rig0, b):env) sc debug
15951597 prettySe p env (Bind n b sc) debug =
@@ -1609,8 +1611,11 @@ prettyEnv env t = prettyEnv' env t False
16091611 prettySb env n (Lam t) = prettyB env "λ" "=>" n t
16101612 prettySb env n (Hole t) = prettyB env "?defer" "." n t
16111613 prettySb env n (GHole _ _ t) = prettyB env "?gdefer" "." n t
1612− prettySb env n (Pi _ t _) = prettyB env "(" ") ->" n t
1613− prettySb env n (PVar t) = prettyB env "pat" "." 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
1618+ prettySb env n (PVar _ t) = prettyB env "pat" "." n t
16141619 prettySb env n (PVTy t) = prettyB env "pty" "." n t
16151620 prettySb env n (Let t v) = prettyBv env "let" "in" n t v
16161621 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
16361641 = (show $ fstEnv $ env!!i) ++
16371642 if dbg then "{" ++ show i ++ "}" else ""
16381643 | otherwise = "!!V " ++ show i ++ "!!"
1639− se p env (Bind n b@(Pi (Just _) t k) sc)
1640− = bracket p 2 $ sb env n b ++ se 10 ((n,Rig0,b):env) sc
1641− se p env (Bind n b@(Pi _ 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
1643− where arrow (TType _) = " -> "
1644− arrow u = " [" ++ show u ++ "] -> "
1644+ se p env (Bind n b@(Pi rig (Just _) t k) sc)
1645+ = bracket p 2 $ sb env n b ++ se 10 ((n, rig, b):env) sc
1646+ se p env (Bind n b@(Pi rig _ t k) sc)
1647+ | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ arrow rig ++ se 10 ((n,Rig0,b):env) sc
1648+ where arrow Rig0 = " -> "
1649+ arrow Rig1 = " -o "
1650+ arrow RigW = " -> "
16451651 se p env (Bind n b sc) = bracket p 2 $ sb env n b ++ se 10 ((n,Rig0,b):env) sc
16461652 se p env (App _ f a) = bracket p 1 $ se 1 env f ++ " " ++ se 0 env a
16471653 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
16551661 sb env n (Lam t) = showb env "\\ " " => " n t
16561662 sb env n (Hole t) = showb env "? " ". " n t
16571663 sb env n (GHole i ns t) = showb env "?defer " ". " n t
1658− sb env n (Pi (Just _) t _) = showb env "{" "} -> " n t
1659− sb env n (Pi _ t _) = showb env "(" ") -> " n t
1660− sb env n (PVar t) = showb env "pat " ". " 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
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
1669+ sb env n (PVar _ t) = showb env "pat " ". " n t
16611670 sb env n (PVTy t) = showb env "pty " ". " n t
16621671 sb env n (Let t v) = showbv env "let " " in " n t v
16631672 sb env n (NLet t v) = showbv env "nlet " " in " n t v
@@ -1765,13 +1774,13 @@ pprintTT bound tm = pp startPrec bound tm
17651774 ppb p bound n (Lam ty) sc =
17661775 bracket p startPrec . group . align . hang 2 $
17671776 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 =
17691778 bracket p startPrec . group . align $
17701779 lparen <> (bindingOf n False) <+> colon <+>
17711780 (group . align) (pp startPrec bound ty) <>
1772− rparen <+> mkArrow k <> line <> sc
1773− where mkArrow (UType UniqueType) = text "⇴"
1774− mkArrow (UType NullType) = text "⥛"
1781+ rparen <+> mkArrow rig <> line <> sc
1782+ where mkArrow Rig1 = text "⇴"
1783+ mkArrow Rig0 = text "⥛"
17751784 mkArrow _ = text "→"
17761785 ppb p bound n (Let ty val) sc =
17771786 bracket p startPrec . group . align $
@@ -1800,7 +1809,7 @@ pprintTT bound tm = pp startPrec bound tm
18001809 text "?" <> bindingOf n False <+>
18011810 text "≈" <+> pp startPrec bound val <+>
18021811 text "." <> line <> sc
1803− ppb p bound n (PVar ty) sc =
1812+ ppb p bound n (PVar _ ty) sc =
18041813 bracket p startPrec . group . align . hang 2 $
18051814 annotate AnnKeyword (text "pat") <+>
18061815 bindingOf n False <+> colon <+> pp startPrec bound ty <+>
@@ -1853,8 +1862,8 @@ pprintRaw bound (RBind n b body) =
18531862 where
18541863 ppb (Lam ty) = enclose lparen rparen . group . align . hang 2 $
18551864 text "Lam" <$> pprintRaw bound ty
1856− ppb (Pi _ ty k) = enclose lparen rparen . group . align . hang 2 $
1857− vsep [text "Pi", pprintRaw bound ty, pprintRaw bound k]
1865+ ppb (Pi _ _ ty k) = enclose lparen rparen . group . align . hang 2 $
1866+ vsep [text "Pi", pprintRaw bound ty, pprintRaw bound k]
18581867 ppb (Let ty v) = enclose lparen rparen . group . align . hang 2 $
18591868 vsep [text "Let", pprintRaw bound ty, pprintRaw bound v]
18601869 ppb (NLet ty v) = enclose lparen rparen . group . align . hang 2 $
@@ -1865,8 +1874,8 @@ pprintRaw bound (RBind n b body) =
18651874 text "GHole" <$> pprintRaw bound ty
18661875 ppb (Guess ty v) = enclose lparen rparen . group . align . hang 2 $
18671876 vsep [text "Guess", pprintRaw bound ty, pprintRaw bound v]
1868− ppb (PVar ty) = enclose lparen rparen . group . align . hang 2 $
1869− text "PVar" <$> pprintRaw bound ty
1877+ ppb (PVar _ ty) = enclose lparen rparen . group . align . hang 2 $
1878+ text "PVar" <$> pprintRaw bound ty
18701879 ppb (PVTy ty) = enclose lparen rparen . group . align . hang 2 $
18711880 text "PVTy" <$> pprintRaw bound ty
18721881pprintRaw bound (RApp f x) =