Coq 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

我即将结束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.
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.