假设我在上下文中有一个嵌套的存在语句H : exists ( a : A ) ( b : B ) ( c : C ) ... ( z : Z ), P a b c ... z
。实例化H
并获得新假设H' : P a b c ... z
的最佳方法是什么?重复inversion
这样做需要很长时间,并留下所有不需要的中间步骤,例如H0 : exists ( b : B ) ( c : C ) ... ( z : Z ), P a b c ... z
。
我的previous question与此非常相似。也许有一些方法可以使用pose proof
或generalize
来使这一个工作。
答案 0 :(得分:1)
您想要做的不是“实例化”。您可以实例化一个普遍量化的假设,并且可以实例化一个存在量化的结论,但反之则不然。我认为正确的名称是“介绍”。您可以在假设中引入存在量化,并在结论中引入通用量化。如果看起来你正在“消除”,那是因为,在证明某些事情时,你从一个后续的微积分派生的底部开始,然后向前推进到顶部。
无论如何,请使用策略firstorder
。另外,如果您只想简化目标,请使用命令Set Firstorder Depth 0
关闭证明搜索。
如果您的目标有更高的订单元素,您可能会收到错误消息。在这种情况下,您可以使用simplify
。
Ltac simplify := repeat
match goal with
| h1 : False |- _ => destruct h1
| |- True => constructor
| h1 : True |- _ => clear h1
| |- ~ _ => intro
| h1 : ~ ?p1, h2 : ?p1 |- _ => destruct (h1 h2)
| h1 : _ \/ _ |- _ => destruct h1
| |- _ /\ _ => constructor
| h1 : _ /\ _ |- _ => destruct h1
| h1 : exists _, _ |- _ => destruct h1
| |- forall _, _ => intro
| _ : ?x1 = ?x2 |- _ => subst x2 || subst x1
end.