Logic 在Coq中,如何对自然数使用mod算术(特别是Zplus_mod定理)?

Logic 在Coq中,如何对自然数使用mod算术(特别是Zplus_mod定理)?,logic,coq,mod,coq-tactic,Logic,Coq,Mod,Coq Tactic,我想应用这个定理: 其中,a b n应具有类型Z 我的目标中有一个子表达式(a+b)mod 3,带有ab:nat rewrite Zplus_mod给出错误未找到匹配的子项 用(a:=a)重写Zplus_mod会给出一个错误“a”的类型为“nat”,而预期的类型为“Z”。 由于自然数也是整数,如何对nat参数使用Zplus_mod定理?您不能应用此定理,因为在使用自然数的上下文中,符号mod指的是自然数nat.modulo上的函数,当您指的是Z类型的整数时,符号mod指的是Z.modulo 使用

我想应用这个定理:

其中,
a b n
应具有类型
Z

我的目标中有一个子表达式
(a+b)mod 3
,带有
ab:nat

rewrite Zplus_mod
给出错误
未找到匹配的子项

用(a:=a)重写Zplus_mod
会给出一个错误
“a”的类型为“nat”,而预期的类型为“Z”。


由于自然数也是整数,如何对nat参数使用Zplus_mod定理

您不能应用此定理,因为在使用自然数的上下文中,符号
mod
指的是自然数
nat.modulo
上的函数,当您指的是
Z
类型的整数时,符号
mod
指的是
Z.modulo

使用
Search
命令,您可以专门搜索关于
Nat.modulo
(+\uu)%Nat
的定理,您将看到一些现有的定理实际上接近您的需要(
Nat.add_mod_idemp_l
Nat.add_mod_idemp_r

您还可以查找链接
Z.modulo
Nat.modulo
的定理。这将提供
modzmod
。但这会迫使您使用整数类型:

Require Import Arith ZArith.

Search Z.modulo Nat.modulo.

 (* The answer is :  
    mod_Zmod: forall n m, m <> 0 -> Z.of_nat (n mod m) = 
       (Z.of_nat n mod Z.of_nat m)%Z  *)
在生成的长列表中,相关定理是
Nat2Z.inj
,您 然后需要显示
Z.of_nat
如何与所有涉及的操作员交互。大多数定理要求
n
为非零,因此我将其作为一个条件添加。这是一个例子

Lemma example (a b n : nat) : 
   n <> 0 -> (a + b) mod n = (a mod n + b mod n) mod n.
Proof.
intro nn0.
apply Nat2Z.inj.
rewrite !mod_Zmod; auto.
rewrite !Nat2Z.inj_add.
rewrite !mod_Zmod; auto.
rewrite Zplus_mod.
easy.
Qed.
引理示例(abn:nat): n0->(a+b)模n=(a模n+b模n)模n。 证据 简介nn0。 应用Nat2Z.inj。 重写mod_Zmod;汽车 重写Nat2Z.inj_添加。 重写mod_Zmod;汽车 重写Zplus_mod。 容易的 Qed。
这回答了你的问题,但坦率地说,我相信你最好使用引理
Nat.add_mod_idemp_l
Nat.add_mod_idemp_r

要快速回答这个问题,我们需要知道你需要和导入的模块到底是什么。因此,一个简单的工作示例会很好。
Search Z.of_nat "inj".
Lemma example (a b n : nat) : 
   n <> 0 -> (a + b) mod n = (a mod n + b mod n) mod n.
Proof.
intro nn0.
apply Nat2Z.inj.
rewrite !mod_Zmod; auto.
rewrite !Nat2Z.inj_add.
rewrite !mod_Zmod; auto.
rewrite Zplus_mod.
easy.
Qed.