在idris中证明map id = id?

Prove map id = id in idris?

我刚开始玩 idris 和一般定理证明。我可以遵循互联网上大多数基本事实证明的例子,所以我想自己尝试一些任意的东西。所以,我想为下面的基本 属性 映射写一个证明项:

map : (a -> b) -> List a -> List b
prf : map id = id

凭直觉,我可以想象证明应该如何工作:取一个任意列表 l 并分析地图 id l 的可能性。当 l 为空时,很明显;什么时候 l 是非空的,它基于函数应用程序保持相等性的概念。 所以,我可以这样做:

prf' : (l : List a) -> map id l = id l

这就像一个适用于所有人的声明。我怎样才能把它变成所涉及函数相等的证明?

你不能。 Idris 的类型理论(如 Coq 和 Agda 的)不支持一般的外延性。给定 fg 这两个函数 "act the same",你将永远无法证明 Not (f = g),但你只能证明 f = g 如果 fg 定义相同,直到 alpha 和 eta 等价左右。不幸的是,当您考虑高阶函数时,事情只会变得更糟。在 Coq 标准库中有一个关于这样的定理,但我现在似乎无法找到或记住它。