f : {A : Set} → List A → List A
自动满足
f . map g = map g . f
我可以接受以下类型的Agda术语:
(f : {A : Set} → List A → List A) {B C : Set} (g : B → C) (xs : List B)
→ f (map g xs) ≡ map g (f xs)
或者如果是这样/如果没有,我可以做更多/更不普遍的事情吗?
我知道Lightweight Free Theorems library的存在,但我不认为它符合我的要求(或者如果它确实存在,我不太了解它)。
(一个示例用例是我有一个仿函数F : Set → Set
,并希望证明多态函数F A × F B → F (A × B)
自动转换。{/ p>
答案 0 :(得分:12)
不,构建Agda的类型理论还不足以证明这一点。这需要一个名为“内化参数”的功能,参见Guilhem的工作:
这将允许您例如证明“(A:Set)→A→A”的所有居民都等于(多态)身份函数。据我所知,这还没有用任何语言实现。
答案 1 :(得分:4)
Chantal Keller和Marc Lasson为Coq开发了一种策略,生成对应于(闭合)类型的参数关系,并证明此类型的居民满足生成的关系。您可以在Keller's website上找到有关此工作的更多详细信息。
现在在Agda的案例中,理论上可以通过使用一种称为反射的技术在纯粹的Agda中实施策略来完成同样的工作。