53
55
-- | Doesn't go inside metas.
55
freeVars :: a -> FreeVars
57
freeVars' :: FreeConf -> a -> FreeVars
59
data FreeConf = FreeConf
60
{ fcIgnoreSorts :: Bool
61
-- ^ Ignore free variables in sorts.
64
freeVars :: Free a => a -> FreeVars
65
freeVars = freeVars' FreeConf{ fcIgnoreSorts = False }
57
67
instance Free Term where
58
freeVars t = case t of
59
Var n ts -> singleton n `union` freeVars ts
68
freeVars' conf t = case t of
69
Var n ts -> singleton n `union` freeVars' conf ts
70
Lam _ t -> freeVars' conf t
62
Def _ ts -> freeVars ts
63
Con _ ts -> freeVars ts
64
Pi a b -> freeVars (a,b)
65
Fun a b -> freeVars (a,b)
67
MetaV _ ts -> flexible $ freeVars ts
72
Def _ ts -> freeVars' conf ts
73
Con _ ts -> freeVars' conf ts
74
Pi a b -> freeVars' conf (a,b)
75
Fun a b -> freeVars' conf (a,b)
76
Sort s -> freeVars' conf s
77
MetaV _ ts -> flexible $ freeVars' conf ts
69
79
instance Free Type where
70
freeVars (El _ t) = freeVars t
80
freeVars' conf (El s t) = freeVars' conf (s, t)
82
instance Free Sort where
84
| fcIgnoreSorts conf = empty
85
| otherwise = case s of
86
Type a -> freeVars' conf a
87
Suc s -> freeVars' conf s
88
Lub s1 s2 -> freeVars' conf (s1, s2)
91
MetaS _ ts -> flexible $ freeVars' conf ts
92
DLub s1 s2 -> freeVars' conf (s1, s2)
72
94
instance Free a => Free [a] where
73
freeVars xs = unions $ map freeVars xs
95
freeVars' conf xs = unions $ map (freeVars' conf) xs
75
97
instance (Free a, Free b) => Free (a,b) where
76
freeVars (x,y) = freeVars x `union` freeVars y
98
freeVars' conf (x,y) = freeVars' conf x `union` freeVars' conf y
78
100
instance Free a => Free (Arg a) where
79
freeVars = freeVars . unArg
101
freeVars' conf = freeVars' conf . unArg
81
103
instance Free a => Free (Abs a) where
82
freeVars (Abs _ b) = mapFV (subtract 1) $ delete 0 $ freeVars b
104
freeVars' conf (Abs _ b) = mapFV (subtract 1) $ delete 0 $ freeVars' conf b
84
106
instance Free Telescope where
85
freeVars EmptyTel = empty
86
freeVars (ExtendTel a tel) = freeVars (a, tel)
107
freeVars' conf EmptyTel = empty
108
freeVars' conf (ExtendTel a tel) = freeVars' conf (a, tel)
88
110
instance Free ClauseBody where
89
freeVars (Body t) = freeVars t
90
freeVars (Bind b) = freeVars b
91
freeVars (NoBind b) = freeVars b
92
freeVars NoBody = empty
111
freeVars' conf (Body t) = freeVars' conf t
112
freeVars' conf (Bind b) = freeVars' conf b
113
freeVars' conf (NoBind b) = freeVars' conf b
114
freeVars' conf NoBody = empty
94
116
freeIn :: Free a => Nat -> a -> Bool
95
117
freeIn v t = v `Set.member` allVars (freeVars t)
119
freeInIgnoringSorts :: Free a => Nat -> a -> Bool
120
freeInIgnoringSorts v t =
121
v `Set.member` allVars (freeVars' FreeConf{ fcIgnoreSorts = True } t)