I am reading the lectures about cubical type theory in this github repo. In lecture 1 the author defines function extensionality the following way:
funExt (A B : U) (f g : A -> B)
(p : (x : A) -> Path B (f x) (g x)) :
Path (A -> B) f g = <i> \(a : A) -> (p a) @ i
and writes
To see that this makes sense compute the end-points of the path:
(<i> \(a : A) -> (p a) @ i) @ 0 = \(a : A) -> (p a) @ 0
= \(a : A) -> f a
= f
I don't follow. Specifically, when we replace (p a) @ 0
with f a
in my mind we use the following fact: \(a : A) -> (p a) @ 0 = f a
to rewrite (let's give names to the left and right side) fpa = \(a : A) -> (p a) @ 0
into fa = \(a : A) -> f a
. But isn't this by itself using function extensionality with f = fpa, g = fa
?
If I am not mistaken, this argument is circular. Can anyone clarify?