Coq 记录类型

4

我是Coq的新手。当我尝试定义两个带有相同名称类型字段的记录类型时,会出现错误。例如:

Record squag := {
    U : Type;
    op : U -> U -> U where "x * y" := (op x y);
    idempotent_op : forall x : U, (x * x) = (x);
    commutative_op : forall x y : U, (x * y) = (y * x);
    antiAbsorbent_op : forall x y: U, (x * (x * y)) = (y)
}.
Record dummy := { 
    U : Type; 
    zero : U
}.

我遇到的错误是:

错误:U 已存在。

感谢任何帮助。
1个回答

3

在Coq命名空间中,您不能重复使用记录名称。但是,您可以在不同的文件或模块中声明两个记录:

Module Squag.
Record squag := {
    U : Type;
    op : U -> U -> U where "x * y" := (op x y);
    idempotent_op : forall x : U, (x * x) = (x);
    commutative_op : forall x y : U, (x * y) = (y * x);
    antiAbsorbent_op : forall x y: U, (x * (x * y)) = (y)
}.
End Squag.

Module Dummy.
Record dummy := { 
    U : Type; 
    zero : U
}.
End Dummy.

然后,您可以将这两个字段分别称为Squag.UDummy.U


1
如果我定义的是一些代数理论(如幺半群、群等)的库,有没有比每个理论都有一个单独的模块更好的处理方式? - Yasmine Shaorda
3
您可能想查看“打包数学结构”(Packaging Mathematical Structures)论文(它是有关math-comp的),以及“math-classes”库(其中有一篇描述其架构的论文)。 - Anton Trunov
1
为类似结构声明不同的名称与证明和使用这些结构的公共引理相比,是一个小问题 - 例如,如果我证明了一些关于群的东西,我能用它来处理阿贝尔群吗?Anton提到的库解决了这个问题,你应该去看看。 - Arthur Azevedo De Amorim

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