我对Coq中的模块或类型类不太熟悉,但基于我对它们的基本理解,我相信我有一个问题,我应该使用它们。
我想定义一个sum
函数,它添加了多态list t
的所有元素。只有当列表(t
)的元素类型具有plus_function
和plus_id_element
的某些定义时,它才有效。我想写的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,例如,可以用定义t
和plus_function
的接口/类型类替换plus_id_element
。尽管Coq中存在类型类,但我还没有经常使用它们,我相信人们通常会使用模块来实现类似的东西。我不确定我是否混合了不相关的概念。模块和类型类是否对此问题有用?推荐的方法是什么?
答案 0 :(得分:3)
确实,类型类是为这个确切的任务而设计的,但是你面临着设计适合你的问题的特定类层次结构的难题。
Coq没有提供数学运算符的标准层次结构,在构建类数,运算符和公理的选择方面存在许多微妙的权衡。
因此,我建议从成熟的开发开始,例如MathComp库。 MathComp基于“Canonical Structures”,它类似于类型类的概念,并提供了一些现成的类。 Packaging Mathematical Structures“论文包含更多详细信息,但基本思想是类型打包运算符。例如,如果要推理阿贝尔模块,可以使用zmodType
结构:
From mathcomp Require Import all_ssreflect all_algebra.
Open Scope ring_scope.
Definition sum (A: zmodType) (s : seq A) := foldr +%R 0 s.
定义阿贝尔群A
元素列表的总和。更好的是,不要定义自己的sum
运算符,只使用库提供的运算符:\sum_(x <- s) x
:
Lemma eq_sum (A: zmodType) (s : seq A) : sum s = \sum_(x <- s) x.
Proof. by rewrite unlock. Qed.