Coq Z_3:左id证明
我即将结束Z_3左id的证明。这是我到目前为止所拥有的Coq Z_3:左id证明,coq,Coq,我即将结束Z_3左id的证明。这是我到目前为止所拥有的 Require Import Coq.Arith.PeanoNat. Require Import Coq.Bool.Bool. Require Import Coq.Logic.Eqdep_dec. Record Z_3 : Type := Z3 { n :> nat; proof : (Nat.ltb n 3) = true }. Proposition lt_0_3 : (0 <? 3) = true. Pro
Require Import Coq.Arith.PeanoNat.
Require Import Coq.Bool.Bool.
Require Import Coq.Logic.Eqdep_dec.
Record Z_3 : Type := Z3
{
n :> nat;
proof : (Nat.ltb n 3) = true
}.
Proposition lt_0_3 : (0 <? 3) = true.
Proof.
simpl. reflexivity.
Qed.
Definition z3_0 : Z_3 := (Z3 0 lt_0_3).
Proposition lt_1_3 : (1 <? 3) = true.
Proof.
reflexivity.
Qed.
Definition z3_1 : Z_3 := (Z3 1 lt_1_3).
Proposition lt_2_3 : (2 <? 3) = true.
Proof.
reflexivity.
Qed.
Definition z3_2 : Z_3 := (Z3 2 lt_2_3).
Proposition three_ne_0 : 3 <> 0.
Proof.
discriminate.
Qed.
Lemma mod_upper_bound_bool : forall (a b : nat), b <> O -> (a mod b <? b) = true.
Proof.
intros a b H. apply (Nat.mod_upper_bound a b) in H. case Nat.ltb_spec0.
- reflexivity.
- intros Hcontr. contradiction.
Qed.
Definition Z3_op (x y: Z_3) : Z_3 :=
let a := (x + y) mod 3 in
Z3 a (mod_upper_bound_bool _ 3 three_ne_0).
Lemma Z3_eq n m p q : n = m -> Z3 n p = Z3 m q.
Proof.
intros H. revert p q. rewrite H. clear H. intros. apply f_equal. apply UIP_dec. apply bool_dec.
Qed.
Proposition Z3_left_id' : forall x: Z_3, (Z3_op z3_0 x) = x.
Proof.
intro. unfold Z3_op. destruct x as [n proof]. apply Z3_eq.
需要导入Coq.Arith.PeanoNat。
需要导入Coq.Bool.Bool。
需要导入Coq.Logic.Eqdep\u dec。
记录Z_3:类型:=Z3
{
n:>nat;
证明:(Nat.ltb n 3)=正确
}.
命题lt_0_3:(0你需要强制执行。不幸的是,
通过命名证明的绑定变量n
和从Z_3
到nat
n
的投影,您将自己画在了一个角落里
以下是四种解决方案:
1/我提到的这个只是为了记录:您可以通过使用文件名作为模块限定符来讨论此文件中定义的常量n
unfold user4035_oct_16.n.
user4035\u oct\u 16是当前文件的名称,这很难看
2/您可以调用计算所有内容的计算函数,但模的计算会在目标中留下难看的术语,因此您可以决定不计算该特定部分
cbn -[Nat.modulo].
我喜欢这个,但它需要你花一些时间学习如何使用cbn
3/您可以通过重命名目标中的变量来避免名称冲突
rename n into m.
unfold n, Z3_0.
也不是很好
4/只需返回脚本并将析构函数x替换为[n-proof]
,使用析构函数x替换为[vx-proof]
,然后您可以键入:
unfold n, z3_0.
你将能够使用你建议的引理
证明:
Proposition Z3_left_id : forall x: Z_3, (Z3_op z3_0 x) = x.
Proof.
intro. unfold Z3_op. destruct x as [vx proof]. apply Z3_eq. unfold n, z3_0. rewrite plus_O_n. apply Nat.mod_small. apply Nat.ltb_lt in proof. assumption.
Qed.
我使用了方法4,现在离结束还有一步。更新了问题。你能告诉我,如何从中推断vx<3
(如果你进行搜索(uurename n into m.
unfold n, Z3_0.
unfold n, z3_0.
Proposition Z3_left_id : forall x: Z_3, (Z3_op z3_0 x) = x.
Proof.
intro. unfold Z3_op. destruct x as [vx proof]. apply Z3_eq. unfold n, z3_0. rewrite plus_O_n. apply Nat.mod_small. apply Nat.ltb_lt in proof. assumption.
Qed.