Coq 在可能的情况下概括一个假设
假设我有一个形式的目标Coq 在可能的情况下概括一个假设,coq,Coq,假设我有一个形式的目标 forall x, A x -> B x -> P 其中,x不是在p中自由出现的(结论中不涉及绑定的x)。通过在这里做介绍,我将在我的证明中得到三个独立的假设: x : nat H0 : A x H1 : B x =============== P 但我需要强化我的假设,并得出以下结论 H0 : forall x, A x -> B x =============== P 这样我就可以实例化x到我需要的任何东西 由于x不会出现在p中,因此从逻辑上讲
forall x, A x -> B x -> P
其中,x
不是在p
中自由出现的(结论中不涉及绑定的x
)。通过在这里做介绍
,我将在我的证明中得到三个独立的假设:
x : nat
H0 : A x
H1 : B x
===============
P
但我需要强化我的假设,并得出以下结论
H0 : forall x, A x -> B x
===============
P
这样我就可以实例化x
到我需要的任何东西
由于x
不会出现在p
中,因此从逻辑上讲
(forall x, A x -> B x -> P) -> ((forall x, A x -> B x) -> P)
我的问题是,我如何在Coq中做到这一点?正如安东所指出的,我们需要更多的上下文来理解您试图做什么。然而,这里有一些想法可能会对你有所帮助 你首先问的是如何从这样的环境中获取信息
x : nat
H1 : A x
H2 : B x
H : forall x' : nat, A x' -> B x'
在这样的背景下
x : nat
H1 : A x
H2 : B x
H : forall x' : nat, A x' -> B x'
对于每个A
和B
,即使您知道A
对某些数字有效,也无法实现这一点。例如,假设ax
表示“x
为偶数”,而bx
表示“x
为零”;就是
A x := exists y, x = 2 * y
B x := x = 0
第一组假设给出的唯一信息是x
为零。然而,第二组假设是矛盾的,因为它断言每个偶数都等于零。因为你不能从一致的假设中添加矛盾的假设,所以你不能从第一个上下文到第二个上下文
当然,还有其他一些情况下,从一个上下文转到另一个上下文是可能的:如果你设法证明所有x',A x'->B x'
假设A x
和B x
在某些x
中保持不变。为此,您需要assert
策略。如果你执行
assert (H : forall x', A x' -> B x').
Coq将生成两个子目标:一个是你必须证明
forall x',A x'->B x'
给定你以前的假设,另一个是上下文得到一个新的假设H:forall x',A x'->B x'
,正如安东指出的,我们需要更多的上下文来理解你想要做什么。然而,这里有一些想法可能会对你有所帮助
你首先问的是如何从这样的环境中获取信息
x : nat
H1 : A x
H2 : B x
H : forall x' : nat, A x' -> B x'
在这样的背景下
x : nat
H1 : A x
H2 : B x
H : forall x' : nat, A x' -> B x'
对于每个A
和B
,即使您知道A
对某些数字有效,也无法实现这一点。例如,假设ax
表示“x
为偶数”,而bx
表示“x
为零”;就是
A x := exists y, x = 2 * y
B x := x = 0
第一组假设给出的唯一信息是x
为零。然而,第二组假设是矛盾的,因为它断言每个偶数都等于零。因为你不能从一致的假设中添加矛盾的假设,所以你不能从第一个上下文到第二个上下文
当然,还有其他一些情况下,从一个上下文转到另一个上下文是可能的:如果你设法证明所有x',A x'->B x'
假设A x
和B x
在某些x
中保持不变。为此,您需要assert
策略。如果你执行
assert (H : forall x', A x' -> B x').
Coq将生成两个子目标:一个是你必须证明
forall x',A x'->B x'
给定你以前的假设,另一个是上下文得到一个新假设H:forall x',A x'->B x'
你是说forall(T:Type)(A B:T->Prop)(p:Prop),(forall x,A x->B x->p)->(对于所有x,A x->B x)->P.
是可证明的?然后有一个反例:使用A
等于fun.=>False
(对于所有x,A x->B x)
仍然有效,但您无法从第一个前提中恢复P
,因为它意味着如果对于任何x
您可以证明A x
和B x
,那么您将得到P
,但在这种情况下,您无法证明A x
(这是False
).好的,我明白你的意思。不过,在我的例子中,我知道至少有一个x
,其中A x
成立。所以,我知道我可以继续证明我的问题的最后一个陈述,作为引理,然后在我的主要证明中使用该引理,但我的问题是,是否有任何策略有助于加强这方面的假设y(因为有一些技巧可以获得你想要的归纳假设)?我认为最好是发布一个独立的例子a.k.a。我的意思是使用证明助手的目的是(非常痛苦地)精确,所以要给出精确的答案,我们需要一个精确的问题。谢谢你的关注。我会按照你的建议,在今天晚些时候创建一个单独的问题。你是说forall(T:Type)(ab:T->Prop)(P:Prop),(forall x,a x->B x->P)->(forall x,a x->B x)->P.
是可证明的吗?然后有一个反例:使用a
等于fun.=>False
(对于所有x,a x->B x)
仍然有效,但您无法从第一个前提中恢复P
,因为它意味着如果对于任何x
您可以证明A x
和B x
,那么您将得到P
,但在这种情况下,您无法证明A x
(这是False
).好的,我明白你的意思。不过,在我的例子中,我知道至少有一个x
,其中A x
成立。所以,我知道我可以继续证明我的问题的最后一个陈述,作为引理,然后在我的主要证明中使用该引理,但我的问题是,是否有任何策略有助于加强这方面的假设y(因为有一些技巧可以获得你想要的归纳假设)?我认为最好是发布一个独立的例子a.k.a。我的意思是使用证明助手的目的是(非常痛苦地)精确,所以要给出精确的答案,我们需要一个精确的问题。感谢您的关注。我将按照您的建议,在今天晚些时候创建一个单独的问题。