如何为coq销毁现有目标
这是一个有点通用,所以请随意询问细节,我简化了,使问题更容易沟通 说我的目标是如何为coq销毁现有目标,coq,Coq,这是一个有点通用,所以请随意询问细节,我简化了,使问题更容易沟通 说我的目标是 let (r,_) := f x in Q r 其中fx具有类型{u|pu} 我想“破坏”这个,这样我就有了qr 以pr作为假设作为目标。实现这一目标的最佳方式是什么? 在过去,我已经实现了我想要的 pose (f x). 然后简化 这里的每个请求都有一些简化的代码 Parameter T:Type. Parameter P:T -> Prop. Axiom A : {t:T|P t}. Definit
let (r,_) := f x in Q r
其中fx
具有类型{u|pu}
我想“破坏”这个,这样我就有了qr
以pr
作为假设作为目标。实现这一目标的最佳方式是什么?
在过去,我已经实现了我想要的
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.
在这种特殊情况下,将解决您的目标
一般来说,destruct
策略可以与任何术语一起使用,它会尝试将术语抽象出来并将其销毁。但是,请注意,这有时可能会失败,特别是在使用依赖类型时
原因是
destruct
在下面使用了gallinamatch
,在Coq中,模式匹配可能会丢失一些键入信息,如果不小心,请搜索“护航模式”以获取更多信息。如果需要,您可以命名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,…
)的方案自动为您命名。只有在不关心第二部分名称的情况下,才能使用析构函数f as[r]强制命名第一个变量。
这有什么帮助?如果你不明确地给他们命名,Coq会自动给他们命名。OP问他如何在目标中有qr
,在上下文中有pr
。如果您不给它们命名,Coq确实会给它们命名,但是使用x0
(取决于上下文…)而不是r
。我只是在回答这个问题。如果你真的需要,你只能说出第一个,但我通常会说出所有或没有destruct
的输出。我不认为OP的问题是“如何命名由destruct
生成的前提?”然后我不理解这个问题,似乎我根本不理解你的问题。如果我的回答不是针对真正的问题,你能更详细地解释你的问题吗?这个评论看起来很傻,但我能让coq推断出一个答案吗?在我的用例中,A不是一个公理,而是相当复杂的,但类型仍然像我的示例;或者,您可以使用set t:=pat
使用匹配来别名复杂模式。
(* 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.