Last active
February 5, 2022 23:24
-
-
Save TOTBWF/9faf5e00f9e85b5d569a5f34a7f55fb3 to your computer and use it in GitHub Desktop.
Revisions
-
TOTBWF revised this gist
Feb 3, 2022 . 1 changed file with 2 additions and 1 deletion.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -66,7 +66,8 @@ embed _ _ [ f β] = f -- 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) -
TOTBWF revised this gist
Feb 3, 2022 . 1 changed file with 162 additions and 191 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -1,198 +1,169 @@ {-# 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 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 β -
TOTBWF created this gist
Feb 3, 2022 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,198 @@ {-# OPTIONS --without-K --safe #-} module CartesianNbE where open import Level open import Categories.Category open import Categories.Category.Cartesian open import Categories.Category.BinaryProducts open import Categories.Object.Terminal open import Function using (_β¨_β©_) import Data.Unit as Unit open import Data.Bool as Bool using (Bool; _β¨_; if_then_else_) open import Data.Maybe as Maybe using (Maybe; just; nothing; maybe; fromMaybe) open import Data.List as List using (List; _β·_; []) open import Data.Product as Product using (Ξ£ ;_,_) open import Agda.Builtin.Reflection open import Reflection.Argument open import Reflection.Term using (getName; _β―β β·β_) open import Reflection.TypeChecking.Monad.Syntax module _ {o β e} {π : Category o β e} (cartesian : Cartesian π) where open Category π open Cartesian cartesian open BinaryProducts products open Terminal terminal open HomReasoning open Equiv -------------------------------------------------------------------------------- -- Syntax data Ctx : Set o where β : Ctx [_] : Obj β Ctx _++_ : Ctx β Ctx β Ctx ctx : Ctx β Obj ctx β = β€ ctx [ X ] = X ctx (Ξ ++ Ξ) = ctx Ξ Γ ctx Ξ data Syn : Ctx β Ctx β 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 C A β Syn C B β Syn C (A ++ B) !β² : β {A} β Syn A β [_β] : β {A B} β ctx A β ctx B β Syn A B -- Read a piece of syntax back into a morphism. [_β] : β {A B} β Syn A B β ctx A β ctx B [ idβ² β] = id [ f ββ² g β] = [ f β] β [ g β] [ Οββ² β] = Οβ [ Οββ² β] = Οβ [ β¨ f , g β©β² β] = β¨ [ f β] , [ g β] β© [ !β² β] = ! [ [ f β] β] = f -------------------------------------------------------------------------------- -- Semantics data Sem (Ξ : Ctx) : Ctx β Set (o β β) where pair : β {Ξ Ξ¨} β Sem Ξ Ξ β Sem Ξ Ξ¨ β Sem Ξ (Ξ ++ Ξ¨) tt : Sem Ξ β mor : β {Ξ} β ctx Ξ β ctx Ξ β Sem Ξ Ξ interp : β {Ξ Ξ} β Sem Ξ Ξ β ctx Ξ β ctx Ξ interp (pair eβ eβ) = β¨ interp eβ , interp eβ β© interp tt = ! interp (mor f) = f do-fst : β {Ξ Ξ Ξ¨} β Sem Ξ (Ξ ++ Ξ¨) β Sem Ξ Ξ do-fst (pair e _) = e do-fst (mor f) = mor (Οβ β f) do-snd : β {Ξ Ξ Ξ¨} β Sem Ξ (Ξ ++ Ξ¨) β Sem Ξ Ξ¨ do-snd (pair _ e) = e do-snd (mor f) = mor (Οβ β f) eval : β {Ξ Ξ Ξ¨} β Syn Ξ Ξ¨ β Sem Ξ Ξ β Sem Ξ Ξ¨ 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 β interp e) reflect : β Ξ Ξ β Sem Ξ Ξ β Syn Ξ Ξ reflect _ β e = !β² reflect _ [ x ] (mor f) = [ f β] reflect Ξ (Ξβ ++ Ξβ) e = β¨ reflect Ξ Ξβ (do-fst e) , reflect Ξ Ξβ (do-snd e) β©β² nf : β {Ξ Ξ} β Syn Ξ Ξ β Syn Ξ Ξ nf {Ξ} {Ξ} s = reflect Ξ Ξ (eval s (mor id)) interp-do-fst : β {Ξ Ξ Ξ¨} β (e : Sem Ξ (Ξ ++ Ξ¨)) β interp (do-fst e) β Οβ β interp e interp-do-fst (pair _ _) = βΊ projectβ interp-do-fst (mor _) = refl interp-do-snd : β {Ξ Ξ Ξ¨} β (e : Sem Ξ (Ξ ++ Ξ¨)) β interp (do-snd e) β Οβ β interp e interp-do-snd (pair _ _) = βΊ projectβ interp-do-snd (mor _) = refl interp-eval : β {Ξ Ξ Ξ¨} β (s : Syn Ξ Ξ¨) β (e : Sem Ξ Ξ) β interp {Ξ = Ξ} (eval s (mor id)) β interp e β interp (eval s e) interp-eval idβ² e = identityΛ‘ interp-eval (sβ ββ² sβ) e = begin (interp (eval sβ (eval sβ (mor id))) β interp e) βΛβ¨ (interp-eval sβ (eval sβ (mor id)) β©ββ¨refl) β© (interp (eval sβ (mor id)) β interp (eval sβ (mor id))) β interp e ββ¨ assoc β© interp (eval sβ (mor id)) β interp (eval sβ (mor id)) β interp e ββ¨ (reflβ©ββ¨ interp-eval sβ e) β© interp (eval sβ (mor id)) β interp (eval sβ e) ββ¨ interp-eval sβ (eval sβ e) β© interp (eval sβ (eval sβ e)) β interp-eval Οββ² e = begin (Οβ β id) β interp e ββ¨ β-resp-βΛ‘ identityΚ³ β© Οβ β interp e βΛβ¨ interp-do-fst e β© interp (do-fst e) β interp-eval Οββ² e = begin (Οβ β id) β interp e ββ¨ β-resp-βΛ‘ identityΚ³ β© Οβ β interp e βΛβ¨ interp-do-snd e β© interp (do-snd e) β interp-eval {Ξ = Ξ} {Ξ = Ξ} {Ξ¨ = Ξ¨β ++ Ξ¨β} β¨ s , sβ β©β² e = begin β¨ interp (eval s (mor id)) , interp {Ξ = Ξ} {Ξ = Ξ¨β} (eval sβ (mor (id {A = ctx Ξ}))) β© β interp e ββ¨ β-distribΚ³-β¨β© β© β¨ interp (eval s (mor id)) β interp e , interp (eval sβ (mor id)) β interp e β© ββ¨ β¨β©-congβ (interp-eval s e) (interp-eval sβ e) β© β¨ interp (eval s e) , interp (eval sβ e) β© β interp-eval !β² e = βΊ (!-unique _) interp-eval [ x β] e = β-resp-βΛ‘ identityΚ³ reflect-mor : β Ξ Ξ β (f : ctx Ξ β ctx Ξ) β [ reflect Ξ Ξ (mor f) β] β f reflect-mor _ β f = !-unique f reflect-mor _ [ x ] f = refl reflect-mor Ξ (Ξβ ++ Ξβ) f = β¨β©-congβ (reflect-mor Ξ Ξβ (Οβ β f)) (reflect-mor Ξ Ξβ (Οβ β f)) β g-Ξ· reflect-interp (pair eβ eβ) = β¨β©-congβ (reflect-interp eβ) (reflect-interp eβ) reflect-interp tt = refl reflect-interp {Ξ = Ξ} {Ξ = Ξ} (mor f) = reflect-mor Ξ Ξ f sound : β Ξ Ξ β (s : Syn Ξ Ξ) β [ nf s β] β [ s β] sound Ξ Ξ idβ² = reflect-mor Ξ Ξ id sound Ξ Ξ (sβ ββ² sβ) = begin [ reflect Ξ Ξ (eval sβ (eval sβ (mor id))) β] ββ¨ reflect-interp ((eval sβ (eval sβ (mor id)))) β© interp (eval sβ (eval sβ (mor id))) βΛβ¨ interp-eval sβ ((eval sβ (mor id))) β© (interp (eval sβ (mor id)) β interp (eval sβ (mor id))) βΛβ¨ reflect-interp (eval sβ (mor id)) β©ββ¨ reflect-interp (eval sβ (mor id)) β© ([ reflect _ Ξ (eval sβ (mor id)) β] β [ reflect Ξ _ (eval sβ (mor id)) β]) ββ¨ sound _ _ sβ β©ββ¨ sound _ _ sβ β© [ sβ β] β [ sβ β] β sound (Ξβ ++ Ξβ) Ξβ Οββ² = begin [ reflect (Ξβ ++ Ξβ) Ξβ (mor (Οβ β id)) β] ββ¨ reflect-mor (Ξβ ++ Ξβ) Ξβ (Οβ β id) β© Οβ β id ββ¨ identityΚ³ β© Οβ β sound (Ξβ ++ Ξβ) Ξβ Οββ² = begin [ reflect (Ξβ ++ Ξβ) Ξβ (mor (Οβ β id)) β] ββ¨ reflect-mor (Ξβ ++ Ξβ) Ξβ (Οβ β id) β© Οβ β id ββ¨ identityΚ³ β© Οβ β sound Ξ (Ξβ ++ Ξβ) β¨ s , sβ β©β² = β¨β©-congβ (sound Ξ Ξβ s) (sound Ξ Ξβ sβ) sound Ξ β !β² = refl sound Ξ β [ f β] = !-unique f sound Ξ [ _ ] [ f β] = identityΚ³ sound Ξ (Ξβ ++ Ξβ) [ f β] = begin β¨ [ reflect Ξ Ξβ (mor (Οβ β f β id)) β] , [ reflect Ξ Ξβ (mor (Οβ β f β id)) β] β© ββ¨ β¨β©-congβ (reflect-mor Ξ Ξβ (Οβ β f β id)) (reflect-mor Ξ Ξβ (Οβ β f β id)) β© β¨ Οβ β f β id , Οβ β f β id β© ββ¨ g-Ξ· β© f β id ββ¨ identityΚ³ β© f β