@@ -1024,7 +1024,9 @@ data PTerm = PQuote Raw -- ^ Inclusion of a core term into the high-level langua
10241024 | PCase FC PTerm [(PTerm, PTerm)] -- ^ A case expression. Args are source location, scrutinee, and a list of pattern/RHS pairs
10251025 | PTrue FC PunInfo -- ^ Unit type..?
10261026 | PResolveTC FC -- ^ Solve this dictionary by type class resolution
1027− | PRewrite FC PTerm PTerm (Maybe PTerm) -- ^ "rewrite" syntax, with optional result type
1027+ | PRewrite FC (Maybe Name) PTerm PTerm (Maybe PTerm)
1028+ -- ^ "rewrite" syntax, with optional rewriting function
1029+ -- and optional result type
10281030 | PPair FC [FC] PunInfo PTerm PTerm -- ^ A pair (a, b) and whether it's a product type or a pair (solved by elaboration). The list of FCs is its punctuation.
10291031 | PDPair FC [FC] PunInfo PTerm PTerm PTerm -- ^ A dependent pair (tm : a ** b) and whether it's a sigma type or a pair that inhabits one (solved by elaboration). The [FC] is its punctuation.
10301032 | PAs FC Name PTerm -- ^ @-pattern, valid LHS only
@@ -1080,7 +1082,7 @@ mapPTermFC f g (PIfThenElse fc t1 t2 t3) = PIfThenElse (f fc) (mapPTermFC f
10801082mapPTermFC f g (PCase fc t cases) = PCase (f fc) (mapPTermFC f g t) (map (\(l,r) -> (mapPTermFC f g l, mapPTermFC f g r)) cases)
10811083mapPTermFC f g (PTrue fc info) = PTrue (f fc) info
10821084mapPTermFC f g (PResolveTC fc) = PResolveTC (f fc)
1083−mapPTermFC f g (PRewrite fc t1 t2 t3) = PRewrite (f fc) (mapPTermFC f g t1) (mapPTermFC f g t2) (fmap (mapPTermFC f g) t3)
1085+mapPTermFC f g (PRewrite fc by t1 t2 t3) = PRewrite (f fc) by (mapPTermFC f g t1) (mapPTermFC f g t2) (fmap (mapPTermFC f g) t3)
10841086mapPTermFC f g (PPair fc hls info t1 t2) = PPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2)
10851087mapPTermFC f g (PDPair fc hls info t1 t2 t3) = PDPair (f fc) (map g hls) info (mapPTermFC f g t1) (mapPTermFC f g t2) (mapPTermFC f g t3)
10861088mapPTermFC f g (PAs fc n t) = PAs (f fc) n (mapPTermFC f g t)
@@ -1125,7 +1127,7 @@ mapPT f t = f (mpt t) where
11251127 mpt (PLam fc n nfc t s) = PLam fc n nfc (mapPT f t) (mapPT f s)
11261128 mpt (PPi p n nfc t s) = PPi p n nfc (mapPT f t) (mapPT f s)
11271129 mpt (PLet fc n nfc ty v s) = PLet fc n nfc (mapPT f ty) (mapPT f v) (mapPT f s)
1128− mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s) (fmap (mapPT f) g)
1130+ mpt (PRewrite fc by t s g) = PRewrite fc by (mapPT f t) (mapPT f s) (fmap (mapPT f) g)
11291131 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
11301132 mpt (PWithApp fc t a) = PWithApp fc (mapPT f t) (mapPT f a)
11311133 mpt (PAppBind fc t as) = PAppBind fc (mapPT f t) (map (fmap (mapPT f)) as)
@@ -1302,7 +1304,7 @@ highestFC (PCase fc _ _) = Just fc
13021304highestFC (PIfThenElse fc _ _ _) = Just fc
13031305highestFC (PTrue fc _) = Just fc
13041306highestFC (PResolveTC fc) = Just fc
1305−highestFC (PRewrite fc _ _ _) = Just fc
1307+highestFC (PRewrite fc _ _ _ _) = Just fc
13061308highestFC (PPair fc _ _ _ _) = Just fc
13071309highestFC (PDPair fc _ _ _ _ _) = Just fc
13081310highestFC (PAs fc _ _) = Just fc
@@ -1882,9 +1884,14 @@ pprintPTerm ppo bnd docArgs infixes = prettySe (ppopt_depth ppo) startPrec bnd
18821884 prettySe d p bnd (PTrue _ IsType) = annName unitTy $ text "()"
18831885 prettySe d p bnd (PTrue _ IsTerm) = annName unitCon $ text "()"
18841886 prettySe d p bnd (PTrue _ TypeOrTerm) = text "()"
1885− prettySe d p bnd (PRewrite _ l r _) =
1887+ prettySe d p bnd (PRewrite _ by l r _) =
18861888 depth d . bracket p startPrec $
1887− text "rewrite" <+> prettySe (decD d) (startPrec + 1) bnd l <+> text "in" <+> prettySe (decD d) startPrec bnd r
1889+ text "rewrite" <+> prettySe (decD d) (startPrec + 1) bnd l
1890+ <+> (case by of
1891+ Nothing -> empty
1892+ Just fn -> text "using" <+>
1893+ prettyName True (ppopt_impl ppo) bnd fn) <+>
1894+ text "in" <+> prettySe (decD d) startPrec bnd r
18881895 prettySe d p bnd (PTyped l r) =
18891896 lparen <> prettySe (decD d) startPrec bnd l <+> colon <+> prettySe (decD d) startPrec bnd r <> rparen
18901897 prettySe d p bnd pair@(PPair _ _ pun _ _) -- flatten tuples to the right, like parser
@@ -2247,7 +2254,7 @@ instance Sized PTerm where
22472254 size (PIfThenElse fc c t f) = 1 + sum (map size [c, t, f])
22482255 size (PTrue fc _) = 1
22492256 size (PResolveTC fc) = 1
2250− size (PRewrite fc left right _) = 1 + size left + size right
2257+ size (PRewrite fc by left right _) = 1 + size left + size right
22512258 size (PPair fc _ _ left right) = 1 + size left + size right
22522259 size (PDPair fs _ _ left ty right) = 1 + size left + size ty + size right
22532260 size (PAlternative _ a alts) = 1 + size alts
@@ -2288,7 +2295,7 @@ allNamesIn tm = nub $ ni 0 [] tm
22882295 ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
22892296 ni 0 env (PLet _ n _ ty val sc) = ni 0 env ty ++ ni 0 env val ++ ni 0 (n:env) sc
22902297 ni 0 env (PHidden tm) = ni 0 env tm
2291− ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2298+ ni 0 env (PRewrite _ _ l r _) = ni 0 env l ++ ni 0 env r
22922299 ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
22932300 ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
22942301 ni 0 env (PDPair _ _ _ (PRef _ _ n) Placeholder r) = n : ni 0 env r
@@ -2319,7 +2326,7 @@ boundNamesIn tm = S.toList (ni 0 S.empty tm)
23192326 ni 0 set (PLam fc n _ ty sc) = S.insert n $ ni 0 (ni 0 set ty) sc
23202327 ni 0 set (PLet fc n nfc ty val sc) = S.insert n $ ni 0 (ni 0 (ni 0 set ty) val) sc
23212328 ni 0 set (PPi p n _ ty sc) = niTacImp 0 (S.insert n $ ni 0 (ni 0 set ty) sc) p
2322− ni 0 set (PRewrite _ l r _) = ni 0 (ni 0 set l) r
2329+ ni 0 set (PRewrite _ _ l r _) = ni 0 (ni 0 set l) r
23232330 ni 0 set (PTyped l r) = ni 0 (ni 0 set l) r
23242331 ni 0 set (PPair _ _ _ l r) = ni 0 (ni 0 set l) r
23252332 ni 0 set (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 (ni 0 set t) r
@@ -2395,7 +2402,7 @@ implicitNamesIn uvars ist tm
23952402 ni 0 env (PIfThenElse _ c t f) = mapM_ (ni 0 env) [c, t, f]
23962403 ni 0 env (PLam fc n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc
23972404 ni 0 env (PPi p n _ ty sc) = do ni 0 env ty; ni 0 (n:env) sc
2398− ni 0 env (PRewrite _ l r _) = do ni 0 env l; ni 0 env r
2405+ ni 0 env (PRewrite _ _ l r _) = do ni 0 env l; ni 0 env r
23992406 ni 0 env (PTyped l r) = do ni 0 env l; ni 0 env r
24002407 ni 0 env (PPair _ _ _ l r) = do ni 0 env l; ni 0 env r
24012408 ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = do ni 0 env t; ni 0 (n:env) r
@@ -2432,7 +2439,7 @@ namesIn uvars ist tm = nub $ ni 0 [] tm
24322439 ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]
24332440 ni 0 env (PLam fc n nfc ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
24342441 ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
2435− ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2442+ ni 0 env (PRewrite _ _ l r _) = ni 0 env l ++ ni 0 env r
24362443 ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
24372444 ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
24382445 ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r
@@ -2467,7 +2474,7 @@ usedNamesIn vars ist tm = nub $ ni 0 [] tm
24672474 ni 0 env (PIfThenElse _ c t f) = concatMap (ni 0 env) [c, t, f]
24682475 ni 0 env (PLam fc n _ ty sc) = ni 0 env ty ++ ni 0 (n:env) sc
24692476 ni 0 env (PPi p n _ ty sc) = niTacImp 0 env p ++ ni 0 env ty ++ ni 0 (n:env) sc
2470− ni 0 env (PRewrite _ l r _) = ni 0 env l ++ ni 0 env r
2477+ ni 0 env (PRewrite _ _ l r _) = ni 0 env l ++ ni 0 env r
24712478 ni 0 env (PTyped l r) = ni 0 env l ++ ni 0 env r
24722479 ni 0 env (PPair _ _ _ l r) = ni 0 env l ++ ni 0 env r
24732480 ni 0 env (PDPair _ _ _ (PRef _ _ n) t r) = ni 0 env t ++ ni 0 (n:env) r