@@ -171,10 +171,13 @@ data Plicity = Imp { plazy :: Bool,
171 pstatic :: Static }
171 pstatic :: Static }
172 | Exp { plazy :: Bool,
172 | Exp { plazy :: Bool,
173 pstatic :: Static }
173 pstatic :: Static }
174+ | Constraint { plazy :: Bool,
174 deriving (Show, Eq)
176 deriving (Show, Eq)
176impl = Imp False Dynamic
178impl = Imp False Dynamic
177expl = Exp False Dynamic
179expl = Exp False Dynamic
180+constraint = Constraint False Static
179data PDecl' t = PFix FC Fixity [String] -- fixity declaration
182data PDecl' t = PFix FC Fixity [String] -- fixity declaration
180 | PTy SyntaxInfo FC Name t -- type declaration
183 | PTy SyntaxInfo FC Name t -- type declaration
@@ -243,6 +246,7 @@ data PTerm = PQuote Raw
243 | PTrue FC
246 | PTrue FC
244 | PFalse FC
247 | PFalse FC
245 | PRefl FC
248 | PRefl FC
246 | PEq FC PTerm PTerm
250 | PEq FC PTerm PTerm
247 | PPair FC PTerm PTerm
251 | PPair FC PTerm PTerm
248 | PDPair FC PTerm PTerm
252 | PDPair FC PTerm PTerm
@@ -292,10 +296,12 @@ type PDo = PDo' PTerm
293data PArg' t = PImp { lazyarg :: Bool, pname :: Name, getTm :: t }
297data PArg' t = PImp { lazyarg :: Bool, pname :: Name, getTm :: t }
294 | PExp { lazyarg :: Bool, getTm :: t }
298 | PExp { lazyarg :: Bool, getTm :: t }
299+ | PConstraint { lazyarg :: Bool, getTm :: t }
295 deriving (Show, Eq, Functor)
300 deriving (Show, Eq, Functor)
297pimp = PImp False
302pimp = PImp False
298pexp = PExp False
303pexp = PExp False
304+pconst = PConstraint False
300type PArg = PArg' PTerm
306type PArg = PArg' PTerm
@@ -372,6 +378,11 @@ getExps [] = []
372getExps (PExp _ tm : xs) = tm : getExps xs
378getExps (PExp _ tm : xs) = tm : getExps xs
373getExps (_ : xs) = getExps xs
379getExps (_ : xs) = getExps xs
381+getConsts :: [PArg] -> [PTerm]
383+getConsts (PConstraint _ tm : xs) = tm : getConsts xs
384+getConsts (_ : xs) = getConsts xs
375getAll :: [PArg] -> [PTerm]
386getAll :: [PArg] -> [PTerm]
376getAll = map getTm
387getAll = map getTm
@@ -400,6 +411,8 @@ showImp impl tm = se 10 tm where
400 where st = case s of
411 where st = case s of
401 Static -> "[static] "
412 Static -> "[static] "
414+ se p (PPi (Constraint _ _) n ty sc)
415+ = bracket p 2 $ se 10 ty ++ " => " ++ se 10 sc
403 se p (PApp _ (PRef _ f) [])
416 se p (PApp _ (PRef _ f) [])
404 | not impl = show f
417 | not impl = show f
405 se p (PApp _ (PRef _ op@(UN [f:_])) args)
418 se p (PApp _ (PRef _ op@(UN [f:_])) args)
@@ -407,11 +420,13 @@ showImp impl tm = se 10 tm where
407 = let [l, r] = getExps args in
420 = let [l, r] = getExps args in
408 bracket p 1 $ se 1 l ++ " " ++ show op ++ " " ++ se 0 r
421 bracket p 1 $ se 1 l ++ " " ++ show op ++ " " ++ se 0 r
409 se p (PApp _ f as)
422 se p (PApp _ f as)
410− = let (imps, args) = (getImps as, getExps as) in
423+ = let (imps, cs, args) = (getImps as, getConsts as, getExps as) in
424+ bracket p 1 $ se 1 f ++ concatMap scArg cs
411− bracket p 1 $ se 1 f ++ (if impl then concatMap siArg imps else "")
425+ ++ (if impl then concatMap siArg imps else "")
412 ++ concatMap seArg args
426 ++ concatMap seArg args
413 se p (PHidden tm) = "." ++ se 0 tm
427 se p (PHidden tm) = "." ++ se 0 tm
414 se p (PRefl _) = "refl"
428 se p (PRefl _) = "refl"
429+ se p (PResolveTC _) = "resolvetc"
415 se p (PTrue _) = "()"
430 se p (PTrue _) = "()"
416 se p (PFalse _) = "_|_"
431 se p (PFalse _) = "_|_"
417 se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r
432 se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r
@@ -425,6 +440,7 @@ showImp impl tm = se 10 tm where
426 seArg arg = " " ++ se 0 arg
441 seArg arg = " " ++ se 0 arg
427 siArg (n, val) = " {" ++ show n ++ " = " ++ se 10 val ++ "}"
442 siArg (n, val) = " {" ++ show n ++ " = " ++ se 10 val ++ "}"
443+ scArg val = " {{" ++ se 10 val ++ "}}"
429 bracket outer inner str | inner > outer = "(" ++ str ++ ")"
445 bracket outer inner str | inner > outer = "(" ++ str ++ ")"
430 | otherwise = str
446 | otherwise = str
@@ -626,6 +642,14 @@ implicitise syn ist tm
626 put (PExp l ty : decls,
642 put (PExp l ty : decls,
627 nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
643 nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
628 imps True (n:env) sc
644 imps True (n:env) sc
645+ imps top env (PPi (Constraint l _) n ty sc)
646+ = do let isn = nub (namesIn ist ty ++ case sc of
647+ (PRef _ x) -> namesIn ist sc `dropAll` [n]
649+ (decls, ns) <- get -- ignore decls in HO types
650+ put (PConstraint l ty : decls,
651+ nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))
652+ imps True (n:env) sc
629 imps top env (PEq _ l r)
653 imps top env (PEq _ l r)
630 = do (decls, ns) <- get
654 = do (decls, ns) <- get
631 let isn = namesIn ist l ++ namesIn ist r
655 let isn = namesIn ist l ++ namesIn ist r
@@ -701,6 +725,10 @@ aiFn ist fc f as
701 insertImpl :: [PArg] -> [PArg] -> [PArg]
725 insertImpl :: [PArg] -> [PArg] -> [PArg]
702 insertImpl (PExp l ty : ps) (PExp _ tm : given) =
726 insertImpl (PExp l ty : ps) (PExp _ tm : given) =
703 PExp l tm : insertImpl ps given
727 PExp l tm : insertImpl ps given
728+ insertImpl (PConstraint l ty : ps) (PConstraint _ tm : given) =
729+ PConstraint l tm : insertImpl ps given
730+ insertImpl (PConstraint l ty : ps) given =
731+ PConstraint l (PResolveTC fc) : insertImpl ps given
704 insertImpl (PImp l n ty : ps) given =
732 insertImpl (PImp l n ty : ps) given =
705 case find n given [] of
733 case find n given [] of
706 Just (tm, given') -> PImp l n tm : insertImpl ps given'
734 Just (tm, given') -> PImp l n tm : insertImpl ps given'
@@ -789,6 +817,7 @@ matchClause x y = match x y where
789 mr <- match r r'
817 mr <- match r r'
790 return (ml ++ mr)
818 return (ml ++ mr)
791 match (PRefl _) (PRefl _) = return []
819 match (PRefl _) (PRefl _) = return []
820+ match (PResolveTC _) (PResolveTC _) = return []
792 match (PTrue _) (PTrue _) = return []
821 match (PTrue _) (PTrue _) = return []
793 match (PFalse _) (PFalse _) = return []
822 match (PFalse _) (PFalse _) = return []
794 match (PReturn _) (PReturn _) = return []
823 match (PReturn _) (PReturn _) = return []