将引理应用于合取分支而不在 coq 中拆分
Apply a lemma to a conjunction branch without splitting in coq
我有一个连词,让我们将其抽象为:A /\ B
并且我有一个引理证明了 C -> A
,我希望得到的结果是目标 C /\ B
。这可能吗?
如果是,我会对如何操作感兴趣。如果我使用 split 然后将引理应用于第一个子目标,我无法将两个结果子目标 C
和 B
重新组合为 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
我想这就是您要找的。
希望这对您有所帮助!
我有一个连词,让我们将其抽象为:A /\ B
并且我有一个引理证明了 C -> A
,我希望得到的结果是目标 C /\ B
。这可能吗?
如果是,我会对如何操作感兴趣。如果我使用 split 然后将引理应用于第一个子目标,我无法将两个结果子目标 C
和 B
重新组合为 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
我想这就是您要找的。 希望这对您有所帮助!