coq - 如何访问模块内记录中的函数
问题描述
我正在尝试在 Coq 中进行模运算。我注意到我尝试导入和创建模块的ZModuloZModuloCyclicType
库。
Require Import Utf8_core.
Require Import ZArith_base.
Require Import Coq.Numbers.Cyclic.ZModulo.ZModulo.
Ltac positive_ne1 :=
match goal with
| [ |- ?p ≠ 1%positive ] => unfold not; intro H; inversion H
end.
Module Positive8 : PositiveNotOne.
Definition p := 8%positive.
Theorem not_one : p ≠ 1%positive.
Proof. positive_ne1. Qed.
End Positive8.
Module ZquotZ8 := ZModuloCyclicType(Positive8).
Export ZquotZ8.
现在,我想访问succ
记录中的操作Instance zmod_ops : ZnZ.Ops Z := ZnZ.MkOps
。然而,
Check ZquotZ8.ops.succ. (* Error: The reference ZquotZ8_ops.succ was not found in the current environment. *)
Check ZquotZ8.ops.(succ). (* Error: The term "ops" has type "ZnZ.Ops t" while it is expected to have type "Z". *)
Definition ZquotZ8_ops : ZnZ.Ops Z := zmod_ops 8.
Check ZquotZ8_ops.succ. (* Error: The reference ZquotZ8_ops.succ was not found in the current environment. *)
Check ZquotZ8_ops.(succ). (* Error: The term "ZquotZ8_ops" has type "ZnZ.Ops Z" while it is expected to have type "Z". *)
我的问题是:如何访问此实例succ
而不是中定义的实例Coq.Numbers.Cyclic.ZModulo.ZModulo.
?
我想要的是Compute succ_Z8 255 = 0%Z : Z
或类似的东西。
解决方案
如果您设置了记录选择,它是
Require Import Coq.Numbers.Cyclic.Abstract.CyclicAxioms.
ZquotZ8.ops.(@ZnZ.succ _)
(* equivalent to *)
@ZnZ.succ _ ZquotZ8.ops
但是,问题是,ZnZ.Ops
is a Class
,而不仅仅是一条记录,ZquotZ8.ops
is an Instance
,并且ZnZ.succ
可以ZquotZ8.ops
隐式找到,因为您使用过Export ZquotZ8
. 所以这只是
ZnZ.succ
但是,我认为您还需要将标题更改Positive8
为
(* NOT : *)
Module Positive8 <: PositiveNotOne.
否则,Positive8.p
它是不透明的,你不能用它来计算。一旦完成,你得到
Compute (ZnZ.compare (ZnZ.succ 255%Z) 0%Z).
(* = Eq *)
注意succ
不会翻车;在这里,它返回256%Z
。ZnZ.to_Z
实际上会计算余数,或者您可以使用succ_c
.
推荐阅读
- json - 我认为我的问题是 API 提供了一个对象而不是数组。所以我需要将对象修改为数组?
- database - Elasticsearch - 具有大量存储桶的子聚合
- javascript - JS 追加元素
- python - 如果 elif 带有 input() 函数
- javascript - 如何将 Tesseract 响应数据设置为 Vue 数据变量?
- c# - 从 LUID 检索权限名称
- python - 反转最后 X 个字符
- shopify - Shopify webp 支持和图像优化
- c# - 在一维数组中搜索特定值
- java - 如何在两个表之间建立关联,以便子表将仅共享父表的一个字段作为外键