Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq 在可能的情况下概括一个假设_Coq - Fatal编程技术网

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。我的意思是使用证明助手的目的是(非常痛苦地)精确,所以要给出精确的答案,我们需要一个精确的问题。感谢您的关注。我将按照您的建议,在今天晚些时候创建一个单独的问题。