Agda 如何证明相同的函数类型具有相同的域?
我想证明Agda 如何证明相同的函数类型具有相同的域?,agda,Agda,我想证明 ∀ {ℓ} {A B C D : Set ℓ} → (A → B) ≡ (C → D) → A ≡ C (与编码域类似) 如果我有一个返回函数类型域的函数domain,我可以将证明写成 cong domain 但我认为不可能编写这样的函数 有什么办法可以做到这一点吗?几个月前,我在Agda邮件列表上提出了一个非常类似的问题,请参见:。简而言之,你无法在Agda中证明这一点 技术原因是Agda内部用于模式匹配的统一算法不包括形式(a)的问题→ (B)≡ (C)→ D) ,因此此定义不
∀ {ℓ} {A B C D : Set ℓ} → (A → B) ≡ (C → D) → A ≡ C
(与编码域类似)
如果我有一个返回函数类型域的函数domain
,我可以将证明写成
cong domain
但我认为不可能编写这样的函数
有什么办法可以做到这一点吗?几个月前,我在Agda邮件列表上提出了一个非常类似的问题,请参见:。简而言之,你无法在Agda中证明这一点 技术原因是Agda内部用于模式匹配的统一算法不包括形式
(a)的问题→ (B)≡ (C)→ D)
,因此此定义不进行类型检查:
cong-domain : ∀ {ℓ} {A B C D : Set ℓ} → (A → B) ≡ (C → D) → A ≡ C
cong-domain refl = refl
也不可能直接定义函数域
。想想看:不是函数类型的类型的域应该是什么,例如Bool
你不能证明这一点的更深层次的原因是,它与同伦类型理论中的单价公理不相容。在Guillaume Brunerie在我的邮件中给出的一个答案中,他给出了下面的例子:考虑两种类型:代码>布尔-> BOOL 和<代码>单元>(BOOL+BOOL)< /代码>。两者都有4个元素,因此我们可以使用单价公理来证明类型Bool->Bool≡ 单元->(Bool+Bool)
(事实上有24种不同的证明)。但显然我们不想要Bool≡ 单位
!因此,在存在单价的情况下,我们不能假设相同的函数类型具有相同的域
最后,我通过传递一个类型为A的额外参数来“解决”这个问题≡ C
任何需要它的地方。我知道这并不理想,但也许你也可以这样做
我还应该注意,Agda确实包含一个内射类型构造函数的选项,您可以通过将{-#OPTIONS--injective类型构造函数#-}
放在.Agda文件的顶部来启用该选项。例如,这允许您证明A≡ B来自列表A≡ 列表B
,但不幸的是,这只适用于类型构造函数,如List
,而不适用于函数类型
当然,您可以随时在请求向Agda添加选项--内射函数类型。此选项与单价不兼容,但--内射类型构造函数也不兼容,但对于许多应用程序来说,这不是一个真正的问题。我觉得Agda的主要开发人员通常对此类请求非常开放,并且很快就可以将它们添加到Agda的开发版本中。下面是一个不兼容的示例: