我刚刚开始玩idris和定理证明一般。我可以在互联网上关注大多数基本事实证据的例子,所以我想尝试一些我自己的任意事物。所以,我想为map的以下基本属性写一个证明术语:
map : (a -> b) -> List a -> List b
prf : map id = id
直观地说,我可以想象证明应该如何工作:获取任意列表l并分析map id l的可能性。如果l是空的,那很明显;什么时候 l非空,它基于函数应用程序保持相等的概念。 所以,我可以这样做:
prf' : (l : List a) -> map id l = id l
这就像一个所有声明。如何将其转化为相关函数相等的证明?
答案 0 :(得分:13)
你不能。伊德里斯的类型理论(如Coq& Agda& s)不支持一般的扩展性。鉴于两个函数f
和g
"行为相同",您永远无法证明Not (f = g)
,但您只能证明{{1}如果f = g
和f
的定义相同,则等同于alpha和eta等价。不幸的是,当你考虑更高阶函数时,情况会变得更糟;在Coq标准库中有关于此类的定理,但我现在似乎无法找到或记住它。