@@ -28,7 +28,7 @@ import qualified Control.Monad.Trans.Class as Trans (lift)
2828
2929import Data.Data (Data)
3030import Data.Function (on)
31−import Data.Generics.Uniplate.Data (universe)
31+import Data.Generics.Uniplate.Data (universe, children)
3232import Data.List hiding (group)
3333import Data.Char
3434import qualified Data.Map.Strict as M
@@ -2177,160 +2177,183 @@ getPArity _ = 0
21772177-- Return all names, free or globally bound, in the given term.
21782178
21792179allNamesIn :: PTerm -> [Name]
2180−allNamesIn tm = nub $ ni [] tm
2180+allNamesIn tm = nub $ ni 0 [] tm
21812181 where -- TODO THINK added niTacImp, but is it right?
2182− ni env (PRef _ _ n)
2182+ ni 0 env (PRef _ _ n)
21832183 | not (n `elem` env) = [n]
2184− ni env (PPatvar _ n) = [n]
2185− ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2186− ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2187− ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
2188− ni env (PIfThenElse _ c t f) = ni env c ++ ni env t ++ ni env f
2189− ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc
2190− ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
2191− ni env (PLet _ n _ ty val sc) = ni env ty ++ ni env val ++ ni (n:env) sc
2192− ni env (PHidden tm) = ni env tm
2193− ni env (PRewrite _ l r _) = ni env l ++ ni env r
2194− ni env (PTyped l r) = ni env l ++ ni env r
2195− ni env (PPair _ _ _ l r) = ni env l ++ ni env r
2196− ni env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni env r
2197− ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r
2198− ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r
2199− ni env (PAlternative ns a ls) = concatMap (ni env) ls
2200− ni env (PUnifyLog tm) = ni env tm
2201− ni env (PDisamb _ tm) = ni env tm
2202− ni env (PNoImplicits tm) = ni env tm
2203− ni env _ = []
2204−
2205− niTacImp env (TacImp _ _ scr) = ni env scr
2206− niTacImp _ _ = []
2184+ ni 0 env (PPatvar _ n) = [n]
2185+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2186+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2187+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)
2188+ ni 0 env (PIfThenElse _ c t f) = ni 0 env c ++ ni 0 env t ++ ni 0 env f
2189+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
2190+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
2191+ ni 0 env (PLet _ n _ ty val sc) = ni 0 env ty ++ ni 0 env val ++ ni 0 (n:env) sc
2192+ ni 0 env (PHidden tm) = ni 0 env tm
2193+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2194+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
2195+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
2196+ ni 0 env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni 0 env r
2197+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r
2198+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r
2199+ ni 0 env (PAlternative ns a ls) = concatMap (ni 0 env) ls
2200+ ni 0 env (PUnifyLog tm) = ni 0 env tm
2201+ ni 0 env (PDisamb _ tm) = ni 0 env tm
2202+ ni 0 env (PNoImplicits tm) = ni 0 env tm
2203+
2204+ ni i env (PQuasiquote tm ty) = ni (i+1) env tm ++ maybe [] (ni i env) ty
2205+ ni i env (PUnquote tm) = ni (i - 1) env tm
2206+
2207+ ni i env tm = concatMap (ni i env) (children tm)
2208+
2209+ niTacImp i env (TacImp _ _ scr) = ni i env scr
2210+ niTacImp _ _ _ = []
22072211
22082212
22092213-- Return all names defined in binders in the given term
22102214boundNamesIn :: PTerm -> [Name]
2211−boundNamesIn tm = S.toList (ni S.empty tm)
2215+boundNamesIn tm = S.toList (ni 0 S.empty tm)
22122216 where -- TODO THINK Added niTacImp, but is it right?
2213− ni set (PApp _ f as) = niTms (ni set f) (map getTm as)
2214− ni set (PAppBind _ f as) = niTms (ni set f) (map getTm as)
2215− ni set (PCase _ c os) = niTms (ni set c) (map snd os)
2216− ni set (PIfThenElse _ c t f) = niTms set [c, t, f]
2217− ni set (PLam fc n _ ty sc) = S.insert n $ ni (ni set ty) sc
2218− ni set (PLet fc n nfc ty val sc) = S.insert n $ ni (ni (ni set ty) val) sc
2219− ni set (PPi p n _ ty sc) = niTacImp (S.insert n $ ni (ni set ty) sc) p
2220− ni set (PRewrite _ l r _) = ni (ni set l) r
2221− ni set (PTyped l r) = ni (ni set l) r
2222− ni set (PPair _ _ _ l r) = ni (ni set l) r
2223− ni set (PDPair _ _ _ (PRef _ _ n) t r) = ni (ni set t) r
2224− ni set (PDPair _ _ _ l t r) = ni (ni (ni set l) t) r
2225− ni set (PAlternative ns a as) = niTms set as
2226− ni set (PHidden tm) = ni set tm
2227− ni set (PUnifyLog tm) = ni set tm
2228− ni set (PDisamb _ tm) = ni set tm
2229− ni set (PNoImplicits tm) = ni set tm
2230− ni set _ = set
2231−
2232− niTms set [] = set
2233− niTms set (x : xs) = niTms (ni set x) xs
2234−
2235− niTacImp set (TacImp _ _ scr) = ni set scr
2236− niTacImp set _ = set
2217+ ni :: Int -> S.Set Name -> PTerm -> S.Set Name
2218+ ni 0 set (PApp _ f as) = niTms 0 (ni 0 set f) (map getTm as)
2219+ ni 0 set (PAppBind _ f as) = niTms 0 (ni 0 set f) (map getTm as)
2220+ ni 0 set (PCase _ c os) = niTms 0 (ni 0 set c) (map snd os)
2221+ ni 0 set (PIfThenElse _ c t f) = niTms 0 set [c, t, f]
2222+ ni 0 set (PLam fc n _ ty sc) = S.insert n $ ni 0 (ni 0 set ty) sc
2223+ ni 0 set (PLet fc n nfc ty val sc) = S.insert n $ ni 0 (ni 0 (ni 0 set ty) val) sc
2224+ ni 0 set (PPi p n _ ty sc) = niTacImp 0 (S.insert n $ ni 0 (ni 0 set ty) sc) p
2225+ ni 0 set (PRewrite _ l r _) = ni 0 (ni 0 set l) r
2226+ ni 0 set (PTyped l r) = ni 0 (ni 0 set l) r
2227+ ni 0 set (PPair _ _ _ l r) = ni 0 (ni 0 set l) r
2228+ ni 0 set (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 (ni 0 set t) r
2229+ ni 0 set (PDPair _ _ _ l t r) = ni 0 (ni 0 (ni 0 set l) t) r
2230+ ni 0 set (PAlternative ns a as) = niTms 0 set as
2231+ ni 0 set (PHidden tm) = ni 0 set tm
2232+ ni 0 set (PUnifyLog tm) = ni 0 set tm
2233+ ni 0 set (PDisamb _ tm) = ni 0 set tm
2234+ ni 0 set (PNoImplicits tm) = ni 0 set tm
2235+
2236+ ni i set (PQuasiquote tm ty) = ni (i + 1) set tm `S.union` maybe S.empty (ni i set) ty
2237+ ni i set (PUnquote tm) = ni (i - 1) set tm
2238+
2239+ ni i set tm = foldr S.union set (map (ni i set) (children tm))
2240+
2241+ niTms :: Int -> S.Set Name -> [PTerm] -> S.Set Name
2242+ niTms i set [] = set
2243+ niTms i set (x : xs) = niTms i (ni i set x) xs
2244+
2245+ niTacImp i set (TacImp _ _ scr) = ni i set scr
2246+ niTacImp i set _ = set
22372247
22382248-- Return names which are valid implicits in the given term (type).
22392249implicitNamesIn :: [Name] -> IState -> PTerm -> [Name]
2240−implicitNamesIn uvars ist tm = nub $ ni [] tm
2250+implicitNamesIn uvars ist tm = nub $ ni 0 [] tm
22412251 where
2242− ni env (PRef _ _ n)
2252+ ni 0 env (PRef _ _ n)
22432253 | not (n `elem` env)
22442254 = case lookupTy n (tt_ctxt ist) of
22452255 [] -> [n]
22462256 _ -> if n `elem` uvars then [n] else []
2247− ni env (PApp _ f@(PRef _ _ n) as)
2248− | n `elem` uvars = ni env f ++ concatMap (ni env) (map getTm as)
2249− | otherwise = concatMap (ni env) (map getTm as)
2250− ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2251− ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2252− ni env (PCase _ c os) = ni env c ++
2257+ ni 0 env (PApp _ f@(PRef _ _ n) as)
2258+ | n `elem` uvars = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2259+ | otherwise = concatMap (ni 0 env) (map getTm as)
2260+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2261+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2262+ ni 0 env (PCase _ c os) = ni 0 env c ++
22532263 -- names in 'os', not counting the names bound in the cases
2254− (nub (concatMap (ni env) (map snd os))
2255− \\ nub (concatMap (ni env) (map fst os)))
2256− ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]
2257− ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc
2258− ni env (PPi p n _ ty sc) = ni env ty ++ ni (n:env) sc
2259− ni env (PRewrite _ l r _) = ni env l ++ ni env r
2260− ni env (PTyped l r) = ni env l ++ ni env r
2261− ni env (PPair _ _ _ l r) = ni env l ++ ni env r
2262− ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r
2263− ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r
2264− ni env (PAlternative ns a as) = concatMap (ni env) as
2265− ni env (PHidden tm) = ni env tm
2266− ni env (PUnifyLog tm) = ni env tm
2267− ni env (PDisamb _ tm) = ni env tm
2268− ni env (PNoImplicits tm) = ni env tm
2269− ni env _ = []
2264+ (nub (concatMap (ni 0 env) (map snd os))
2265+ \\ nub (concatMap (ni 0 env) (map fst os)))
2266+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]
2267+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
2268+ ni 0 env (PPi p n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
2269+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2270+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
2271+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
2272+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r
2273+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r
2274+ ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as
2275+ ni 0 env (PHidden tm) = ni 0 env tm
2276+ ni 0 env (PUnifyLog tm) = ni 0 env tm
2277+ ni 0 env (PDisamb _ tm) = ni 0 env tm
2278+ ni 0 env (PNoImplicits tm) = ni 0 env tm
2279+
2280+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++
2281+ maybe [] (ni i env) ty
2282+ ni i env (PUnquote tm) = ni (i - 1) env tm
2283+
2284+ ni i env tm = concatMap (ni i env) (children tm)
22702285
22712286-- Return names which are free in the given term.
22722287namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]
2273−namesIn uvars ist tm = nub $ ni [] tm
2288+namesIn uvars ist tm = nub $ ni 0 [] tm
22742289 where
2275− ni env (PRef _ _ n)
2290+ ni 0 env (PRef _ _ n)
22762291 | not (n `elem` env)
22772292 = case lookupTy n (tt_ctxt ist) of
22782293 [] -> [n]
22792294 _ -> if n `elem` (map fst uvars) then [n] else []
2280− ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2281− ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2282− ni env (PCase _ c os) = ni env c ++
2295+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2296+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2297+ ni 0 env (PCase _ c os) = ni 0 env c ++
22832298 -- names in 'os', not counting the names bound in the cases
2284− (nub (concatMap (ni env) (map snd os))
2285− \\ nub (concatMap (ni env) (map fst os)))
2286− ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]
2287− ni env (PLam fc n nfc ty sc) = ni env ty ++ ni (n:env) sc
2288− ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
2289− ni env (PRewrite _ l r _) = ni env l ++ ni env r
2290− ni env (PTyped l r) = ni env l ++ ni env r
2291− ni env (PPair _ _ _ l r) = ni env l ++ ni env r
2292− ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r
2293− ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r
2294− ni env (PAlternative ns a as) = concatMap (ni env) as
2295− ni env (PHidden tm) = ni env tm
2296− ni env (PUnifyLog tm) = ni env tm
2297− ni env (PDisamb _ tm) = ni env tm
2298− ni env (PNoImplicits tm) = ni env tm
2299− ni env _ = []
2300−
2301− niTacImp env (TacImp _ _ scr) = ni env scr
2302− niTacImp _ _ = []
2299+ (nub (concatMap (ni 0 env) (map snd os))
2300+ \\ nub (concatMap (ni 0 env) (map fst os)))
2301+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]
2302+ ni 0 env (PLam fc n nfc ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
2303+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
2304+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2305+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
2306+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
2307+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r
2308+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r
2309+ ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as
2310+ ni 0 env (PHidden tm) = ni 0 env tm
2311+ ni 0 env (PUnifyLog tm) = ni 0 env tm
2312+ ni 0 env (PDisamb _ tm) = ni 0 env tm
2313+ ni 0 env (PNoImplicits tm) = ni 0 env tm
2314+
2315+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty
2316+ ni i env (PUnquote tm) = ni (i - 1) env tm
2317+
2318+ ni i env tm = concatMap (ni i env) (children tm)
2319+
2320+ niTacImp i env (TacImp _ _ scr) = ni i env scr
2321+ niTacImp _ _ _ = []
23032322
23042323-- Return which of the given names are used in the given term.
23052324
23062325usedNamesIn :: [Name] -> IState -> PTerm -> [Name]
2307−usedNamesIn vars ist tm = nub $ ni [] tm
2326+usedNamesIn vars ist tm = nub $ ni 0 [] tm
23082327 where -- TODO THINK added niTacImp, but is it right?
2309− ni env (PRef _ _ n)
2328+ ni 0 env (PRef _ _ n)
23102329 | n `elem` vars && not (n `elem` env)
23112330 = case lookupDefExact n (tt_ctxt ist) of
23122331 Nothing -> [n]
23132332 _ -> []
2314− ni env (PApp _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2315− ni env (PAppBind _ f as) = ni env f ++ concatMap (ni env) (map getTm as)
2316− ni env (PCase _ c os) = ni env c ++ concatMap (ni env) (map snd os)
2317− ni env (PIfThenElse _ c t f) = concatMap (ni env) [c, t, f]
2318− ni env (PLam fc n _ ty sc) = ni env ty ++ ni (n:env) sc
2319− ni env (PPi p n _ ty sc) = niTacImp env p ++ ni env ty ++ ni (n:env) sc
2320− ni env (PRewrite _ l r _) = ni env l ++ ni env r
2321− ni env (PTyped l r) = ni env l ++ ni env r
2322− ni env (PPair _ _ _ l r) = ni env l ++ ni env r
2323− ni env (PDPair _ _ _ (PRef _ _ n) t r) = ni env t ++ ni (n:env) r
2324− ni env (PDPair _ _ _ l t r) = ni env l ++ ni env t ++ ni env r
2325− ni env (PAlternative ns a as) = concatMap (ni env) as
2326− ni env (PHidden tm) = ni env tm
2327− ni env (PUnifyLog tm) = ni env tm
2328− ni env (PDisamb _ tm) = ni env tm
2329− ni env (PNoImplicits tm) = ni env tm
2330− ni env _ = []
2331−
2332− niTacImp env (TacImp _ _ scr) = ni env scr
2333− niTacImp _ _ = []
2333+ ni 0 env (PApp _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2334+ ni 0 env (PAppBind _ f as) = ni 0 env f ++ concatMap (ni 0 env) (map getTm as)
2335+ ni 0 env (PCase _ c os) = ni 0 env c ++ concatMap (ni 0 env) (map snd os)
2336+ ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]
2337+ ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
2338+ ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
2339+ ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2340+ ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
2341+ ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
2342+ ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r
2343+ ni 0 env (PDPair _ _ _ l t r) = ni 0 env l ++ ni 0 env t ++ ni 0 env r
2344+ ni 0 env (PAlternative ns a as) = concatMap (ni 0 env) as
2345+ ni 0 env (PHidden tm) = ni 0 env tm
2346+ ni 0 env (PUnifyLog tm) = ni 0 env tm
2347+ ni 0 env (PDisamb _ tm) = ni 0 env tm
2348+ ni 0 env (PNoImplicits tm) = ni 0 env tm
2349+
2350+ ni i env (PQuasiquote tm ty) = ni (i + 1) env tm ++ maybe [] (ni i env) ty
2351+ ni i env (PUnquote tm) = ni (i - 1) env tm
2352+
2353+ ni i env tm = concatMap (ni i env) (children tm)
2354+
2355+ niTacImp i env (TacImp _ _ scr) = ni i env scr
2356+ niTacImp _ _ _ = []
23342357
23352358-- Return the list of inaccessible (= dotted) positions for a name.
23362359getErasureInfo :: IState -> Name -> [Int]