Ian Ray. 28th August 2025.
Minor changes and merged into TypeToplogy in March 2026.
We provide some basic contructions on (displayed) reflexive graphs (see index
for references to Sterling, Buchholtz, etc.)
\begin{code}
{-# OPTIONS --safe --without-K #-}
module ReflexiveGraphs.Constructions where
open import MLTT.Spartan
open import UF.Powerset-MultiUniverse
open import UF.Size
open import UF.UniverseEmbedding
open import ReflexiveGraphs.Displayed
open import ReflexiveGraphs.Type
\end{code}
Given a reflexive graph and a displayed reflexive graph over it we can define
the total reflexive graph as follows.
\begin{code}
total-refl-graph : (π : Refl-Graph π€ π₯)
β Displayed-Refl-Graph π£ π¦ π
β Refl-Graph (π€ β π£) (π₯ β π¦)
total-refl-graph {π€} {π₯} {π£} {π¦} π π = ((Ξ£ x κ β¨ π β© , βͺ π β« x) , I , II)
where
I : Ξ£ x κ β¨ π β© , βͺ π β« x
β Ξ£ x κ β¨ π β© , βͺ π β« x
β π₯ β π¦ Μ
I (a , b) (a' , b') = Ξ£ p κ a ββ¨ π β© a' , b ββ¨ π βΈ΄ p β© b'
II : (t : Ξ£ x κ β¨ π β© , βͺ π β« x)
β I t t
II (a , b) = (β-refl π a , β-disp-refl π b)
syntax total-refl-graph π π = π οΉ π
\end{code}
We define the projection map from the total reflexive graph to the base
reflexive graph.
\begin{code}
total-refl-graph-projection
: {π : Refl-Graph π€ π₯} (π : Displayed-Refl-Graph π£ π¦ π)
β Refl-Graph-Hom (π οΉ π) π
total-refl-graph-projection π = (prβ , (Ξ» t t' β prβ) , βΌ-refl)
syntax total-refl-graph-projection π = Ο π
\end{code}
We define the binary product and binary sums of reflexive graphs.
\begin{code}
refl-graph-Γ : Refl-Graph π€ π₯
β Refl-Graph π€' π₯'
β Refl-Graph (π€ β π€') (π₯ β π₯')
refl-graph-Γ {π€} {π₯} {π€'} {π₯'} π π' = ((β¨ π β© Γ β¨ π' β©) , I , II)
where
I : β¨ π β© Γ β¨ π' β© β β¨ π β© Γ β¨ π' β© β π₯ β π₯' Μ
I (x , x') (y , y') = (x ββ¨ π β© y) Γ (x' ββ¨ π' β© y')
II : (t : β¨ π β© Γ β¨ π' β©) β I t t
II (x , x') = (β-refl π x , β-refl π' x')
syntax refl-graph-Γ π π' = π β π'
refl-graph-+ : Refl-Graph π€ π₯
β Refl-Graph π€' π₯'
β Refl-Graph (π€ β π€') (π₯ β π₯')
refl-graph-+ {π€} {π₯} {π€'} {π₯'} π π' = ((β¨ π β© + β¨ π' β©) , I , II)
where
I : β¨ π β© + β¨ π' β© β β¨ π β© + β¨ π' β© β π₯ β π₯' Μ
I (inl x) (inl y) = Lift π₯' (x ββ¨ π β© y)
I (inl x) (inr y) = π
I (inr x) (inl y) = π
I (inr x) (inr y) = Lift π₯ (x ββ¨ π' β© y)
II : (t : β¨ π β© + β¨ π' β©) β I t t
II (inl x) = lift π₯' (β-refl π x)
II (inr x) = lift π₯ (β-refl π' x)
syntax refl-graph-+ π π' = π β π'
\end{code}
Of course, we can generalize to products of reflexive graphs as follows.
\begin{code}
refl-graph-Ξ : (A : π€' Μ)
β (A β Refl-Graph π€ π₯)
β Refl-Graph (π€' β π€) (π€' β π₯)
refl-graph-Ξ {π€'} {π€} {π₯} A π
= (((x : A) β β¨ π x β©) , I , II)
where
I : ((x : A) β β¨ π x β©)
β ((x : A) β β¨ π x β©)
β π€' β π₯ Μ
I f f' = (x : A) β f x ββ¨ π x β© f' x
II : (f : (x : A) β β¨ π x β©) β I f f
II f x = β-refl (π x) (f x)
syntax refl-graph-Ξ A (Ξ» x β π) = β x ΛΈ A , π
\end{code}
We define the coproduct of reflexive graphs in terms of sigma types.
\begin{code}
refl-graph-Ξ£ : (A : π€' Μ)
β (A β Refl-Graph π€ π₯)
β Refl-Graph (π€' β π€) (π€' β π₯)
refl-graph-Ξ£ {π€'} {π€} {π₯} A π
= ((Ξ£ x κ A , β¨ π x β©) , I , II)
where
I : Ξ£ x κ A , β¨ π x β©
β Ξ£ x κ A , β¨ π x β©
β π€' β π₯ Μ
I (a , b) (a' , b')
= Ξ£ p κ a οΌ a' , transport (Ξ» - β β¨ π - β©) p b ββ¨ π a' β© b'
II : (t : Ξ£ x κ A , β¨ π x β©) β I t t
II (a , b) = (refl , β-refl (π a) b)
syntax refl-graph-Ξ£ A (Ξ» x β π) = β x ΛΈ A , π
\end{code}
The tensor and cotensor of reflexive graphs can be defined in terms of product
and coproduct.
\begin{code}
cotensor-refl-graph : π€' Μ
β Refl-Graph π€ π₯
β Refl-Graph (π€' β π€) (π€' β π₯)
cotensor-refl-graph A π = β _ ΛΈ A , π
syntax cotensor-refl-graph A π = A β π
tensor-refl-graph : π€' Μ
β Refl-Graph π€ π₯
β Refl-Graph (π€' β π€) (π€' β π₯)
tensor-refl-graph A π = β _ ΛΈ A , π
\end{code}
We have a canonical discrete reflexive graph given by the identity type.
On the other end of the extreme we have the codiscrete reflexive graph.
\begin{code}
discrete-reflexive-graph : π€ Μ β Refl-Graph π€ π€
discrete-reflexive-graph A = (A , _οΌ_ , βΌ-refl)
syntax discrete-reflexive-graph A = Ξ A
codiscrete-reflexive-graph : π€ Μ β Refl-Graph π€ π€
codiscrete-reflexive-graph A = (A , (Ξ» _ _ β π) , Ξ» _ β β)
\end{code}
We can give the constant displayed reflexive graph.
\begin{code}
constant-displayed-reflexive-graph : (π : Refl-Graph π€ π₯)
β Refl-Graph π€' π₯'
β Displayed-Refl-Graph π€' π₯' π
constant-displayed-reflexive-graph {π€} {π₯} {π€'} {π₯'} π π = (I , II , β-refl π)
where
I : β¨ π β© β π€' Μ
I x = β¨ π β©
II : {x y : β¨ π β©} β x ββ¨ π β© y β β¨ π β© β β¨ π β© β π₯' Μ
II _ u v = u ββ¨ π β© v
syntax constant-displayed-reflexive-graph π π = π * π
private
observationβ : (π : Refl-Graph π€ π₯) (π : Refl-Graph π€' π₯')
β (x : β¨ π β©)
β [ π * π ] x οΌ π
observationβ π π x = refl
observationβ : (π : Refl-Graph π€ π₯) (π : Refl-Graph π€' π₯')
β π οΉ (π * π) οΌ π β π
observationβ π π = refl
\end{code}
We can retstrict a reflexive graph structure to a subset of the carrier of a
reflexive graph.
\begin{code}
refl-graph-β : (π : Refl-Graph π€ π₯)
β π {π£} β¨ π β©
β Refl-Graph (π€ β π£) π₯
refl-graph-β {π€} {π₯} {π£} π S = (π S , I , II)
where
I : π S β π S β π₯ Μ
I (x , _) (y , _) = x ββ¨ π β© y
II : (p : π S) β I p p
II (x , _) = β-refl π x
syntax refl-graph-β π S = x βΆ π β£ S x
\end{code}
We can give opposite constructions for (displayed) reflexive graphs.
\begin{code}
opposite-refl-graph : Refl-Graph π€ π₯ β Refl-Graph π€ π₯
opposite-refl-graph {π€} {π₯} π = (β¨ π β© , I , β-refl π)
where
I : β¨ π β© β β¨ π β© β π₯ Μ
I x y = y ββ¨ π β© x
syntax opposite-refl-graph π = π α΅α΅
private
observationβ : (π : Refl-Graph π€ π₯)
β (π α΅α΅) α΅α΅ οΌ π
observationβ π = refl
opposite-displayed-refl-graph
: (π : Refl-Graph π€ π₯)
β Displayed-Refl-Graph π£ π¦ π
β Displayed-Refl-Graph π£ π¦ (π α΅α΅)
opposite-displayed-refl-graph {_} {_} {_} {π¦} π π = (βͺ π β« , I , β-disp-refl π)
where
I : {x y : β¨ π β©} (p : x ββ¨ π α΅α΅ β© y)
β βͺ π β« x β βͺ π β« y β π¦ Μ
I p u v = v ββ¨ π βΈ΄ p β© u
syntax opposite-displayed-refl-graph π π = π α΅α΅ at π
private
observationβ
: (π : Refl-Graph π€ π₯) (π : Displayed-Refl-Graph π£ π¦ π)
β (π α΅α΅ at π) α΅α΅ at (π α΅α΅) οΌ π
observationβ π π = refl
\end{code}
We can define the resrtiction of an iterated displayed reflexive graphs.
\begin{code}
restriction-iterated-displayed-refl-graph
: {π : Refl-Graph π€ π₯} (π : Displayed-Refl-Graph π£ π¦ π)
β Displayed-Refl-Graph π£ π¦ (π οΉ π)
β (x : β¨ π β©)
β Displayed-Refl-Graph π£ π¦ ([ π ] x)
restriction-iterated-displayed-refl-graph {π€} {π₯} {π£} {π¦} {π} π π x
= (I , II , III)
where
I : βͺ π β« x β π£ Μ
I u = βͺ π β« (x , u)
II : {u v : βͺ π β« x} (p : u ββ¨ π βΈ΄ β-refl π x β© v)
β βͺ π β« (x , u) β βͺ π β« (x , v) β π¦ Μ
II p c c' = c ββ¨ π βΈ΄ (β-refl π x , p) β© c'
III : {u : βͺ π β« x} (c : I u)
β c ββ¨ π βΈ΄ (β-refl π x , β-disp-refl π u) β© c
III c = β-disp-refl π c
syntax restriction-iterated-displayed-refl-graph π π x = π β£ π , x
\end{code}