open import SOAS.Common
open import SOAS.Families.Core
open import Categories.Object.Initial
open import SOAS.Coalgebraic.Strength
import SOAS.Metatheory.MetaAlgebra
module SOAS.Metatheory.Traversal {T : Set}
(โ
F : Functor ๐ฝamiliesโ ๐ฝamiliesโ) (โ
:Str : Strength โ
F)
(๐ : Familyโ) (open SOAS.Metatheory.MetaAlgebra โ
F ๐)
(๐:Init : Initial ๐etaAlgebras)
where
open import SOAS.Context
open import SOAS.Variable
open import SOAS.Abstract.Hom
import SOAS.Abstract.Coalgebra as โโก ; open โโก.Sorted
import SOAS.Abstract.Box as โก ; open โก.Sorted
open import SOAS.Metatheory.Algebra โ
F
open import SOAS.Metatheory.Semantics โ
F โ
:Str ๐ ๐:Init
open Strength โ
:Str
private
variable
ฮ ฮ ฮ ฮ : Ctx
ฮฑ ฮฒ : T
๐ซ ๐ฌ ๐ : Familyโ
module Traversal (๐ซแดฎ : Coalgโ ๐ซ)(๐๐๐ : โ
๐ โพฬฃ ๐)
(ฯ : ๐ซ โพฬฃ ๐)(ฯ : ๐ โพฬฃ ใ ๐ , ๐ ใ) where
open Coalgโ ๐ซแดฎ
๐แต : MetaAlg ๐
๐แต = record { ๐๐๐ = ๐๐๐ ; ๐ฃ๐๐ = ฮป x โ ฯ (ฮท x) ; ๐๐ฃ๐๐ = ฯ }
Travแต : MetaAlg ใ ๐ซ , ๐ ใ
Travแต = record
{ ๐๐๐ = ฮป t ฯ โ ๐๐๐ (str ๐ซแดฎ ๐ t ฯ)
; ๐ฃ๐๐ = ฮป x ฯ โ ฯ (ฯ x)
; ๐๐ฃ๐๐ = ฮป ๐ช ฮต ฯ โ ฯ ๐ช (ฮป ๐ซ โ ฮต ๐ซ ฯ)
}
Travแต : Coalg ใ ๐ซ , ๐ ใ
Travแต = record { r = ฮป h ฯ ฯ โ h (ฯ โ ฯ) ; counit = refl ; comult = refl }
Travแดฎ : Coalgโ ใ ๐ซ , ๐ ใ
Travแดฎ = record { แต = Travแต ; ฮท = ฮป x ฯ โ ฯ (ฯ x) ; rโฮท = refl }
open Semantics Travแต public renaming (๐ค๐๐ to ๐ฅ๐ฃ๐๐ง)
๐ฅโจ๐งโฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{x : โ ฮฑ ฮ} โ ๐ฅ๐ฃ๐๐ง (๐ง๐๐ฃ x) ฯ โก ฯ (ฯ x)
๐ฅโจ๐งโฉ {ฯ = ฯ} = cong (ฮป - โ - ฯ) โจ๐งโฉ
๐ฅโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ ๐ฅ๐ฃ๐๐ง (๐๐ง๐๐ฃ ๐ช ฮต) ฯ โก ฯ ๐ช (ฮป p โ ๐ฅ๐ฃ๐๐ง (ฮต p) ฯ)
๐ฅโจ๐โฉ {ฯ = ฯ} = cong (ฮป - โ - ฯ) โจ๐โฉ
๐ฅโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{t : โ
๐ ฮฑ ฮ}
โ ๐ฅ๐ฃ๐๐ง (๐๐๐ t) ฯ โก ๐๐๐ (str ๐ซแดฎ ๐ (โ
โ ๐ฅ๐ฃ๐๐ง t) ฯ)
๐ฅโจ๐โฉ {ฯ = ฯ} = cong (ฮป - โ - ฯ) โจ๐โฉ
๐ฅโโ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{tโ tโ : ๐ ฮฑ ฮ} โ tโ โก tโ โ ๐ฅ๐ฃ๐๐ง tโ ฯ โก ๐ฅ๐ฃ๐๐ง tโ ฯ
๐ฅโโ {ฯ = ฯ} p = cong (ฮป - โ ๐ฅ๐ฃ๐๐ง - ฯ) p
๐ฅโโ : {ฯโ ฯโ : ฮ ~[ ๐ซ ]โ ฮ}{t : ๐ ฮฑ ฮ}
โ ({ฯ : T}{x : โ ฯ ฮ} โ ฯโ x โก ฯโ x)
โ ๐ฅ๐ฃ๐๐ง t ฯโ โก ๐ฅ๐ฃ๐๐ง t ฯโ
๐ฅโโ {t = t} p = cong (๐ฅ๐ฃ๐๐ง t) (dextโฒ p)
module โกTraversal {๐} (๐แต : MetaAlg ๐) =
Traversal โแดฎ (MetaAlg.๐๐๐ ๐แต) (MetaAlg.๐ฃ๐๐ ๐แต) (MetaAlg.๐๐ฃ๐๐ ๐แต)
โกแต : (๐แต : MetaAlg ๐) โ MetaAlg (โก ๐)
โกแต = โกTraversal.Travแต
record MapEqโ (๐ : Familyโ)(f g : ๐ โพฬฃ ๐) : Set where
field
แต : MetaAlg ๐
open Semantics แต
open ๐
field
fโจ๐ฃโฉ : {x : โ ฮฑ ฮ}
โ f (๐ง๐๐ฃ x) โก ๐ฃ๐๐ x
fโจ๐โฉ : {๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ f (๐๐ง๐๐ฃ ๐ช ฮต) โก ๐๐ฃ๐๐ ๐ช (f โ ฮต)
fโจ๐โฉ : {t : โ
๐ ฮฑ ฮ}
โ f (๐๐๐ t) โก ๐๐๐ (โ
โ f t)
gโจ๐ฃโฉ : {x : โ ฮฑ ฮ}
โ g (๐ง๐๐ฃ x) โก ๐ฃ๐๐ x
gโจ๐โฉ : {๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ g (๐๐ง๐๐ฃ ๐ช ฮต) โก ๐๐ฃ๐๐ ๐ช (g โ ฮต)
gโจ๐โฉ : {t : โ
๐ ฮฑ ฮ}
โ g (๐๐๐ t) โก ๐๐๐ (โ
โ g t)
fแต : MetaAlgโ ๐แต แต f
fแต = record { โจ๐๐๐โฉ = fโจ๐โฉ ; โจ๐ฃ๐๐โฉ = fโจ๐ฃโฉ ; โจ๐๐ฃ๐๐โฉ = fโจ๐โฉ }
gแต : MetaAlgโ ๐แต แต g
gแต = record { โจ๐๐๐โฉ = gโจ๐โฉ ; โจ๐ฃ๐๐โฉ = gโจ๐ฃโฉ ; โจ๐๐ฃ๐๐โฉ = gโจ๐โฉ }
โ : (t : ๐ ฮฑ ฮ) โ f t โก g t
โ t = eq fแต gแต t
record MapEqโ (๐ซแดฎ : Coalgโ ๐ซ)(๐๐๐ : โ
๐ โพฬฃ ๐)
(f g : ๐ โพฬฃ ใ ๐ซ , ๐ ใ) : Set where
field
ฯ : ๐ซ โพฬฃ ๐
ฯ : ๐ โพฬฃ ใ ๐ , ๐ ใ
open Traversal ๐ซแดฎ ๐๐๐ ฯ ฯ
field
fโจ๐ฃโฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{x : โ ฮฑ ฮ}
โ f (๐ง๐๐ฃ x) ฯ โก ฯ (ฯ x)
fโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ f (๐๐ง๐๐ฃ ๐ช ฮต) ฯ โก ฯ ๐ช (ฮป p โ f (ฮต p) ฯ)
fโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{t : โ
๐ ฮฑ ฮ}
โ f (๐๐๐ t) ฯ โก ๐๐๐ (str ๐ซแดฎ ๐ (โ
โ f t) ฯ)
gโจ๐ฃโฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{x : โ ฮฑ ฮ}
โ g (๐ง๐๐ฃ x) ฯ โก ฯ (ฯ x)
gโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ g (๐๐ง๐๐ฃ ๐ช ฮต) ฯ โก ฯ ๐ช (ฮป p โ g (ฮต p) ฯ)
gโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{t : โ
๐ ฮฑ ฮ}
โ g (๐๐๐ t) ฯ โก ๐๐๐ (str ๐ซแดฎ ๐ (โ
โ g t) ฯ)
fแต : MetaAlgโ ๐แต Travแต f
fแต = record { โจ๐๐๐โฉ = dextโฒ fโจ๐โฉ ; โจ๐ฃ๐๐โฉ = dextโฒ fโจ๐ฃโฉ ; โจ๐๐ฃ๐๐โฉ = dextโฒ fโจ๐โฉ }
gแต : MetaAlgโ ๐แต Travแต g
gแต = record { โจ๐๐๐โฉ = dextโฒ gโจ๐โฉ ; โจ๐ฃ๐๐โฉ = dextโฒ gโจ๐ฃโฉ ; โจ๐๐ฃ๐๐โฉ = dextโฒ gโจ๐โฉ }
โ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}(t : ๐ ฮฑ ฮ) โ f t ฯ โก g t ฯ
โ {ฯ = ฯ} t = cong (ฮป - โ - ฯ) (eq fแต gแต t)
record MapEqโ (๐ซแดฎ : Coalgโ ๐ซ)(๐ฌแดฎ : Coalgโ ๐ฌ)(๐๐๐ : โ
๐ โพฬฃ ๐)
(f g : ๐ โพฬฃ ใ ๐ซ , ใ ๐ฌ , ๐ ใ ใ) : Set where
field
ฯ : ๐ฌ โพฬฃ ๐
ฯ : ๐ซ โพฬฃ ใ ๐ฌ , ๐ ใ
ฯ : ๐ โพฬฃ ใ ๐ , ๐ ใ
open Traversal ๐ซแดฎ (Traversal.๐.๐๐๐ ๐ฌแดฎ ๐๐๐ ฯ ฯ) ฯ (ฮป ๐ช ฮต ฯ โ ฯ ๐ช (ฮป ๐ซ โ ฮต ๐ซ ฯ))
field
fโจ๐ฃโฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{x : โ ฮฑ ฮ}
โ f (๐ง๐๐ฃ x) ฯ ฯ โก ฯ (ฯ x) ฯ
fโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ f (๐๐ง๐๐ฃ ๐ช ฮต) ฯ ฯ โก ฯ ๐ช (ฮป ๐ซ โ f (ฮต ๐ซ) ฯ ฯ)
fโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{t : โ
๐ ฮฑ ฮ}
โ f (๐๐๐ t) ฯ ฯ โก ๐๐๐ (str ๐ฌแดฎ ๐ (str ๐ซแดฎ ใ ๐ฌ , ๐ ใ (โ
โ f t) ฯ) ฯ)
gโจ๐ฃโฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{x : โ ฮฑ ฮ}
โ g (๐ง๐๐ฃ x) ฯ ฯ โก ฯ (ฯ x) ฯ
gโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{๐ช : ๐ ฮฑ ฮ }{ฮต : ฮ ~[ ๐ ]โ ฮ}
โ g (๐๐ง๐๐ฃ ๐ช ฮต) ฯ ฯ โก ฯ ๐ช (ฮป ๐ซ โ g (ฮต ๐ซ) ฯ ฯ)
gโจ๐โฉ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}{t : โ
๐ ฮฑ ฮ}
โ g (๐๐๐ t) ฯ ฯ โก ๐๐๐ (str ๐ฌแดฎ ๐ (str ๐ซแดฎ ใ ๐ฌ , ๐ ใ (โ
โ g t) ฯ) ฯ)
fแต : MetaAlgโ ๐แต Travแต f
fแต = record { โจ๐๐๐โฉ = dextโฒ (dextโฒ fโจ๐โฉ) ; โจ๐ฃ๐๐โฉ = dextโฒ (dextโฒ fโจ๐ฃโฉ)
; โจ๐๐ฃ๐๐โฉ = dextโฒ (dextโฒ fโจ๐โฉ) }
gแต : MetaAlgโ ๐แต Travแต g
gแต = record { โจ๐๐๐โฉ = dextโฒ (dextโฒ gโจ๐โฉ) ; โจ๐ฃ๐๐โฉ = dextโฒ (dextโฒ gโจ๐ฃโฉ)
; โจ๐๐ฃ๐๐โฉ = dextโฒ (dextโฒ gโจ๐โฉ) }
โ : {ฯ : ฮ ~[ ๐ซ ]โ ฮ}{ฯ : ฮ ~[ ๐ฌ ]โ ฮ}(t : ๐ ฮฑ ฮ) โ f t ฯ ฯ โก g t ฯ ฯ
โ {ฯ = ฯ}{ฯ} t = cong (ฮป - โ - ฯ ฯ) (eq fแต gแต t)
module _ (๐ซแดฎ : Coalgโ ๐ซ)(๐แต : MetaAlg ๐)(ฯ : ๐ซ โพฬฃ ๐) where
open MetaAlg ๐แต
open Coalgโ ๐ซแดฎ
open Semantics ๐แต
open Traversal ๐ซแดฎ ๐๐๐ ฯ ๐๐ฃ๐๐ using (๐ฅ๐ฃ๐๐ง ; ๐ฅโจ๐โฉ ; ๐ฅโจ๐งโฉ ; ๐ฅโจ๐โฉ)
open โก-Reasoning
๐ฅ๐ฃ๐๐ง-ฮทโ๐ค๐๐ : (ฯโฮทโ๐ฃ๐๐ : โ{ฮฑ ฮ}{v : โ ฮฑ ฮ} โ ฯ (ฮท v) โก ๐ฃ๐๐ v){t : ๐ ฮฑ ฮ}
โ ๐ฅ๐ฃ๐๐ง t ฮท โก ๐ค๐๐ t
๐ฅ๐ฃ๐๐ง-ฮทโ๐ค๐๐ ฯโฮทโ๐ฃ๐๐ {t = t} = Semantics.eq ๐แต (record
{ โจ๐๐๐โฉ = ฮป{ {t = t} โ trans ๐ฅโจ๐โฉ (cong ๐๐๐ (begin
str ๐ซแดฎ ๐ (โ
โ ๐ฅ๐ฃ๐๐ง t) ฮท
โกโจ str-natโ (ฮทแดฎโ ๐ซแดฎ) (โ
โ ๐ฅ๐ฃ๐๐ง t) id โฉ
str โแดฎ ๐ (โ
โ (ฮป{ h ฯ โ h (ฮท โ ฯ)}) ((โ
โ ๐ฅ๐ฃ๐๐ง t))) id
โกโจ str-unit ๐ ((โ
โ (ฮป{ h ฯ โ h (ฮท โ ฯ)}) ((โ
โ ๐ฅ๐ฃ๐๐ง t)))) โฉ
โ
โ (i ๐) (โ
โ (ฮป { h ฯ โ h (ฮท โ ฯ) }) (โ
โ ๐ฅ๐ฃ๐๐ง t))
โกหโจ trans โ
.homomorphism โ
.homomorphism โฉ
โ
โ (ฮป t โ ๐ฅ๐ฃ๐๐ง t ฮท) t
โ))}
; โจ๐ฃ๐๐โฉ = ฮป{ {v = v} โ trans ๐ฅโจ๐งโฉ ฯโฮทโ๐ฃ๐๐ }
; โจ๐๐ฃ๐๐โฉ = ฮป{ {๐ช}{ฮต} โ ๐ฅโจ๐โฉ } }) ๐ค๐๐แตโ t
๐ฅ๐ฃ๐๐ง-ฮทโid : (๐ซแดฎ : Coalgโ ๐ซ)(open Coalgโ ๐ซแดฎ)(ฯ : ๐ซ โพฬฃ ๐)
(ฯโฮทโ๐ฃ๐๐ : โ{ฮฑ ฮ}{v : โ ฮฑ ฮ} โ ฯ (ฮท v) โก ๐ง๐๐ฃ v){t : ๐ ฮฑ ฮ}
โ Traversal.๐ฅ๐ฃ๐๐ง ๐ซแดฎ ๐๐๐ ฯ ๐๐ง๐๐ฃ t ฮท โก t
๐ฅ๐ฃ๐๐ง-ฮทโid ๐ซแดฎ ฯ ฯโฮทโ๐ฃ๐๐ = trans (๐ฅ๐ฃ๐๐ง-ฮทโ๐ค๐๐ ๐ซแดฎ ๐แต ฯ ฯโฮทโ๐ฃ๐๐) ๐ค๐๐-id
โก๐ฅ๐ฃ๐๐ง-idโ๐ค๐๐ : (๐แต : MetaAlgย ๐){t : ๐ ฮฑ ฮ}
โ โกTraversal.๐ฅ๐ฃ๐๐ง ๐แต t id โก Semantics.๐ค๐๐ ๐แต t
โก๐ฅ๐ฃ๐๐ง-idโ๐ค๐๐ ๐แต {t} = ๐ฅ๐ฃ๐๐ง-ฮทโ๐ค๐๐ โแดฎ ๐แต (MetaAlg.๐ฃ๐๐ ๐แต) refl
โก๐ฅ๐ฃ๐๐ง-idโid : {t : ๐ ฮฑ ฮ} โ โกTraversal.๐ฅ๐ฃ๐๐ง ๐แต t id โก t
โก๐ฅ๐ฃ๐๐ง-idโid = ๐ฅ๐ฃ๐๐ง-ฮทโid โแดฎ ๐ง๐๐ฃ refl