在Coq(ssreflect)中推导记录的规范结构

3

假设如下:

Variable A : finType.
Variable B : finType.
Variable C : finType.

并且一个被定义为:

Record example := Example {
       example_A : A;
       example_B : B;
       example_C : C;
}.

直觉上,似乎这个例子也必须是finType

从其他代码库来看,我发现人们使用以下形式的构造方式,针对只有一个非证明项的记录派生finType

Definition <record>_subType := Eval hnf in [subtype for <record-accessor>].
Definition <record>_finMixin := Eval hnf in [finMixin of <record> by <:].

但在这种情况下,记录中有多个字段。

是否有自动方式可以为记录派生fintype?如果没有,如何为记录派生fintype?

1个回答

3

在数学组件中,许多接口实现都可以通过展示你的类型是某个实现该接口的其他类型的撤消来推导。在您的示例中,我们只需要将记录转换为元组即可。

From mathcomp Require Import
  ssreflect ssrfun ssrbool ssrnat eqtype seq choice fintype.

Variables A B C : finType.

Record example := Example {
  example_A : A;
  example_B : B;
  example_C : C
}.

Definition prod_of_example e :=
  let: Example a b c := e in (a, b, c).

Definition example_of_prod p :=
  let: (a, b, c) := p in Example a b c.

Lemma prod_of_exampleK : cancel prod_of_example example_of_prod.
Proof. by case. Qed.

Definition example_eqMixin :=
  CanEqMixin prod_of_exampleK.
Canonical example_eqType :=
  Eval hnf in EqType example example_eqMixin.
Definition example_choiceMixin :=
  CanChoiceMixin prod_of_exampleK.
Canonical example_choiceType :=
  Eval hnf in ChoiceType example example_choiceMixin.
Definition example_countMixin :=
  CanCountMixin prod_of_exampleK.
Canonical example_countType :=
  Eval hnf in CountType example example_countMixin.
Definition example_finMixin :=
  CanFinMixin prod_of_exampleK.
Canonical example_finType :=
  Eval hnf in FinType example example_finMixin.

在这段代码的结尾处,example 被声明为一个 finType。(请注意,所有其他的 eqTypechoiceType 等声明也是必要的,因为 finType 是它们的子类。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接