Interval extensionality?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I asked the following question on the CS SE:
For example, in the proof of lemma 6.4.1 in the HoTT book, a function
inductively defined over a function is simply applied on pathsloop
andrefl, and then a path betweenloopandreflis used
(presumably by congruence viaf) to construct a path betweenf loopandf refl:
Suppose that
loop = refl base. [...] withx : Aandp : x = x, there is a functionf : S1 → Adefined byf(base) :≡ xand
f(loop) := p, we have
p = f(loop) = f(refl base) = refl x.
But in a cubical setting, things are not so clear-cut.
f(loop)is
not well-typed, onlyf(loop i)is, for somei : I. But then that
above proof becomes
p = <i> f (loop i) = <i> f (refl base i) = refl x
but doesn't that need some kind of "interval extensionality" in the
middle step? What exactly is the justification of the middle step in
cubical type theory? I can see how to prove∀ i → f (loop i) = f (refl base i), but how does one "lift" that to<i> f (loop i) = <i> f (refl base i)?
I haven't received a response there so I'm going to try here, with concrete Agda code to back it.
I am trying to turn the above proof into Cubical Agda as follows. First, given p, the definition of f is straightforward:
hyp : loop ≡ refl {x = base}
p : x ≡ x
f : S¹ → A
f base = x
f (loop i) = p i
We can prove pointwise along loop that f (loop i) ≡ f (refl i):
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = cong (λ p → f (p i)) hyp
(to see why, here it is in more detail:
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = begin
f (loop i) ≡⟨ cong (λ p → f (p i)) hyp ⟩
f (refl {x = base} i) ≡⟨⟩
f base ∎
)
but if I try to prove it for the whole thing:
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i → proofAt i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
it fails, I would think because of the "interval extensionality" I am trying to use:
Cannot instantiate the metavariable
_342to solutionf (loop i) ≡ f basesince it contains the variableiwhich is not in scope of the
metavariable or irrelevant in the metavariable but relevant in the
solution
when checking that the expression
proofAt ihas type_A_342
trying to eta-convert it to just proofAt_ also fails, but for a different reason (and I think there is, in general, no eta conversion for paths):
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ proofAt_ ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
((i : I) → f (loop i) ≡ f base)!=<_344 ≡ _y_345of type
;Agda.Primitive.Setω
So, what is the correct CTT transliteration of the above HoTT proof?
agda cubical-type-theory homotopy-type-theory
add a comment |
I asked the following question on the CS SE:
For example, in the proof of lemma 6.4.1 in the HoTT book, a function
inductively defined over a function is simply applied on pathsloop
andrefl, and then a path betweenloopandreflis used
(presumably by congruence viaf) to construct a path betweenf loopandf refl:
Suppose that
loop = refl base. [...] withx : Aandp : x = x, there is a functionf : S1 → Adefined byf(base) :≡ xand
f(loop) := p, we have
p = f(loop) = f(refl base) = refl x.
But in a cubical setting, things are not so clear-cut.
f(loop)is
not well-typed, onlyf(loop i)is, for somei : I. But then that
above proof becomes
p = <i> f (loop i) = <i> f (refl base i) = refl x
but doesn't that need some kind of "interval extensionality" in the
middle step? What exactly is the justification of the middle step in
cubical type theory? I can see how to prove∀ i → f (loop i) = f (refl base i), but how does one "lift" that to<i> f (loop i) = <i> f (refl base i)?
I haven't received a response there so I'm going to try here, with concrete Agda code to back it.
I am trying to turn the above proof into Cubical Agda as follows. First, given p, the definition of f is straightforward:
hyp : loop ≡ refl {x = base}
p : x ≡ x
f : S¹ → A
f base = x
f (loop i) = p i
We can prove pointwise along loop that f (loop i) ≡ f (refl i):
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = cong (λ p → f (p i)) hyp
(to see why, here it is in more detail:
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = begin
f (loop i) ≡⟨ cong (λ p → f (p i)) hyp ⟩
f (refl {x = base} i) ≡⟨⟩
f base ∎
)
but if I try to prove it for the whole thing:
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i → proofAt i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
it fails, I would think because of the "interval extensionality" I am trying to use:
Cannot instantiate the metavariable
_342to solutionf (loop i) ≡ f basesince it contains the variableiwhich is not in scope of the
metavariable or irrelevant in the metavariable but relevant in the
solution
when checking that the expression
proofAt ihas type_A_342
trying to eta-convert it to just proofAt_ also fails, but for a different reason (and I think there is, in general, no eta conversion for paths):
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ proofAt_ ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
((i : I) → f (loop i) ≡ f base)!=<_344 ≡ _y_345of type
;Agda.Primitive.Setω
So, what is the correct CTT transliteration of the above HoTT proof?
agda cubical-type-theory homotopy-type-theory
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06
add a comment |
I asked the following question on the CS SE:
For example, in the proof of lemma 6.4.1 in the HoTT book, a function
inductively defined over a function is simply applied on pathsloop
andrefl, and then a path betweenloopandreflis used
(presumably by congruence viaf) to construct a path betweenf loopandf refl:
Suppose that
loop = refl base. [...] withx : Aandp : x = x, there is a functionf : S1 → Adefined byf(base) :≡ xand
f(loop) := p, we have
p = f(loop) = f(refl base) = refl x.
But in a cubical setting, things are not so clear-cut.
f(loop)is
not well-typed, onlyf(loop i)is, for somei : I. But then that
above proof becomes
p = <i> f (loop i) = <i> f (refl base i) = refl x
but doesn't that need some kind of "interval extensionality" in the
middle step? What exactly is the justification of the middle step in
cubical type theory? I can see how to prove∀ i → f (loop i) = f (refl base i), but how does one "lift" that to<i> f (loop i) = <i> f (refl base i)?
I haven't received a response there so I'm going to try here, with concrete Agda code to back it.
I am trying to turn the above proof into Cubical Agda as follows. First, given p, the definition of f is straightforward:
hyp : loop ≡ refl {x = base}
p : x ≡ x
f : S¹ → A
f base = x
f (loop i) = p i
We can prove pointwise along loop that f (loop i) ≡ f (refl i):
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = cong (λ p → f (p i)) hyp
(to see why, here it is in more detail:
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = begin
f (loop i) ≡⟨ cong (λ p → f (p i)) hyp ⟩
f (refl {x = base} i) ≡⟨⟩
f base ∎
)
but if I try to prove it for the whole thing:
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i → proofAt i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
it fails, I would think because of the "interval extensionality" I am trying to use:
Cannot instantiate the metavariable
_342to solutionf (loop i) ≡ f basesince it contains the variableiwhich is not in scope of the
metavariable or irrelevant in the metavariable but relevant in the
solution
when checking that the expression
proofAt ihas type_A_342
trying to eta-convert it to just proofAt_ also fails, but for a different reason (and I think there is, in general, no eta conversion for paths):
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ proofAt_ ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
((i : I) → f (loop i) ≡ f base)!=<_344 ≡ _y_345of type
;Agda.Primitive.Setω
So, what is the correct CTT transliteration of the above HoTT proof?
agda cubical-type-theory homotopy-type-theory
I asked the following question on the CS SE:
For example, in the proof of lemma 6.4.1 in the HoTT book, a function
inductively defined over a function is simply applied on pathsloop
andrefl, and then a path betweenloopandreflis used
(presumably by congruence viaf) to construct a path betweenf loopandf refl:
Suppose that
loop = refl base. [...] withx : Aandp : x = x, there is a functionf : S1 → Adefined byf(base) :≡ xand
f(loop) := p, we have
p = f(loop) = f(refl base) = refl x.
But in a cubical setting, things are not so clear-cut.
f(loop)is
not well-typed, onlyf(loop i)is, for somei : I. But then that
above proof becomes
p = <i> f (loop i) = <i> f (refl base i) = refl x
but doesn't that need some kind of "interval extensionality" in the
middle step? What exactly is the justification of the middle step in
cubical type theory? I can see how to prove∀ i → f (loop i) = f (refl base i), but how does one "lift" that to<i> f (loop i) = <i> f (refl base i)?
I haven't received a response there so I'm going to try here, with concrete Agda code to back it.
I am trying to turn the above proof into Cubical Agda as follows. First, given p, the definition of f is straightforward:
hyp : loop ≡ refl {x = base}
p : x ≡ x
f : S¹ → A
f base = x
f (loop i) = p i
We can prove pointwise along loop that f (loop i) ≡ f (refl i):
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = cong (λ p → f (p i)) hyp
(to see why, here it is in more detail:
proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = begin
f (loop i) ≡⟨ cong (λ p → f (p i)) hyp ⟩
f (refl {x = base} i) ≡⟨⟩
f base ∎
)
but if I try to prove it for the whole thing:
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i → proofAt i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
it fails, I would think because of the "interval extensionality" I am trying to use:
Cannot instantiate the metavariable
_342to solutionf (loop i) ≡ f basesince it contains the variableiwhich is not in scope of the
metavariable or irrelevant in the metavariable but relevant in the
solution
when checking that the expression
proofAt ihas type_A_342
trying to eta-convert it to just proofAt_ also fails, but for a different reason (and I think there is, in general, no eta conversion for paths):
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ proofAt_ ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
((i : I) → f (loop i) ≡ f base)!=<_344 ≡ _y_345of type
;Agda.Primitive.Setω
So, what is the correct CTT transliteration of the above HoTT proof?
agda cubical-type-theory homotopy-type-theory
agda cubical-type-theory homotopy-type-theory
asked Nov 25 '18 at 3:07
CactusCactus
18.9k848113
18.9k848113
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06
add a comment |
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06
add a comment |
2 Answers
2
active
oldest
votes
Paths do have eta rules
https://github.com/Saizan/cubical-demo/blob/master/examples/Cubical/Examples/AIM_Demo/DemoPath.agda#L59
however the type path is not the same as the type of functions from the interval "I", so sometimes you need a lambda abstraction just to convert between the two types. (Lambda and application are ad-hoc overloaded between the two types).
f loop indeed does not typecheck, not in even in HoTT. However the book uses it as a shorthand for ap f loop, where ap = cong from the cubical library.
Also, your proof can be completed, but you need to use proofAt_ correctly: the i dimension in proof is the one connecting cong f loop and refl {x = f base}, so you want to provide i as the second argument of proofAt_.
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i j → proofAt j i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
add a comment |
See Saizan's answer for a solution along the original lines. Alternatively, there is a simple solution:
proof : p ≡ refl
proof i j = f (hyp i j)
Or proof = cong (cong f) hyp. The key is that hyp is two-dimensional, and f acts on 0-dimensional elements, so f should be applied to the 0-dimensional components of hyp.
2
Functions(i : I) -> Aare not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.
– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53464314%2finterval-extensionality%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Paths do have eta rules
https://github.com/Saizan/cubical-demo/blob/master/examples/Cubical/Examples/AIM_Demo/DemoPath.agda#L59
however the type path is not the same as the type of functions from the interval "I", so sometimes you need a lambda abstraction just to convert between the two types. (Lambda and application are ad-hoc overloaded between the two types).
f loop indeed does not typecheck, not in even in HoTT. However the book uses it as a shorthand for ap f loop, where ap = cong from the cubical library.
Also, your proof can be completed, but you need to use proofAt_ correctly: the i dimension in proof is the one connecting cong f loop and refl {x = f base}, so you want to provide i as the second argument of proofAt_.
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i j → proofAt j i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
add a comment |
Paths do have eta rules
https://github.com/Saizan/cubical-demo/blob/master/examples/Cubical/Examples/AIM_Demo/DemoPath.agda#L59
however the type path is not the same as the type of functions from the interval "I", so sometimes you need a lambda abstraction just to convert between the two types. (Lambda and application are ad-hoc overloaded between the two types).
f loop indeed does not typecheck, not in even in HoTT. However the book uses it as a shorthand for ap f loop, where ap = cong from the cubical library.
Also, your proof can be completed, but you need to use proofAt_ correctly: the i dimension in proof is the one connecting cong f loop and refl {x = f base}, so you want to provide i as the second argument of proofAt_.
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i j → proofAt j i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
add a comment |
Paths do have eta rules
https://github.com/Saizan/cubical-demo/blob/master/examples/Cubical/Examples/AIM_Demo/DemoPath.agda#L59
however the type path is not the same as the type of functions from the interval "I", so sometimes you need a lambda abstraction just to convert between the two types. (Lambda and application are ad-hoc overloaded between the two types).
f loop indeed does not typecheck, not in even in HoTT. However the book uses it as a shorthand for ap f loop, where ap = cong from the cubical library.
Also, your proof can be completed, but you need to use proofAt_ correctly: the i dimension in proof is the one connecting cong f loop and refl {x = f base}, so you want to provide i as the second argument of proofAt_.
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i j → proofAt j i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
Paths do have eta rules
https://github.com/Saizan/cubical-demo/blob/master/examples/Cubical/Examples/AIM_Demo/DemoPath.agda#L59
however the type path is not the same as the type of functions from the interval "I", so sometimes you need a lambda abstraction just to convert between the two types. (Lambda and application are ad-hoc overloaded between the two types).
f loop indeed does not typecheck, not in even in HoTT. However the book uses it as a shorthand for ap f loop, where ap = cong from the cubical library.
Also, your proof can be completed, but you need to use proofAt_ correctly: the i dimension in proof is the one connecting cong f loop and refl {x = f base}, so you want to provide i as the second argument of proofAt_.
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i j → proofAt j i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
edited Nov 30 '18 at 15:21
Cactus
18.9k848113
18.9k848113
answered Nov 26 '18 at 9:25
SaizanSaizan
72434
72434
add a comment |
add a comment |
See Saizan's answer for a solution along the original lines. Alternatively, there is a simple solution:
proof : p ≡ refl
proof i j = f (hyp i j)
Or proof = cong (cong f) hyp. The key is that hyp is two-dimensional, and f acts on 0-dimensional elements, so f should be applied to the 0-dimensional components of hyp.
2
Functions(i : I) -> Aare not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.
– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
add a comment |
See Saizan's answer for a solution along the original lines. Alternatively, there is a simple solution:
proof : p ≡ refl
proof i j = f (hyp i j)
Or proof = cong (cong f) hyp. The key is that hyp is two-dimensional, and f acts on 0-dimensional elements, so f should be applied to the 0-dimensional components of hyp.
2
Functions(i : I) -> Aare not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.
– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
add a comment |
See Saizan's answer for a solution along the original lines. Alternatively, there is a simple solution:
proof : p ≡ refl
proof i j = f (hyp i j)
Or proof = cong (cong f) hyp. The key is that hyp is two-dimensional, and f acts on 0-dimensional elements, so f should be applied to the 0-dimensional components of hyp.
See Saizan's answer for a solution along the original lines. Alternatively, there is a simple solution:
proof : p ≡ refl
proof i j = f (hyp i j)
Or proof = cong (cong f) hyp. The key is that hyp is two-dimensional, and f acts on 0-dimensional elements, so f should be applied to the 0-dimensional components of hyp.
edited Nov 26 '18 at 9:45
answered Nov 25 '18 at 8:52
András KovácsAndrás Kovács
25.3k33784
25.3k33784
2
Functions(i : I) -> Aare not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.
– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
add a comment |
2
Functions(i : I) -> Aare not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.
– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
2
2
Functions
(i : I) -> A are not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.– Saizan
Nov 26 '18 at 9:27
Functions
(i : I) -> A are not just higher-order syntax, they have straightforward semantics in the cubical sets model and are occasionally quite convenient.– Saizan
Nov 26 '18 at 9:27
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
@Saizan thanks, I'm deferring to experts in this matter (removed my speculations).
– András Kovács
Nov 26 '18 at 9:44
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53464314%2finterval-extensionality%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
when you see things like f : Circle -> A, and f(loop) in the book, you should read them as shorthands for "cong f loop".
– Saizan
Nov 26 '18 at 9:04
paths do have eta, but proofAt_ is not a path, it's a function from I to paths.
– Saizan
Nov 26 '18 at 9:06