f = g⇔∀ x . fx = gx E

(f ' g) !(h ' i) = (f ! h) '(g ! i)
f ◦ (p → g, h) = p → f ◦ g, f ◦ h
(p → f , g) ◦ h = p ◦ h → f ◦ h, g ◦ h
p → f , g = (f ! g) ◦ p?
p → f , g x = if p x then f x else g x
p? ◦ f = (f + f ) ◦ (p ◦ f )?
p? = (snd + snd) ◦ distl ◦ (outB ◦ p ' id)
T
F-L-cond
F-R-cond
D-P-cond
D-cond
F-guard
D-guard
D-const
F-1
bang ◦ f = bang
x () = x
R-1
bang = id
U-1
D-bang
f = bang
bang x = ()
N-id
D-id
f ◦ id = f = id ◦ f
id x = x
A-◦
D-◦
(f ◦ g) x = f (g x)
(f ◦ g) ◦ h = f ◦ (g ◦ h)
E-×
E-pair
E-let
I
L
E-=
f a = b ⇔ f a [(x, y) / z] = b [x / fst z, y / snd z]
a ≡ a [(x, y) / z, x / fst z, y / snd z]
let x = a in b ≡ b [x / a]
f ◦ h = g ◦ h ⇔ f = g se h é um iso
f ◦h=g◦h⇐f =g
f =g⇔∀x.f x=gx
h = f ' g ⇔ fst ◦ h = f ∧ snd ◦ h = g
D-inr
inr x = Right x
(f + g) ◦ inr = inr ◦ g
f !g = h!i ⇔ f = h ∧ g = i
(f + g) ◦ inl = inl ◦ f
id + id = id
(f + g) ◦ (h + i) = f ◦ h + g ◦ i
N-inr
N-inl
E-!
F-I-+
F-+
D-+
A-+
F-+
f ◦ (g ! h) = f ◦ g ! f ◦ h
f + g = inl ◦ f ! inr ◦ g
(f ! g) ◦ (h + i) = f ◦ h ! g ◦ i
R-+
inl ! inr = id
(f ! g) x = case x of {Left y → f y; Right z → g z} D-!
(f ! g) ◦ inl = f ∧ (f ! g) ◦ inr = g
C-+
D-inl
U-+
N-snd
N-fst
F-I-×
F-×
A-×
D-×
F-×
R-×
C-×
D-'
D-snd
D-fst
U-×
h = f ! g ⇔ h ◦ inl = f ∧ h ◦ inr = g
inl x = Left x
snd ◦ (f × g) = g ◦ snd
fst ◦ (f × g) = f ◦ fst
id × id = id
(f × g) ◦ (h ' i) = f ◦ h ' g ◦ i
(f × g) ◦ (h × i) = f ◦ h × g ◦ i
(f ' g) ◦ h = f ◦ h ' g ◦ h
f × g = f ◦ fst ' g ◦ snd
(f ' g) x = (f x, g x)
fst ◦ (f ' g) = f ∧ snd ◦ (f ' g) = g
fst ' snd = id
snd (x, y) = y
fst (x, y) = x
I-inL
*+(f ,)-µF ◦ g = *+(h),-µF ⇐ f ◦ g = F g ◦ h
*+(outµF ,)-µF = id
F-ana
R-ana
C-ana
U-ana
h = *+(f ,)-µF ⇔ outµF h = F h ◦ f
outµF ◦ *+(f ,)-µF = F *+(f ,)-µF ◦ f
S-cata
F-cata
R-cata
C-cata
U-cata
I-in
F-anaL
R-anaL
(|f |)µF '(|g|)µF = (|f ◦ F fst ' g ◦ F snd|)µF
f ◦ (|g|)µF = (|h|)µF ⇐ f ◦ g = h ◦ F f
(|inµF |)µF = id
(|f |)µF ◦ inµF = f ◦ F (|f |)µF
h = (|f |)µF ⇔ h ◦ inµF = f ◦ F h
inµF ◦ outµF = id = outµF ◦ inµF
*+(f ,)-L ◦ g = *+(h),-L ⇐ f ◦ g = (id + id × g) ◦ h
*+(outL ,)-L = id
C-anaL
U-anaL
h = *+(f ,)-L ⇔ outL ◦ h = (id + id × h) ◦ f
outL ◦ *+(f ,)-L = (id + id × *+(f ,)-L ) ◦ f
S-cataL
F-cataL
R-cataL
C-cataL
U-cataL
D-outL
D-inL
(|f |)L '(|g|)L = (|f ◦ (id + id × fst) ' g ◦ (id + id × snd)|)L
f ◦ (|g|)L = (|h|)L ⇐ f ◦ g = h ◦ (id + id × f )
(|inL |)L = id
(|f |)L ◦ inL = f ◦ (id + id × (|f |)L )
h = (|f |)L ⇔ h ◦ inL = f ◦ (id + id × h)
outL = (bang + (head ' tail)) ◦ null?
inL = [ ] ! cons
inL ◦ outL = id = outL ◦ inL
do {x ← a; b} = x >>= (λa → b)
join x = x >
>= id
x >>= f = (join ◦ F f ) x
(f ◦ g) • h = f • (F g ◦ h)
(f • g) ◦ h = f • (g ◦ h)
return • f = f = f • return
f • (g • h) = (f • g) • h
f • g = join ◦ F f ◦ g
return ◦ f = F f ◦ return
join ◦ F F f = F f ◦ join
join ◦ return = id = join ◦ F return
join ◦ join = join ◦ F join
F id = id
F (g ◦ h) = F g ◦ F h
D-do
D-join
D->>=
A-◦•
A-•◦
U-•
A-•
D-•
N-join
N-return
J-return
J-join
F-I-F
F-F