Source code on Github{-# OPTIONS --v equivariance:100 #-}
open import Prelude.Init
open L.Mem
open import Prelude.DecEq
open import Prelude.Functor
open import Prelude.Monad
open import Prelude.Semigroup
open import Prelude.Show
open import Prelude.Setoid
open import Prelude.Lists
open import Prelude.ToN
open import Prelude.Tactics.PostulateIt
open import Prelude.Generics
open Meta
open Debug ("equivariance" , 100)
module Nominal.Swap.Equivariance (Atom : Set) โฆ _ : DecEq Atom โฆ where
open import Nominal.Swap.Base Atom
deriveSwapDistributiveType : Bool โ Term โ TC Type
deriveSwapDistributiveType equiv? t = do
ty โ inferType t
print $ show t โ " : " โ show ty
printCurrentContext
ctx โ getContext
let
asโ = argTys ty
as = map (fmap $ mapVars (_+ 2)) asโ
n = length as
mkSwaps : Args Term โ Term
mkSwaps as = def (quote swap) $ map vArg ( โฏ (suc n) โท โฏ n โท []) ++ as
mkSwap : Opโ Term
mkSwap t = mkSwaps [ vArg t ]
mkHead : Args Term โ Term
mkHead as = case t of ฮป where
(def f asโ) โ def f (asโ ++ as)
(con c asโ) โ con c (asโ ++ as)
(var i asโ) โ var (i + 2 + n) (asโ ++ as)
_ โ unknown
mkSwapHead : Args Term โ Term
mkSwapHead as =
let
a = case t of ฮป where
(def f asโ) โ def f asโ
(con c asโ) โ con c asโ
(var i asโ) โ var (i + 2 + n) asโ
_ โ unknown
in mkSwaps (vArg a โท as)
mkTerm : Opโ Term โ Args Term
mkTerm mk = flip map (enumerate as) ฮป where
(i , arg v _) โ arg v $ mk (โฏ (n โธ suc (toโ i)))
lhs = mkSwap $ mkHead (mkTerm id)
rhs = (if equiv? then mkHead else mkSwapHead) (mkTerm mkSwap)
equivTy = vฮ [ "๐" โถ โฏ (length ctx โธ 1) ]
vฮ [ "๐" โถ โฏ (length ctx) ]
โargs as (quote _โ_ โโฆ lhs โฃ rhs โง)
print $ "Equivariant " โ show t โ " := " โ show equivTy
print "-------------------------------------------------"
return equivTy
where
โargs : Args Type โ (Type โ Type)
โargs [] = id
โargs (a โท as) t = hฮ [ "_" โถ unArg a ] โargs as t
deriveSwapโ = deriveSwapDistributiveType false
macro
Swapโ : Term โ Hole โ TC โค
Swapโ t hole = deriveSwapโ t >>= unify hole
swapโ : Term โ Hole โ TC โค
swapโ t hole = do
n โ genPostulate =<< deriveSwapโ t
unify hole (n โ)
postulateSwapโ : Name โ Term โ TC โค
postulateSwapโ f t = declarePostulate (vArg f) =<< deriveSwapโ t
macro
Equivariant : Term โ Hole โ TC โค
Equivariant t hole = deriveSwapDistributiveType true t >>= unify hole
private
data X : Set where
mkX : โ โ โ โ X
variable
๐ ๐ ๐ ๐ : Atom
postulate
n m : โ
f : โ โ โ
g : โ โ โ โ โ
instance
_ : ISetoid โ
_ : ISetoid X
_ : Swap X
_ : Swap (โ โ โ)
_ : Swap (โ โ โ โ โ)
_ : Swap (โ โ โ โ X)
module _ ๐ ๐ where postulate
distr-f : โ {n} โ
swap ๐ ๐ (f n) โ (swap ๐ ๐ f) (swap ๐ ๐ n)
equiv-f : โ {n} โ
swap ๐ ๐ (f n) โ f (swap ๐ ๐ n)
distr-g : โ {n m} โ
swap ๐ ๐ (g n m) โ (swap ๐ ๐ g) (swap ๐ ๐ n) (swap ๐ ๐ m)
equiv-g : โ {n m} โ
swap ๐ ๐ (g n m) โ g (swap ๐ ๐ n) (swap ๐ ๐ m)
distr-mkX : โ {n m} โ
swap ๐ ๐ (mkX n m) โ (swap ๐ ๐ mkX) (swap ๐ ๐ n) (swap ๐ ๐ m)
equiv-mkX : โ {n m} โ
swap ๐ ๐ (mkX n m) โ mkX (swap ๐ ๐ n) (swap ๐ ๐ m)
module _ {f : โ โ โ} ๐ ๐ where postulate
distr-โf : โ {n} โ swap ๐ ๐ (f n) โ (swap ๐ ๐ f) (swap ๐ ๐ n)
equiv-โf : โ {n} โ swap ๐ ๐ (f n) โ f (swap ๐ ๐ n)
_ = Swapโ f โ distr-f
_ = Swapโ f โ swapโ f
_ = Equivariant f โ equiv-f
_ = Swapโ g โ distr-g
_ = Swapโ g โ swapโ g
_ = Equivariant g โ equiv-g
_ = Swapโ mkX โ distr-mkX
_ = Swapโ mkX โ swapโ mkX
_ = Equivariant mkX โ equiv-mkX
module _ {f : โ โ โ} where
_ = Swapโ f โ swapโ f
_ = Swapโ f โ distr-โf
_ = Equivariant f โ equiv-โf
unquoteDecl distr-fโฒ = postulateSwapโ distr-fโฒ (quoteTerm f)
unquoteDecl distr-gโฒ = postulateSwapโ distr-gโฒ (quoteTerm g)
unquoteDecl distr-mkXโฒ = postulateSwapโ distr-mkXโฒ (quoteTerm mkX)
module _ {f : โ โ โ} where
unquoteDecl distr-โfโฒ = postulateSwapโ distr-โfโฒ (quoteTerm f)