在 Coq 中使用 or_comm
Using or_comm in Coq
我想证明下面的定理:
Theorem T14 : forall s t u,
S u s t <-> S u t s.
其中S
定义如下:
Definition S u s t := forall v,
((ObS u v) <-> (ObS v s \/ ObS v t)).
我使用的第一个策略是:
Proof.
intros s t u.
unfold S.
我现在的目标是:
1 subgoal
s, t, u : Entity
______________________________________(1/1)
(forall v : Entity, ObS u v <-> ObS v s \/ ObS v t) <->
(forall v : Entity, ObS u v <-> ObS v t \/ ObS v s)
感觉如果用OR算子的交换律,再用tauto
的策略就可以证明完了。但是,我不知道如何只重写等价的正确部分的内部位。可能吗?
这可以使用通用重写来完成。
Require Setoid.
使用setoid_rewrite
,因为您正在使用活页夹 (forall v
) 重写。 (没有活页夹,rewrite
就足够了)。
在这种情况下它有效 out-of-the-box,但是当您的项目变得更加复杂,使用您自己的 combinators/logical 连接词时,将需要做一些工作来确保“重写”是合理的。 The reference manual describes the set up required by generalized rewriting.
(* 1 *)
Require Import Setoid.
Parameter T : Type.
Parameter ObS : T -> T -> Prop.
Definition S u s t := forall v,
((ObS u v) <-> (ObS v s \/ ObS v t)).
Theorem T14 : forall s t u,
S u s t <-> S u t s.
Proof.
intros s t u.
unfold S.
(* 2 *)
setoid_rewrite (or_comm (ObS _ s)).
reflexivity.
Qed.
我想证明下面的定理:
Theorem T14 : forall s t u,
S u s t <-> S u t s.
其中S
定义如下:
Definition S u s t := forall v,
((ObS u v) <-> (ObS v s \/ ObS v t)).
我使用的第一个策略是:
Proof.
intros s t u.
unfold S.
我现在的目标是:
1 subgoal
s, t, u : Entity
______________________________________(1/1)
(forall v : Entity, ObS u v <-> ObS v s \/ ObS v t) <->
(forall v : Entity, ObS u v <-> ObS v t \/ ObS v s)
感觉如果用OR算子的交换律,再用tauto
的策略就可以证明完了。但是,我不知道如何只重写等价的正确部分的内部位。可能吗?
这可以使用通用重写来完成。
Require Setoid.
使用
setoid_rewrite
,因为您正在使用活页夹 (forall v
) 重写。 (没有活页夹,rewrite
就足够了)。
在这种情况下它有效 out-of-the-box,但是当您的项目变得更加复杂,使用您自己的 combinators/logical 连接词时,将需要做一些工作来确保“重写”是合理的。 The reference manual describes the set up required by generalized rewriting.
(* 1 *)
Require Import Setoid.
Parameter T : Type.
Parameter ObS : T -> T -> Prop.
Definition S u s t := forall v,
((ObS u v) <-> (ObS v s \/ ObS v t)).
Theorem T14 : forall s t u,
S u s t <-> S u t s.
Proof.
intros s t u.
unfold S.
(* 2 *)
setoid_rewrite (or_comm (ObS _ s)).
reflexivity.
Qed.