I asked the following question on the CS SE:
例如,在HoTT书中的引理6.4.1的证明中,一个函数 简单地对函数进行归纳定义可简单地应用于路径
loop
和refl
,然后使用loop
和refl
之间的路径 (大概是通过f
来实现)来构建f loop
和f refl
之间的路径:假设
loop = refl base
。 [...]使用x : A
和p : x = x
,有一个f : S1 → A
定义的函数f(base) :≡ x
和f(loop) := p
,我们有p = f(loop) = f(refl base) = refl x.
但是在立方环境中,事情并没有那么明确。
f(loop)
是 对于某些f(loop i)
,i : I
的类型不好,只有p = <i> f (loop i) = <i> f (refl base i) = refl x
是。但是那 以上证明成为∀ i → f (loop i) = f (refl base i)
但是,在那儿并不需要某种“间隔可扩展性” 中间步骤?中间步骤的正当性是什么 立方型理论?我可以看到如何证明
<i> f (loop i) = <i> f (refl base i)
,但是如何证明这一点到p
?
我还没有收到回复,所以我将在这里尝试,并用具体的Agda代码来支持它。
我正尝试将上述证明转换为Cubical Agda,如下所述。首先,给定f
, hyp : loop ≡ refl {x = base}
p : x ≡ x
f : S¹ → A
f base = x
f (loop i) = p i
的定义很简单:
loop
我们可以沿着f (loop i) ≡ f (refl i)
逐点证明 proofAt_ : ∀ i → f (loop i) ≡ f base
proofAt i = cong (λ p → f (p i)) hyp
:
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 ∎
(要了解原因,这里有更详细的说明:
proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ (λ i → proofAt i) ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
)
但是,如果我试图从整体上证明这一点:
_342
它失败了,我想因为我正在尝试使用“间隔可扩展性”:
无法实例化解决方案
f (loop i) ≡ f base
的元变量i
,因为它包含变量proofAt i
,该变量不在范围内。 元变量或与元变量无关,但与 解决方案在检查表达式
_A_342
的类型为proofAt_
时
尝试将它转换为 proof : p ≡ refl
proof = begin
(λ i → p i) ≡⟨⟩
(λ i → f (loop i)) ≡⟨ proofAt_ ⟩
(λ i → f base) ≡⟨⟩
(λ i → refl {x = x} i) ∎
的操作也失败了,但是由于另一个原因(我认为,通常没有路径的eta转换):
((i : I) → f (loop i) ≡ f base)
_344 ≡ _y_345
!= <;Agda.Primitive.Setω
类型CacheManager
那么,以上HoTT证明的正确CTT音译是什么?
答案 0 :(得分:3)
有关原始解决方案的信息,请参见塞桑的答案。或者,有一个简单的解决方案:
proof : p ≡ refl
proof i j = f (hyp i j)
或proof = cong (cong f) hyp
。关键在于hyp
是二维的,并且f
作用于0维元素,因此f
应该应用于hyp
的0维分量。 / p>
答案 1 :(得分:3)
路径确实具有eta规则
但是类型路径与间隔“ I”中的函数类型不同,因此有时您仅需要lambda抽象即可在两种类型之间进行转换。 (Lambda和应用程序在这两种类型之间是临时重载的。)
f loop
确实不会进行类型检查,即使在HoTT中也是如此。但是,本书将其用作ap f loop
的简写,其中ap = cong
来自立方库。
此外,您的证明可以完成,但是您需要正确使用proofAt_
:i
中的proof
维度是连接cong f loop
和{{1}的维度},因此您想提供refl {x = f base}
作为i
的第二个参数。
proofAt_