这有点通用,所以请随时询问详细信息,我简化了问题,使问题更容易沟通。
说我的目标是
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.
答案 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].