Coq中圆对称的求解证明
我正在使用结构同余进行证明,其定义非常类似于此示例:Coq中圆对称的求解证明,coq,induction,Coq,Induction,我正在使用结构同余进行证明,其定义非常类似于此示例: Require Import Nat. Require Import Omega. Inductive expr := | Const : nat -> expr | Add : expr -> expr -> expr. Reserved Notation "e1 === e2" (at level 80). Inductive expr_congruence : expr -> expr ->
Require Import Nat.
Require Import Omega.
Inductive expr :=
| Const : nat -> expr
| Add : expr -> expr -> expr.
Reserved Notation "e1 === e2" (at level 80).
Inductive expr_congruence : expr -> expr -> Prop :=
| Commutative : forall e1 e2, Add e1 e2 === Add e2 e1
| Associative : forall e1 e2 e3, Add (Add e1 e2) e3 === Add e1 (Add e2 e3)
| CongruenceReflexive : forall e, e === e
| CongruenceSymmetric : forall e1 e2, e1 === e2 -> e2 === e1
| CongruenceTransitive :
forall e1 e2 e3, e1 === e2 -> e2 === e3 -> e1 === e3
where "e1 === e2" := (expr_congruence e1 e2).
当我试图为所有e1 e2,e1===e2->p e1->p e2定义某种形式的东西时遇到问题:我总是以循环逻辑结束。例如:
Inductive is_zero : expr -> Prop :=
| ZConst : is_zero (Const 0)
| ZAdd : forall e1 e2, is_zero e1 -> is_zero e2 -> is_zero (Add e1 e2).
Hint Constructors is_zero expr_congruence.
Lemma is_zero_over_congruence :
forall e1 e2,
e1 === e2 ->
is_zero e1 ->
is_zero e2.
Proof.
induction 1; eauto; intros.
Show 3.
(**
1 subgoal
e1, e2 : expr
H : e1 === e2
IHexpr_congruence : is_zero e1 -> is_zero e2
H0 : is_zero e2
**)
这里,e1
和e2
之间的唯一联系是它们是一致的。对它们进行倒装或归纳最终会返回到同一个案例,而这并没有提供额外的信息
当使用以这种方式定义的对称结构时,处理归纳的正确方法是什么?至少在这个最小的例子中,你只需要证明一些更有力的东西:
Lemma is_zero_over_congruence :
forall e1 e2, e1 === e2 -> is_zero e1 <-> is_zero e2.
Proof.
induction 1.
- split; intros HI; inversion HI; eauto.
- split; intros HI; inversion HI; [inversion H1 | inversion H2]; eauto.
- reflexivity.
- symmetry. auto.
- rewrite IHexpr_congruence1, IHexpr_congruence2. reflexivity.
Qed.
引理是\u零\u在\u同余上:
对于所有e1 e2,e1===e2->is_zero e1 is_zero e2。
证明。
归纳1。
-分裂;介绍HI;反转HI;奥托。
-分裂;介绍HI;反转HI;[反转H1 |反转H2];奥托。
-自反性。
-对称性。自动的。
-重写IHexpr\u一致性1,IHexpr\u一致性2。自反性。
Qed。
因此,当您需要证明
is\u zero e2 is\u zero e1
时,您可以使用is\u zero e1 is\u zero e2作为归纳假设谢谢,这是一个好主意。我想它也能解决我的大问题(类型保留优于结构一致性)。你的问题很难理解,因为MWE没有定义。当然,我可以编辑它。