将引理应用于合取分支而不在 coq 中拆分

Apply a lemma to a conjunction branch without splitting in coq

我有一个连词,让我们将其抽象为:A /\ B 并且我有一个引理证明了 C -> A,我希望得到的结果是目标 C /\ B。这可能吗?

如果是,我会对如何操作感兴趣。如果我使用 split 然后将引理应用于第一个子目标,我无法将两个结果子目标 CB 重新组合为 C /\ B - 或者我可以吗?另外 apply 似乎不能只适用于连词的一个分支。

如果不是,请向我解释为什么这是不可能的:-)

你可以引入这样的引理:

Theorem cut: forall (A B C: Prop), C /\ B -> (C -> A) -> A /\ B.
Proof.
  intros; destruct H; split; try apply H0; assumption.
Qed.

然后定义一个策略,如:

Ltac apply_left lemma := eapply cut; [ | apply lemma].

例如,您可以执行以下操作:

Theorem test: forall (m n:nat),  n <= m -> max n m = m /\ min n m = n.
Proof.
  intros.
  apply_left max_r.
  ...
Qed.

在这种情况下,上下文来自:

Nat.max n m = m /\ Nat.min n m = n

n <= m /\ Nat.min n m = n

我想这就是您要找的。 希望这对您有所帮助!