@@ -93,10 +93,79 @@ data PTerm = PQuote Raw
9393 | Placeholder
9494 deriving Show
9595
96+namesIn :: IState -> PTerm -> [Name]
97+namesIn ist tm = nub $ ni [] tm
98+ where
99+ ni env (PRef n)
100+ | not (n `elem` env)
101+ = case lookupCtxt n (idris_implicits ist) of
102+ Nothing -> [n]
103+ _ -> []
104+ ni env (PApp f is es) = ni env f ++ concatMap (ni env) (map snd is) ++
105+ concatMap (ni env) es
106+ ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
107+ ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
108+ ni env (PHidden tm) = ni env tm
109+ ni env _ = []
110+
96111-- Dealing with implicit arguments
97112
113+-- Add implicit Pi bindings for any names in the term which appear in an
114+-- argument position.
115+
98116implicitise :: IState -> PTerm -> (PTerm, [Name])
99−implicitise ist tm = (tm, [])
117+implicitise ist tm
118+ = let (declimps, ns) = execState (imps [] tm) ([], []) in
119+ (pibind ns tm, ns ++ reverse declimps)
120+ where
121+ imps env (PApp f is es)
122+ = do (decls, ns) <- get
123+ let isn = concatMap (namesIn ist) (map snd is)
124+ let esn = concatMap (namesIn ist) es
125+ put (decls, nub (ns ++ ((isn ++ esn) \\ env)))
126+ imps env (PPi Imp n ty sc)
127+ = do imps env ty
128+ (decls, ns) <- get
129+ put (n:decls, ns)
130+ imps (n:env) sc
131+ imps env (PPi Exp n ty sc)
132+ = do imps env ty
133+ imps (n:env) sc
134+ imps env (PLam n ty sc)
135+ = do imps env ty
136+ imps (n:env) sc
137+ imps env (PHidden tm) = imps env tm
138+ imps env _ = return ()
139+
140+ pibind [] sc = sc
141+ pibind (n:ns) sc = PPi Imp n Placeholder (pibind ns sc)
100142
101143addImpl :: IState -> PTerm -> PTerm
102−addImpl ist ptm = ptm
144+addImpl ist ptm = ai [] ptm
145+ where
146+ ai env (PApp f is es) = let f' = ai env f
147+ is' = map (\ (n, tm) -> (n, ai env tm)) is
148+ es' = map (ai env) es in
149+ aiFn env f is' es'
150+ ai env (PLam n ty sc) = let ty' = ai env ty
151+ sc' = ai (n:env) sc in
152+ PLam n ty' sc'
153+ ai env (PPi p n ty sc) = let ty' = ai env ty
154+ sc' = ai (n:env) sc in
155+ PPi p n ty' sc'
156+ ai env (PHidden tm) = PHidden (ai env tm)
157+ ai env tm = tm
158+
159+ aiFn env (PRef f) is es | not (f `elem` env)
160+ = case lookupCtxt f (idris_implicits ist) of
161+ Just ns -> PApp (PRef f) (insertImpl ns is) es
162+ Nothing -> PApp (PRef f) is es
163+ aiFn env f is es = PApp f is es
164+
165+ insertImpl [] given = []
166+ insertImpl (n:ns) given
167+ = case lookup n given of
168+ Just val -> (n, val) : insertImpl ns given
169+ Nothing -> (n, Placeholder) : insertImpl ns given
170+
171+