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
,它会自动评估这种重言式逻辑。
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
,它会自动评估这种重言式逻辑。