在 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的策略就可以证明完了。但是,我不知道如何只重写等价的正确部分的内部位。可能吗?

这可以使用通用重写来完成。

  1. Require Setoid.

  2. 使用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.