@@ -1006,7 +1006,7 @@ expandParams dec ps ns infs tm = en tm
10061006 en (PTyped l r) = PTyped (en l) (en r)
10071007 en (PPair f hls p l r) = PPair f hls p (en l) (en r)
10081008 en (PDPair f hls p l t r) = PDPair f hls p (en l) (en t) (en r)
1009− en (PAlternative a as) = PAlternative a (map en as)
1009+ en (PAlternative ns a as) = PAlternative ns a (map en as)
10101010 en (PHidden t) = PHidden (en t)
10111011 en (PUnifyLog t) = PUnifyLog (en t)
10121012 en (PDisamb ds t) = PDisamb ds (en t)
@@ -1177,7 +1177,7 @@ getPriority i tm = 1 -- pri tm
11771177 pri (PTyped l r) = pri l
11781178 pri (PPair _ _ _ l r) = max 1 (max (pri l) (pri r))
11791179 pri (PDPair _ _ _ l t r) = max 1 (max (pri l) (max (pri t) (pri r)))
1180− pri (PAlternative a as) = maximum (map pri as)
1180+ pri (PAlternative _ a as) = maximum (map pri as)
11811181 pri (PConstant _ _) = 0
11821182 pri Placeholder = 1
11831183 pri _ = 3
@@ -1499,7 +1499,7 @@ implicitise syn ignore ist tm = -- trace ("INCOMING " ++ showImp True tm) $
14991499 let isn = namesIn uvars ist l ++ namesIn uvars ist t ++
15001500 namesIn uvars ist r
15011501 put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))
1502− imps top env (PAlternative a as)
1502+ imps top env (PAlternative ms a as)
15031503 = do (decls, ns) <- get
15041504 let isn = concatMap (namesIn uvars ist) as
15051505 put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
@@ -1542,7 +1542,7 @@ addImpl = addImpl' False [] []
15421542
15431543addImpl' :: Bool -> [Name] -> [Name] -> [Name] -> IState -> PTerm -> PTerm
15441544addImpl' inpat env infns imp_meths ist ptm
1545− = mkUniqueNames env (ai False (zip env (repeat Nothing)) [] ptm)
1545+ = mkUniqueNames env [] (ai False (zip env (repeat Nothing)) [] ptm)
15461546 where
15471547 ai :: Bool -> [(Name, Maybe PTerm)] -> [[T.Text]] -> PTerm -> PTerm
15481548 ai qq env ds (PRef fc fcs f)
@@ -1568,9 +1568,9 @@ addImpl' inpat env infns imp_meths ist ptm
15681568 t' = ai qq env ds t
15691569 r' = ai qq env ds r in
15701570 PDPair fc hls p l' t' r'
1571− ai qq env ds (PAlternative a as)
1571+ ai qq env ds (PAlternative ms a as)
15721572 = let as' = map (ai qq env ds) as in
1573− PAlternative a as'
1573+ PAlternative ms a as'
15741574 ai qq env _ (PDisamb ds' as) = ai qq env ds' as
15751575 ai qq env ds (PApp fc (PInferRef ffc hl f) as)
15761576 = let as' = map (fmap (ai qq env ds)) as in
@@ -1689,7 +1689,7 @@ aiFn inpat expat qq imp_meths ist fc f ffc ds as
16891689 then Right $ PApp fc (PRef ffc [ffc] f) as
16901690 else Right $ mkPApp fc (length as) (PRef ffc [ffc] f) as
16911691 alts -> Right $
1692− PAlternative (ExactlyOne True) $
1692+ PAlternative [] (ExactlyOne True) $
16931693 map (\(f', ns) -> mkPApp fc (length ns) (PRef ffc [ffc] (isImpName f f'))
16941694 (insertImpl ns as)) alts
16951695 where
@@ -1796,9 +1796,9 @@ stripLinear i tm = evalState (sl tm) [] where
17961796 else do put (f : ns)
17971797 return (PPatvar fc f)
17981798 -- Assumption is that variables are all the same in each alternative
1799− sl t@(PAlternative b as) = do ns <- get
1800− as' <- slAlts ns as
1801− return (PAlternative b as')
1799+ sl t@(PAlternative ms b as) = do ns <- get
1800+ as' <- slAlts ns as
1801+ return (PAlternative ms b as')
18021802 where slAlts ns (a : as) = do put ns
18031803 a' <- sl a
18041804 as' <- slAlts ns as
@@ -1849,10 +1849,10 @@ stripUnmatchable i (PApp fc fn args) = PApp fc fn (fmap (fmap su) args) where
18491849 = PApp fc f (fmap (fmap su) args)
18501850 su (PApp fc f args)
18511851 = PHidden (PApp fc f args)
1852− su (PAlternative b alts)
1852+ su (PAlternative ms b alts)
18531853 = let alts' = filter (/= Placeholder) (map su alts) in
18541854 if null alts' then Placeholder
1855− else PAlternative b alts'
1855+ else PAlternative ms b alts'
18561856 su (PPair fc hls p l r) = PPair fc hls p (su l) (su r)
18571857 su (PDPair fc hls p l t r) = PDPair fc hls p (su l) (su t) (su r)
18581858 su t@(PLam fc _ _ _ _) = PHidden t
@@ -1976,10 +1976,10 @@ matchClause' names i x y = checkRpts $ match (fullApp x) (fullApp y) where
19761976 mt <- match' t t'
19771977 mr <- match' r r'
19781978 return (ml ++ mt ++ mr)
1979− match (PAlternative a as) (PAlternative a' as')
1979+ match (PAlternative _ a as) (PAlternative _ a' as')
19801980 = do ms <- zipWithM match' as as'
19811981 return (concat ms)
1982− match a@(PAlternative _ as) b
1982+ match a@(PAlternative _ _ as) b
19831983 = do let ms = zipWith match' as (repeat b)
19841984 case (rights (map toEither ms)) of
19851985 (x: _) -> return x
@@ -2060,7 +2060,7 @@ substMatchShadow n shs tm t = sm shs t where
20602060 sm xs (PTyped x y) = PTyped (sm xs x) (sm xs y)
20612061 sm xs (PPair f hls p x y) = PPair f hls p (sm xs x) (sm xs y)
20622062 sm xs (PDPair f hls p x t y) = PDPair f hls p (sm xs x) (sm xs t) (sm xs y)
2063− sm xs (PAlternative a as) = PAlternative a (map (sm xs) as)
2063+ sm xs (PAlternative ms a as) = PAlternative ms a (map (sm xs) as)
20642064 sm xs (PHidden x) = PHidden (sm xs x)
20652065 sm xs (PUnifyLog x) = PUnifyLog (sm xs x)
20662066 sm xs (PNoImplicits x) = PNoImplicits (sm xs x)
@@ -2087,7 +2087,7 @@ shadow n n' t = sm t where
20872087 sm (PTyped x y) = PTyped (sm x) (sm y)
20882088 sm (PPair f hls p x y) = PPair f hls p (sm x) (sm y)
20892089 sm (PDPair f hls p x t y) = PDPair f hls p (sm x) (sm t) (sm y)
2090− sm (PAlternative a as) = PAlternative a (map sm as)
2090+ sm (PAlternative ms a as) = PAlternative ms a (map sm as)
20912091 sm (PTactics ts) = PTactics (map (fmap sm) ts)
20922092 sm (PProof ts) = PProof (map (fmap sm) ts)
20932093 sm (PHidden x) = PHidden (sm x)
@@ -2097,13 +2097,17 @@ shadow n n' t = sm t where
20972097
20982098-- | Rename any binders which are repeated (so that we don't have to mess
20992099-- about with shadowing anywhere else).
2100−mkUniqueNames :: [Name] -> PTerm -> PTerm
2101−mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
2100+mkUniqueNames :: [Name] -> [(Name, Name)] -> PTerm -> PTerm
2101+mkUniqueNames env shadows tm
2102+ = evalState (mkUniq initMap tm) (S.fromList env) where
2103+
2104+ initMap = M.fromList shadows
2105+
21022106 inScope :: S.Set Name
21032107 inScope = S.fromList $ boundNamesIn tm
21042108
2105− mkUniqA arg = do t' <- mkUniq (getTm arg)
2106− return (arg { getTm = t' })
2109+ mkUniqA nmap arg = do t' <- mkUniq nmap (getTm arg)
2110+ return (arg { getTm = t' })
21072111
21082112 -- Initialise the unique name with the environment length (so we're not
21092113 -- looking for too long...)
@@ -2113,84 +2117,94 @@ mkUniqueNames env tm = evalState (mkUniq tm) (S.fromList env) where
21132117
21142118 -- FIXME: Probably ought to do this for completeness! It's fine as
21152119 -- long as there are no bindings inside tactics though.
2116− mkUniqT tac = return tac
2120+ mkUniqT nmap tac = return tac
21172121
2118− mkUniq :: PTerm -> State (S.Set Name) PTerm
2119− mkUniq (PLam fc n nfc ty sc)
2122+ mkUniq :: M.Map Name Name -> PTerm -> State (S.Set Name) PTerm
2123+ mkUniq nmap (PLam fc n nfc ty sc)
21202124 = do env <- get
21212125 (n', sc') <-
21222126 if n `S.member` env
21232127 then do let n' = uniqueNameSet (initN n (S.size env))
21242128 (S.union env inScope)
2125− return (n', shadow n n' sc)
2129+ return (n', sc) -- shadow n n' sc)
21262130 else return (n, sc)
21272131 put (S.insert n' env)
2128− ty' <- mkUniq ty
2129− sc'' <- mkUniq sc'
2132+ let nmap' = M.insert n n' nmap
2133+ ty' <- mkUniq nmap ty
2134+ sc'' <- mkUniq nmap' sc'
21302135 return $! PLam fc n' nfc ty' sc''
2131− mkUniq (PPi p n fc ty sc)
2136+ mkUniq nmap (PPi p n fc ty sc)
21322137 = do env <- get
21332138 (n', sc') <-
21342139 if n `S.member` env
21352140 then do let n' = uniqueNameSet (initN n (S.size env))
21362141 (S.union env inScope)
2137− return (n', shadow n n' sc)
2142+ return (n', sc) -- shadow n n' sc)
21382143 else return (n, sc)
21392144 put (S.insert n' env)
2140− ty' <- mkUniq ty
2141− sc'' <- mkUniq sc'
2145+ let nmap' = M.insert n n' nmap
2146+ ty' <- mkUniq nmap ty
2147+ sc'' <- mkUniq nmap' sc'
21422148 return $! PPi p n' fc ty' sc''
2143− mkUniq (PLet fc n nfc ty val sc)
2149+ mkUniq nmap (PLet fc n nfc ty val sc)
21442150 = do env <- get
21452151 (n', sc') <-
21462152 if n `S.member` env
21472153 then do let n' = uniqueNameSet (initN n (S.size env))
21482154 (S.union env inScope)
2149− return (n', shadow n n' sc)
2155+ return (n', sc) -- shadow n n' sc)
21502156 else return (n, sc)
21512157 put (S.insert n' env)
2152− ty' <- mkUniq ty; val' <- mkUniq val
2153− sc'' <- mkUniq sc'
2158+ let nmap' = M.insert n n' nmap
2159+ ty' <- mkUniq nmap ty; val' <- mkUniq nmap val
2160+ sc'' <- mkUniq nmap' sc'
21542161 return $! PLet fc n' nfc ty' val' sc''
2155− mkUniq (PApp fc t args)
2156− = do t' <- mkUniq t
2157− args' <- mapM mkUniqA args
2162+ mkUniq nmap (PApp fc t args)
2163+ = do t' <- mkUniq nmap t
2164+ args' <- mapM (mkUniqA nmap) args
21582165 return $! PApp fc t' args'
2159− mkUniq (PAppBind fc t args)
2160− = do t' <- mkUniq t
2161− args' <- mapM mkUniqA args
2166+ mkUniq nmap (PAppBind fc t args)
2167+ = do t' <- mkUniq nmap t
2168+ args' <- mapM (mkUniqA nmap) args
21622169 return $! PAppBind fc t' args'
2163− mkUniq (PCase fc t alts)
2164− = do t' <- mkUniq t
2165− alts' <- mapM (\(x,y)-> do x' <- mkUniq x; y' <- mkUniq y
2170+ mkUniq nmap (PCase fc t alts)
2171+ = do t' <- mkUniq nmap t
2172+ alts' <- mapM (\(x,y)-> do x' <- mkUniq nmap x; y' <- mkUniq nmap y
21662173 return (x', y')) alts
21672174 return $! PCase fc t' alts'
2168− mkUniq (PIfThenElse fc c t f)
2169− = liftM3 (PIfThenElse fc) (mkUniq c) (mkUniq t) (mkUniq f)
2170− mkUniq (PPair fc hls p l r)
2171− = do l' <- mkUniq l; r' <- mkUniq r
2175+ mkUniq nmap (PIfThenElse fc c t f)
2176+ = liftM3 (PIfThenElse fc) (mkUniq nmap c) (mkUniq nmap t) (mkUniq nmap f)
2177+ mkUniq nmap (PPair fc hls p l r)
2178+ = do l' <- mkUniq nmap l; r' <- mkUniq nmap r
21722179 return $! PPair fc hls p l' r'
2173− mkUniq (PDPair fc hls p (PRef fc' hls' n) t sc)
2180+ mkUniq nmap (PDPair fc hls p (PRef fc' hls' n) t sc)
21742181 | t /= Placeholder
21752182 = do env <- get
21762183 (n', sc') <- if n `S.member` env
21772184 then do let n' = uniqueNameSet n (S.union env inScope)
2178− return (n', shadow n n' sc)
2185+ return (n', sc) -- shadow n n' sc)
21792186 else return (n, sc)
21802187 put (S.insert n' env)
2181− t' <- mkUniq t
2182− sc'' <- mkUniq sc'
2188+ let nmap' = M.insert n n' nmap
2189+ t' <- mkUniq nmap t
2190+ sc'' <- mkUniq nmap' sc'
21832191 return $! PDPair fc hls p (PRef fc' hls' n') t' sc''
2184− mkUniq (PDPair fc hls p l t r)
2185− = do l' <- mkUniq l; t' <- mkUniq t; r' <- mkUniq r
2192+ mkUniq nmap (PDPair fc hls p l t r)
2193+ = do l' <- mkUniq nmap l; t' <- mkUniq nmap t; r' <- mkUniq nmap r
21862194 return $! PDPair fc hls p l' t' r'
2187− mkUniq (PAlternative b as)
2188− = liftM (PAlternative b) (mapM mkUniq as)
2189− mkUniq (PHidden t) = liftM PHidden (mkUniq t)
2190− mkUniq (PUnifyLog t) = liftM PUnifyLog (mkUniq t)
2191− mkUniq (PDisamb n t) = liftM (PDisamb n) (mkUniq t)
2192− mkUniq (PNoImplicits t) = liftM PNoImplicits (mkUniq t)
2193− mkUniq (PProof ts) = liftM PProof (mapM mkUniqT ts)
2194− mkUniq (PTactics ts) = liftM PTactics (mapM mkUniqT ts)
2195− mkUniq (PRunElab fc ts ns) = liftM (\tm -> PRunElab fc tm ns) (mkUniq ts)
2196− mkUniq t = return t
2195+ mkUniq nmap (PAlternative ns b as)
2196+ -- store the nmap and defer the rest until we've pruned the set
2197+ -- during elaboration
2198+ = return $ PAlternative (M.toList nmap ++ ns) b as
2199+ mkUniq nmap (PHidden t) = liftM PHidden (mkUniq nmap t)
2200+ mkUniq nmap (PUnifyLog t) = liftM PUnifyLog (mkUniq nmap t)
2201+ mkUniq nmap (PDisamb n t) = liftM (PDisamb n) (mkUniq nmap t)
2202+ mkUniq nmap (PNoImplicits t) = liftM PNoImplicits (mkUniq nmap t)
2203+ mkUniq nmap (PProof ts) = liftM PProof (mapM (mkUniqT nmap) ts)
2204+ mkUniq nmap (PTactics ts) = liftM PTactics (mapM (mkUniqT nmap) ts)
2205+ mkUniq nmap (PRunElab fc ts ns) = liftM (\tm -> PRunElab fc tm ns) (mkUniq nmap ts)
2206+ mkUniq nmap t = return (shadowAll (M.toList nmap) t)
2207+ where
2208+ shadowAll [] t = t
2209+ shadowAll ((n, n') : ns) t = shadow n n' (shadowAll ns t)
2210+