如何破坏coq的目标存在

时间:2017-01-09 07:05:41

标签: coq

这有点通用,所以请随时询问详细信息,我简化了问题,使问题更容易沟通。

说我的目标是

let (r,_) := f x in Q r

其中f x的类型为{u | P u}

我想"破坏"这样我就Q r 作为P r作为假设的目标。实现这一目标的最佳方法是什么?

过去,我已经实现了我想要的目标
pose (f x).

然后简化。

这里的每个请求都是一些简化的代码。

Parameter T:Type.
Parameter P:T -> Prop.

Axiom A : {t:T|P t}.

Definition myvar:T.
  destruct A.
  exact x.
Defined.
Theorem B : P myvar.

2 个答案:

答案 0 :(得分:3)

unfold myvar; destruct A.
在这种特殊情况下,

将解决您的目标。

一般来说,destruct策略可以与任何术语一起使用,它会尝试将术语抽象出来并对其进行破坏。但请注意,有时这可能会失败,尤其是在使用依赖类型时。

原因是destruct使用下面的gallina match,而在Coq中,如果不仔细进行,模式匹配可能会丢失一些输入信息,搜索" Convoy Pattern"了解更多信息。

答案 1 :(得分:0)

如果您愿意,可以命名destruct策略的“输出”:

(* Stupid definitions to create a minimal example *)
Parameter A: Set.
Parameter P Q: A -> Prop.
Definition f (x: A) : {r | P r }.
Admitted.

Goal (forall x, let (r, _) := f x in Q r).
intro x.
destruct f as [r hr]. (* you goal has now r: A and hr : P r as premises *)
Abort.

编辑:评论后的更多信息。 如果您没有为它们命名,Coq将使用基于xi变量(x0, x1, ...)的方案自动为您执行此操作。如果您不关心使用destruct f as [r].

的第二部分的名称,则只能强制命名第一个变量