在Coq中实例化嵌套存在语句的最佳方法

时间:2014-09-10 08:06:20

标签: coq quantifiers

假设我在上下文中有一个嵌套的存在语句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 proofgeneralize来使这一个工作。

1 个答案:

答案 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.