Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Agda 如何证明相同的函数类型具有相同的域?_Agda - Fatal编程技术网

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的开发版本中。

下面是一个不兼容的示例: