Last active
February 5, 2022 23:24
-
-
Save TOTBWF/9faf5e00f9e85b5d569a5f34a7f55fb3 to your computer and use it in GitHub Desktop.
NbE for Cartesian Categories
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# OPTIONS --without-K --safe #-} | |
open import Categories.Category.Core | |
open import Categories.Category.Cartesian | |
module Categories.Tactic.Cartesian.Solver {o β e} {π : Category o β e} (cartesian : Cartesian π) where | |
open import Level | |
open import Categories.Category.BinaryProducts | |
open import Categories.Object.Terminal | |
open Category π | |
open Cartesian cartesian | |
open BinaryProducts products | |
open Terminal terminal | |
open HomReasoning | |
open Equiv | |
-------------------------------------------------------------------------------- | |
-- Syntax | |
-- | |
-- The reified syntax of the language of cartesian categories. | |
-- Note that we need to reflect objects as well as expressions; this allows | |
-- us to perform typed NbE, allowing us to properly Ξ·-expand products. | |
-- | |
-- We also make sure to avoid implicit parameters; these can cause | |
-- some of the reflection machinery to act up. | |
data Type : Set o where | |
β€β² : Type | |
_β² : Obj β Type | |
_Γβ²_ : Type β Type β Type | |
obj : Type β Obj | |
obj β€β² = β€ | |
obj (A β²) = A | |
obj (A Γβ² B) = obj A Γ obj B | |
data Syn : Type β Type β Set (o β β) where | |
idβ² : β {A} β Syn A A | |
_ββ²_ : β {A B C} β Syn B C β Syn A B β Syn A C | |
Οββ² : β {A B} β Syn (A Γβ² B) A | |
Οββ² : β {A B} β Syn (A Γβ² B) B | |
β¨_,_β©β² : β {A B C} β Syn A B β Syn A C β Syn A (B Γβ² C) | |
!β² : β {A} β Syn A β€β² | |
[_β] : β {A B} β obj A β obj B β Syn A B | |
-- Read a piece of syntax back into a morphism. | |
embed : β A B β Syn A B β obj A β obj B | |
embed _ _ idβ² = id | |
embed _ _ (f ββ² g) = embed _ _ f β embed _ _ g | |
embed _ _ Οββ² = Οβ | |
embed _ _ Οββ² = Οβ | |
embed _ _ β¨ f , g β©β² = β¨ embed _ _ f , embed _ _ g β© | |
embed _ _ !β² = ! | |
embed _ _ [ f β] = f | |
-------------------------------------------------------------------------------- | |
-- Semantics | |
-- | |
-- The idea here is similar to the Category tactic, | |
-- but we need to use a slightly fancier presheaf. | |
-- | |
-- The way we handle neutral terms is somewhat subtle; | |
-- For normal NbE we would keep a stack of eliminators | |
-- blocked on a neutral. However, our neutral forms | |
-- here are morphisms, so we can just compose onto it | |
-- in do_fst/do_snd. | |
data Sem (A : Type) : Type β Set (o β β) where | |
pair : β {B C} β Sem A B β Sem A C β Sem A (B Γβ² C) | |
tt : Sem A β€β² | |
mor : β {B} β obj A β obj B β Sem A B | |
do-fst : β {A B C} β Sem A (B Γβ² C) β Sem A B | |
do-fst (pair e _) = e | |
do-fst (mor f) = mor (Οβ β f) | |
do-snd : β {A B C} β Sem A (B Γβ² C) β Sem A C | |
do-snd (pair _ e) = e | |
do-snd (mor f) = mor (Οβ β f) | |
-- Reflect the semantics into a morphism in a type-directed manner. | |
reflect : β A B β Sem A B β obj A β obj B | |
reflect _ β€β² e = ! | |
reflect _ (_ β²) (mor f) = f | |
reflect A (B Γβ² C) e = β¨ reflect A B (do-fst e) , reflect A C (do-snd e) β© | |
-- Evaluate a piece of syntax into a presheaf. | |
eval : β {A B C} β Syn B C β Sem A B β Sem A C | |
eval idβ² e = e | |
eval (sβ ββ² sβ) e = eval sβ (eval sβ e) | |
eval Οββ² e = do-fst e | |
eval Οββ² e = do-snd e | |
eval β¨ sβ , sβ β©β² e = pair (eval sβ e) (eval sβ e) | |
eval !β² e = tt | |
eval [ f β] e = mor (f β reflect _ _ e) | |
-- Normalize a piece of syntax. | |
nf : β A B β Syn A B β obj A β obj B | |
nf A B s = reflect A B (eval s (mor id)) | |
-- Reflecting a morphism preserves equality. | |
reflect-mor : β A B β (f : obj A β obj B) β reflect A B (mor f) β f | |
reflect-mor A β€β² f = !-unique f | |
reflect-mor A (x β²) f = refl | |
reflect-mor A (B Γβ² C) f = begin | |
reflect A (B Γβ² C) (mor f) ββ¨ β¨β©-congβ (reflect-mor A B (Οβ β f)) (reflect-mor A C (Οβ β f)) β© | |
β¨ Οβ β f , Οβ β f β© ββ¨ g-Ξ· β© | |
f β | |
reflect-eval : β A B C β (s : Syn B C) β (e : Sem A B) β reflect B C (eval s (mor id)) β reflect A B e β reflect A C (eval s e) | |
reflect-eval A B B idβ² e = begin | |
reflect B B (mor id) β reflect A B e ββ¨ (reflect-mor B B id β©ββ¨refl) β© | |
id β reflect A B e ββ¨ identityΛ‘ β© | |
reflect A B e β | |
reflect-eval A B C (f ββ² g) e = begin | |
reflect B C (eval f (eval g (mor id))) β reflect A B e βΛβ¨ reflect-eval B _ C f (eval g (mor id)) β©ββ¨refl β© | |
(reflect _ C (eval f (mor id)) β reflect B _ (eval g (mor id))) β reflect A B e ββ¨ assoc β© | |
(reflect _ C (eval f (mor id)) β reflect B _ (eval g (mor id)) β reflect A B e) ββ¨ reflβ©ββ¨ reflect-eval A B _ g e β© | |
(reflect _ C (eval f (mor id)) β reflect A _ (eval g e)) ββ¨ reflect-eval A _ C f (eval g e) β© | |
reflect A C (eval f (eval g e)) β | |
reflect-eval A (B Γβ² C) B Οββ² e = begin | |
(reflect (B Γβ² C) B (mor (Οβ β id)) β β¨ reflect A B (do-fst e) , (reflect A C (do-snd e)) β©) ββ¨ (reflect-mor (B Γβ² C) B (Οβ β id)) β©ββ¨refl β© | |
(Οβ β id) β β¨ reflect A B (do-fst e) , reflect A C (do-snd e) β© ββ¨ (identityΚ³ β©ββ¨refl) β© | |
Οβ β β¨ reflect A B (do-fst e) , reflect A C (do-snd e) β© ββ¨ projectβ β© | |
reflect A B (do-fst e) β | |
reflect-eval A (B Γβ² C) C Οββ² e = begin | |
(reflect (B Γβ² C) C (mor (Οβ β id)) β β¨ reflect A B (do-fst e) , (reflect A C (do-snd e)) β©) ββ¨ (reflect-mor (B Γβ² C) C (Οβ β id)) β©ββ¨refl β© | |
(Οβ β id) β β¨ reflect A B (do-fst e) , reflect A C (do-snd e) β© ββ¨ (identityΚ³ β©ββ¨refl) β© | |
Οβ β β¨ reflect A B (do-fst e) , reflect A C (do-snd e) β© ββ¨ projectβ β© | |
reflect A C (do-snd e) β | |
reflect-eval A B (C Γβ² D) β¨ f , g β©β² e = begin | |
β¨ reflect B C (eval f (mor id)) , reflect B D (eval g (mor id)) β© β reflect A B e ββ¨ β-distribΚ³-β¨β© β© | |
β¨ reflect B C (eval f (mor id)) β reflect A B e , reflect B D (eval g (mor id)) β reflect A B e β© ββ¨ β¨β©-congβ (reflect-eval A B C f e) (reflect-eval A B D g e) β© | |
β¨ reflect A C (eval f e) , reflect A D (eval g e) β© β | |
reflect-eval A B .β€β² !β² e = βΊ (!-unique (! β reflect A B e)) | |
reflect-eval A B C [ f β] e = begin | |
reflect B C (mor (f β reflect B B (mor id))) β reflect A B e ββ¨ reflect-mor B C (f β reflect B B (mor id)) β©ββ¨refl β© | |
(f β reflect B B (mor id)) β reflect A B e ββ¨ (reflβ©ββ¨ reflect-mor B B id) β©ββ¨refl β© | |
(f β id) β reflect A B e ββ¨ (identityΚ³ β©ββ¨ refl) β© | |
f β reflect A B e βΛβ¨ reflect-mor A C (f β reflect A B e) β© | |
reflect A C (mor (f β reflect A B e)) β | |
sound : β A B β (s : Syn A B) β nf A B s β embed A B s | |
sound A A idβ² = reflect-mor A A id | |
sound A C (_ββ²_ {B = B} f g) = begin | |
nf A C (f ββ² g) βΛβ¨ reflect-eval A B C f (eval g (mor id)) β© | |
nf B C f β nf A B g ββ¨ sound B C f β©ββ¨ sound A B g β© | |
(embed B C f β embed A B g) β | |
sound (A Γβ² B) A Οββ² = begin | |
nf (A Γβ² B) A Οββ² ββ¨ reflect-mor (A Γβ² B) A (Οβ β id) β© | |
Οβ β id ββ¨ identityΚ³ β© | |
Οβ β | |
sound (A Γβ² B) B Οββ² = begin | |
nf (A Γβ² B) B Οββ² ββ¨ reflect-mor (A Γβ² B) B (Οβ β id) β© | |
Οβ β id ββ¨ identityΚ³ β© | |
Οβ β | |
sound A (B Γβ² C) β¨ f , g β©β² = begin | |
nf A (B Γβ² C) β¨ f , g β©β² ββ¨ β¨β©-congβ (sound A B f) (sound A C g) β© | |
β¨ embed A B f , embed A C g β© β | |
sound A .β€β² !β² = refl | |
sound A B [ f β] = begin | |
nf A B [ f β] ββ¨ reflect-mor A B (f β reflect A A (mor id)) β© | |
f β reflect A A (mor id) ββ¨ (reflβ©ββ¨ reflect-mor A A id) β© | |
f β id ββ¨ identityΚ³ β© | |
f β |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment