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

我不太熟悉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 => ((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.