Coq 使用模块和类型类优化类型
我不太熟悉Coq中的模块或类型类,但基于我对它们的基本理解,我认为我在哪里应该使用它们存在问题 我想定义一个Coq 使用模块和类型类优化类型,coq,Coq,我不太熟悉Coq中的模块或类型类,但基于我对它们的基本理解,我认为我在哪里应该使用它们存在问题 我想定义一个sum函数,用于添加多态列表t的所有元素。只有当列表的元素类型(t)对plus\u函数和plus\u id\u元素有一定的定义时,它才应该工作。我想写的sum的定义如下: Fixpoint sum {t : Type} (l : list t) := match l with | Nil => plus_id_element t | Cons x xs => ((p
sum
函数,用于添加多态列表t
的所有元素。只有当列表的元素类型(t
)对plus\u函数
和plus\u id\u元素
有一定的定义时,它才应该工作。我想写的sum
的定义如下:
Fixpoint sum {t : Type} (l : list t) :=
match l with
| Nil => plus_id_element t
| Cons x xs => ((plus_function t) x (sum xs))
end.
我不知道在Coq实现这样的目标的通常方法是什么。例如,我相信Idris可以用定义
plus\u函数
和plus\u id\u元素
的接口/类型类来代替t
。虽然Coq中存在类型类,但我还没有看到它们经常被使用,我相信人们通常使用模块来实现类似的功能。我不确定我是否混合了不相关的概念。模块和类型类对这个问题有用吗?推荐的方法是什么?事实上,TypeClass就是为这项任务而设计的,但接下来您将面临一个困难的问题,即如何设计适合您的问题的特定类层次结构
Coq没有提供数学运算符的标准层次结构,在构建一个层次结构时,在类、运算符和公理的选择方面有许多微妙的权衡
因此,我建议从一个成熟的开发开始,比如MathComp库。MathComp基于与类型类类似的“规范结构”,并提供了许多现成的类。“论文包含了更多的细节,但基本思想是类型打包了它们的运算符。例如,如果你想对阿贝尔模块进行推理,你可以使用zmodType
结构:
From mathcomp Require Import all_ssreflect all_algebra.
Open Scope ring_scope.
Definition sum (A: zmodType) (s : seq A) := foldr +%R 0 s.
要在abelian组
a
的元素列表上定义和,最好不要定义自己的sum
运算符,只使用库提供的运算符:\sum_(x这个问题在中讨论过,并且有一定的关联。sum
应该通过右折叠来定义,以证明eq\u sum
的正确性,对吗?哦,确实谢谢,我在本地版本中也有类似的内容,但不知怎的,我在编辑时没有正确更新。
Lemma eq_sum (A: zmodType) (s : seq A) : sum s = \sum_(x <- s) x.
Proof. by rewrite unlock. Qed.