Logic 将引理应用于连接分支,而不在coq中分裂

Logic 将引理应用于连接分支,而不在coq中分裂,logic,coq,coq-tactic,formal-verification,Logic,Coq,Coq Tactic,Formal Verification,我有一个连词,让我们把它抽象为: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
,我有一个引理证明了
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.


n你可以引入一个引理,比如:

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.


n您是否仅从
A/\B
C->A
的知识来证明
C/\B
?这是不可能的,因为命题
A/\B->(C->A)->C/\B
通常是不正确的(假设
A=B=true
C=False
)。@SvenWilliamson不,他们试图从
C/\B
C->A
证明
A/\B
。他们没有“有
A/\B
”,他们“有目标
A/\B
”,他们想借助引理
C->A
,得到“目标
C/\B
”。你是想仅仅从
A/\B
C->A
的知识来证明
C/\B
?这是不可能的,因为命题
A/\B->(C->A)->C/\B
通常是不正确的(假设
A=B=true
C=False
)。@SvenWilliamson不,他们试图从
C/\B
C->A
证明
A/\B
。他们没有“有
A/\B
”,他们“有目标
A/\B
”,他们想借助引理
C->A
获得“目标
C/\B
”。