我相信标题很容易解释:https://en.wikipedia.org/wiki/Conditional_proof
我想采取一种策略,我假设一个命题,然后继续寻找另一个命题,如果成功,那么我发现第一个命题暗示,而第二个命题被放在在上下文中的假设。
例如,Ltac cp P Q
创建一个子目标Q
并将P
放在上下文中。如果我确实可以到达子目标Q,那么将释放子目标,并将P->Q
添加到上下文中。我该如何实现?
编辑:很明显,在证明
assert (P->Q).
intro.
的同时
做这项工作,但是我不能将它们组合成Ltac战术,它给出了No focused proof (No proof-editing in progress).
答案 0 :(得分:2)
要定义新策略,您需要将其与;
组合在一起。
Ltac cp P Q := assert (P -> Q); [ intro | ].
(* Use intro in the first subgoal of assert *)
答案 1 :(得分:2)
已经有一种策略,称为enough
,因为“足以显示P”。它假设P
,现在您可以使用P
完成证明。完成后,您必须证明P
。
如果易于完成,则可以使用by
(与assert
相同)。我经常做enough (bla bla) by (subst; auto).
或类似的事情,这给了我目标bla bla
。
您也可能会发现此策略很有用,即,如果您不想在enough
语句中输入整个复杂的前提:
Ltac postpone_antecedent H :=
match type of H with ?A -> _ =>
let Q := fresh in enough A as Q ; [specialize (H Q) | ]
end.