coq:在 'and' 语句中替换真实假设的策略

coq: Tactic to replace true hypothesis in 'and' statement

Assumptions:
l: a < d

Goal: (s a /\ a < d) <-> s a

在这里,我有一个带有假定语句的 /\。目标只需要应用 l,但我似乎无法弄清楚该策略。应用、重写和替换不起作用。

rewrite 只有在 a < d 是等式或等价关系的表示法时才有效,但我假设情况并非如此。

tauto automatically solves your goal, as does easy,但我认为您要求的不是那么自动。

有点令人失望,但我能想到的最好的non-automatic证明就是拆分你的目标:

Goal forall a d s, a < d -> (s a /\ a < d) <-> s a.
Proof.
  intros a d s l.
  split.
  - intros [sa _].
    exact sa.
  - intros sa.
    split.
    + exact sa.
    + exact l.
Qed.

如果您对使用 rewrite 感兴趣,MathComp 库定义的方式使 rewrite 成为最有用的策略,尤其是它将在您的目标的翻译版本中工作。但这里最好的 short-term 解决方案可能是利用一些自动化策略。

使用SSReflect/mathcomp,如@ana-borges所述,确实可以rewrite假设l->所做的);这之后可以跟一个 split,连词中有一个 true

From mathcomp Require Import all_ssreflect.

Goal forall a d s, a < d -> (s a /\ a < d) <-> s a.
Proof. move=> a d s ->; split=> [[sa _] //|sa]; exact: conj. Qed.

不过也许还有另一个更短的版本。

我想出来了——你只需要 运行 propositional,它会自动评估这种重言式逻辑。