使用模块和类型类精炼类型

时间:2018-02-23 10:07:13

标签: coq

我对Coq中的模块或类型类不太熟悉,但基于我对它们的基本理解,我相信我有一个问题,我应该使用它们。

我想定义一个sum函数,它添加了多态list t的所有元素。只有当列表(t)的元素类型具有plus_functionplus_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,例如,可以用定义tplus_function的接口/类型类替换plus_id_element。尽管Coq中存在类型类,但我还没有经常使用它们,我相信人们通常会使用模块来实现类似的东西。我不确定我是否混合了不相关的概念。模块和类型类是否对此问题有用?推荐的方法是什么?

1 个答案:

答案 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.