@@ -178,6 +178,7 @@ data PTerm = PQuote Raw
178178 | PTrue FC
179179 | PFalse FC
180180 | PPair FC PTerm PTerm
181+ | PDPair FC PTerm PTerm
181182 | PHidden PTerm -- irrelevant or hidden pattern
182183 | PSet
183184 | PConstant Const
@@ -302,6 +303,7 @@ showImp impl tm = se 10 tm where
302303 se p (PTrue _) = "()"
303304 se p (PFalse _) = "_|_"
304305 se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
306+ se p (PDPair _ l r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"
305307 se p PSet = "Set"
306308 se p (PConstant c) = show c
307309 se p (PMetavar n) = "?" ++ show n
@@ -323,6 +325,7 @@ allNamesIn tm = nub $ ni [] tm
323325 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
324326 ni env (PHidden tm) = ni env tm
325327 ni env (PPair _ l r) = ni env l ++ ni env r
328+ ni env (PDPair _ l r) = ni env l ++ ni env r
326329 ni env _ = []
327330
328331namesIn :: IState -> PTerm -> [Name]
@@ -337,6 +340,7 @@ namesIn ist tm = nub $ ni [] tm
337340 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
338341 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
339342 ni env (PPair _ l r) = ni env l ++ ni env r
343+ ni env (PDPair _ l r) = ni env l ++ ni env r
340344 ni env (PHidden tm) = ni env tm
341345 ni env _ = []
342346
@@ -374,8 +378,8 @@ unitDecl = PDatadecl unitTy PSet
374378falseTy = MN 0 "__False"
375379falseDecl = PDatadecl falseTy PSet []
376380
377−pairTy = UN ["Pair"] -- MN 0 "__Pair"
378−pairCon = UN ["MkPair"] -- MN 0 "__MkPair"
381+pairTy = MN 0 "__Pair"
382+pairCon = MN 0 "__MkPair"
379383pairDecl = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)
380384 [(pairCon, PPi Imp (n "A") PSet (
381385 PPi Imp (n "B") PSet (
@@ -385,6 +389,10 @@ pairDecl = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)
385389 PExp (PRef bi (n "B"))])))), bi)]
386390 where n a = MN 0 a
387391
392+-- Defined in builtins.idr
393+sigmaTy = UN ["Sigma"]
394+existsCon = UN ["Exists"]
395+
388396piBind :: [(Name, PTerm)] -> PTerm -> PTerm
389397piBind [] t = t
390398piBind ((n, ty):ns) t = PPi Exp n ty (piBind ns t)
@@ -422,7 +430,16 @@ implicitise syn ist tm
422430 imps True (n:env) sc
423431 imps top env (PPair _ l r)
424432 = do (decls, ns) <- get
425− put (decls, nub (ns ++ namesIn ist l ++ namesIn ist r))
433+ let isn = namesIn ist l ++ namesIn ist r
434+ put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))
435+ imps top env (PDPair _ (PRef _ n) r)
436+ = do (decls, ns) <- get
437+ let isn = namesIn ist r \\ [n]
438+ put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))
439+ imps top env (PDPair _ l r)
440+ = do (decls, ns) <- get
441+ let isn = namesIn ist l ++ namesIn ist r
442+ put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))
426443 imps top env (PLam n ty sc)
427444 = do imps False env ty
428445 imps False (n:env) sc
@@ -443,6 +460,9 @@ addImpl ist ptm = ai [] ptm
443460 ai env (PPair fc l r) = let l' = ai env l
444461 r' = ai env r in
445462 PPair fc l' r'
463+ ai env (PDPair fc l r) = let l' = ai env l
464+ r' = ai env r in
465+ PDPair fc l' r'
446466 ai env (PApp fc (PRef _ f) as)
447467 = let as' = map (fmap (ai env)) as in
448468 aiFn fc env (PRef fc f) as'