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.