open import 1Lab.Reflection
open import Cat.Prelude
import Cat.Reasoning as Cr
import Cat.Solver as Cs
module Cat.Functor.Solver where
open Functor
module NbE where
open Cs.NbE using (`id ; _โ ; _`โ_)
private
module CE = Cs.NbE
variable
o o' h h' : Level
๐ : Precategory o h
data FExpr : (๐ : Precategory o h) โ โ ๐ โ โ โ ๐ โ โ Typeฯ where
`Fโ
: (๐ : Precategory o h) (F : Functor ๐ ๐) {A B : โ ๐ โ}
โ FExpr ๐ A B โ FExpr ๐ (F .Fโ A) (F .Fโ B)
_`โ_ : {X Y Z : โ ๐ โ} โ FExpr ๐ Y Z โ FExpr ๐ X Y โ FExpr ๐ X Z
`id : {X : โ ๐ โ} โ FExpr ๐ X X
_โ : {X Y : โ ๐ โ} โ Cr.Hom ๐ X Y โ FExpr ๐ X Y
unfexpr : (๐ : Precategory o h) {X Y : โ ๐ โ} โ FExpr ๐ X Y โ Cr.Hom ๐ X Y
unfexpr ๐ (`Fโ ๐ F e) = F .Fโ (unfexpr ๐ e)
unfexpr ๐ (e1 `โ e2) = unfexpr ๐ e1 โ unfexpr ๐ e2 where open Precategory ๐
unfexpr ๐ `id = Cr.id ๐
unfexpr ๐ (f โ) = f
CExpr : (๐ : Precategory o h) โ โ ๐ โ โ โ ๐ โ โ Type (o โ h)
CExpr = CE.Expr
do-fmap
: (๐ : Precategory o h) (๐ : Precategory o' h') (F : Functor ๐ ๐)
โ {A B : โ ๐ โ} โ CExpr ๐ A B โ CExpr ๐ (F .Fโ A) (F .Fโ B)
do-fmap ๐ ๐ F `id = `id
do-fmap ๐ ๐ F (e `โ eโ) = do-fmap ๐ ๐ F e `โ do-fmap ๐ ๐ F eโ
do-fmap ๐ ๐ F (f โ) = F .Fโ f โ
eval : (๐ : Precategory o h) {X Y : โ ๐ โ} โ FExpr ๐ X Y โ CExpr ๐ X Y
eval ๐ (`Fโ ๐ F e) = do-fmap ๐ ๐ F (eval ๐ e)
eval ๐ (e1 `โ e2) = eval ๐ e1 `โ eval ๐ e2
eval ๐ `id = `id
eval ๐ (f โ) = f โ
nf : (๐ : Precategory o h) {X Y : โ ๐ โ} โ FExpr ๐ X Y โ Cr.Hom ๐ X Y
nf ๐ e = CE.nf ๐ (eval ๐ e)
do-fmap-sound
: (๐ : Precategory o h) (๐ : Precategory o' h') (F : Functor ๐ ๐) {A B : โ ๐ โ}
โ (v : CE.Expr ๐ A B) โ CE.embed ๐ (do-fmap ๐ ๐ F v) โก F .Fโ (CE.embed ๐ v)
do-fmap-sound ๐ ๐ F `id = sym (F .F-id)
do-fmap-sound ๐ ๐ F (v `โ vโ) =
CE.embed ๐ (do-fmap ๐ ๐ F v) ๐.โ CE.embed ๐ (do-fmap ๐ ๐ F vโ) โกโจ apโ ๐._โ_ (do-fmap-sound ๐ ๐ F v) (do-fmap-sound ๐ ๐ F vโ) โฉ
F .Fโ (CE.embed ๐ v) ๐.โ F .Fโ (CE.embed ๐ vโ) โกหโจ F .F-โ _ _ โฉ
F .Fโ (CE.embed ๐ v ๐.โ CE.embed ๐ vโ) โ
where
module ๐ = Precategory ๐
module ๐ = Precategory ๐
do-fmap-sound ๐ ๐ F (x โ) = refl
eval-sound
: (๐ : Precategory o h) {X Y : โ ๐ โ} โ (e : FExpr ๐ X Y)
โ CE.embed ๐ (eval ๐ e) โก unfexpr ๐ e
eval-sound ๐ (`Fโ ๐ F v) =
do-fmap-sound ๐ ๐ F (eval ๐ v) โ ap (F .Fโ) (eval-sound ๐ v)
eval-sound ๐ (e `โ eโ) = apโ _โ_ (eval-sound ๐ e) (eval-sound ๐ eโ)
where open Precategory ๐
eval-sound ๐ `id = refl
eval-sound ๐ (f โ) = refl
nf-sound
: (๐ : Precategory o h) {X Y : โ ๐ โ} (e : FExpr ๐ X Y) โ nf ๐ e โก unfexpr ๐ e
nf-sound ๐ e = CE.eval-sound ๐ (eval ๐ e) โ eval-sound ๐ e
abstract
solve
: (๐ : Precategory o h) {X Y : โ ๐ โ} โ (e1 e2 : FExpr ๐ X Y)
โ nf ๐ e1 โก nf ๐ e2 โ unfexpr ๐ e1 โก unfexpr ๐ e2
solve ๐ e1 e2 p = sym (nf-sound ๐ e1) โโ p โโ (nf-sound ๐ e2)
module Reflection where
open Cs.Reflection using (โidโ ; โโโ)
pattern functor-args cat functor xs =
_ hโท _ hโท cat hโท _ hโท _ hโท _ hโท functor vโท xs
pattern โFโโ cat functor f =
def (quote Functor.Fโ) (functor-args cat functor (_ hโท _ hโท f vโท []))
โsolveโ : Term โ Term โ Term โ Term
โsolveโ cat lhs rhs =
def (quote NbE.solve) (cat vโท lhs vโท rhs vโท def (quote refl) [] vโท [])
build-fexpr : Term โ Term
build-fexpr โidโ = con (quote NbE.FExpr.`id) []
build-fexpr (โโโ f g) = con (quote NbE.FExpr._`โ_)
(build-fexpr f vโท build-fexpr g vโท [])
build-fexpr (โFโโ cat functor f) = con (quote NbE.FExpr.`Fโ)
(cat vโท functor vโท build-fexpr f vโท [])
build-fexpr f = con (quote NbE.FExpr._โ) (f vโท [])
dont-reduce : List Name
dont-reduce = quote Precategory.id โท quote Precategory._โ_ โท quote Functor.Fโ โท []
module _ {o h} (๐ : Precategory o h) {x y : โ ๐ โ} {h1 h2 : ๐ .Precategory.Hom x y} where
open Reflection
functor-worker : Term โ TC โค
functor-worker hole =
withNormalisation true $
withReduceDefs (false , dont-reduce) $ do
`h1 โ wait-for-type =<< quoteTC h1
`h2 โ quoteTC h2
`๐ โ quoteTC ๐
let
elhs = build-fexpr `h1
erhs = build-fexpr `h2
noConstraints $ unify hole (โsolveโ `๐ elhs erhs)
functor-wrapper : {@(tactic functor-worker) p : h1 โก h2} โ h1 โก h2
functor-wrapper {p = p} = p
macro
functor! : Term โ Term โ TC โค
functor! cat = flip unify (def (quote functor-wrapper) (cat vโท []))
private
module Test
{o h} {๐ ๐ โฐ : Precategory o h} (F : Functor ๐ ๐) (G : Functor ๐ โฐ) where
module ๐ = Precategory ๐
module ๐ = Precategory ๐
module โฐ = Precategory โฐ
variable
A B : ๐.Ob
a b : ๐.Hom A B
test
: G .Fโ (F .Fโ a ๐.โ ๐.id) โฐ.โ G .Fโ (F .Fโ (b ๐.โ ๐.id)) โฐ.โ โฐ.id
โก G .Fโ (F .Fโ (a ๐.โ b))
test = functor! โฐ