@@ -178,6 +178,7 @@ data PTerm = PQuote Raw
178 | PTrue FC
178 | PTrue FC
179 | PFalse FC
179 | PFalse FC
180 | PPair FC PTerm PTerm
180 | PPair FC PTerm PTerm
181+ | PDPair FC PTerm PTerm
181 | PHidden PTerm -- irrelevant or hidden pattern
182 | PHidden PTerm -- irrelevant or hidden pattern
183 | PConstant Const
184 | PConstant Const
@@ -302,6 +303,7 @@ showImp impl tm = se 10 tm where
302 se p (PTrue _) = "()"
303 se p (PTrue _) = "()"
303 se p (PFalse _) = "_|_"
304 se p (PFalse _) = "_|_"
304 se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
305 se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
306+ se p (PDPair _ l r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"
305 se p PSet = "Set"
307 se p PSet = "Set"
306 se p (PConstant c) = show c
308 se p (PConstant c) = show c
307 se p (PMetavar n) = "?" ++ show n
309 se p (PMetavar n) = "?" ++ show n
@@ -323,6 +325,7 @@ allNamesIn tm = nub $ ni [] tm
323 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
325 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
324 ni env (PHidden tm) = ni env tm
326 ni env (PHidden tm) = ni env tm
325 ni env (PPair _ l r) = ni env l ++ ni env r
327 ni env (PPair _ l r) = ni env l ++ ni env r
328+ ni env (PDPair _ l r) = ni env l ++ ni env r
326 ni env _ = []
329 ni env _ = []
328namesIn :: IState -> PTerm -> [Name]
331namesIn :: IState -> PTerm -> [Name]
@@ -337,6 +340,7 @@ namesIn ist tm = nub $ ni [] tm
337 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
340 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
338 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
341 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
339 ni env (PPair _ l r) = ni env l ++ ni env r
342 ni env (PPair _ l r) = ni env l ++ ni env r
343+ ni env (PDPair _ l r) = ni env l ++ ni env r
340 ni env (PHidden tm) = ni env tm
344 ni env (PHidden tm) = ni env tm
341 ni env _ = []
345 ni env _ = []
@@ -374,8 +378,8 @@ unitDecl = PDatadecl unitTy PSet
374falseTy = MN 0 "__False"
378falseTy = MN 0 "__False"
375falseDecl = PDatadecl falseTy PSet []
379falseDecl = PDatadecl falseTy PSet []
377−pairTy = UN ["Pair"] -- MN 0 "__Pair"
381+pairTy = MN 0 "__Pair"
378−pairCon = UN ["MkPair"] -- MN 0 "__MkPair"
382+pairCon = MN 0 "__MkPair"
379pairDecl = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)
383pairDecl = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)
380 [(pairCon, PPi Imp (n "A") PSet (
384 [(pairCon, PPi Imp (n "A") PSet (
381 PPi Imp (n "B") PSet (
385 PPi Imp (n "B") PSet (
@@ -385,6 +389,10 @@ pairDecl = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)
385 PExp (PRef bi (n "B"))])))), bi)]
389 PExp (PRef bi (n "B"))])))), bi)]
386 where n a = MN 0 a
390 where n a = MN 0 a
392+-- Defined in builtins.idr
393+sigmaTy = UN ["Sigma"]
394+existsCon = UN ["Exists"]
388piBind :: [(Name, PTerm)] -> PTerm -> PTerm
396piBind :: [(Name, PTerm)] -> PTerm -> PTerm
389piBind [] t = t
397piBind [] t = t
390piBind ((n, ty):ns) t = PPi Exp n ty (piBind ns t)
398piBind ((n, ty):ns) t = PPi Exp n ty (piBind ns t)
@@ -422,7 +430,16 @@ implicitise syn ist tm
422 imps True (n:env) sc
430 imps True (n:env) sc
423 imps top env (PPair _ l r)
431 imps top env (PPair _ l r)
424 = do (decls, ns) <- get
432 = 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)))))
426 imps top env (PLam n ty sc)
443 imps top env (PLam n ty sc)
427 = do imps False env ty
444 = do imps False env ty
428 imps False (n:env) sc
445 imps False (n:env) sc
@@ -443,6 +460,9 @@ addImpl ist ptm = ai [] ptm
443 ai env (PPair fc l r) = let l' = ai env l
460 ai env (PPair fc l r) = let l' = ai env l
444 r' = ai env r in
461 r' = ai env r in
445 PPair fc l' r'
462 PPair fc l' r'
463+ ai env (PDPair fc l r) = let l' = ai env l
446 ai env (PApp fc (PRef _ f) as)
466 ai env (PApp fc (PRef _ f) as)
447 = let as' = map (fmap (ai env)) as in
467 = let as' = map (fmap (ai env)) as in
448 aiFn fc env (PRef fc f) as'
468 aiFn fc env (PRef fc f) as'