Coq 找不到变量的实例

Coq 找不到变量的实例,coq,Coq,背景:我正在做一个练习 在最后一行之前,我的子目标是: evenb (S n') = negb (evenb (S (S n'))) 我想把它转换成这样: negb (evenb (S n')) = evenb (S (S n')) 但是,当我尝试单步执行重写->负移动时,会产生以下错误: 错误:找不到变量y的实例 我相信这很简单,但我做错了什么?(请不要因为解决问题而放弃任何东西,即使是b_n__oddb_Sn,除非我做得完全错误)。正如danportin提到的,Coq告诉你它不知道如何实

背景:我正在做一个练习

在最后一行之前,我的子目标是:

evenb (S n') = negb (evenb (S (S n')))
我想把它转换成这样:

negb (evenb (S n')) = evenb (S (S n'))
但是,当我尝试单步执行
重写->负移动
时,会产生以下错误:

错误:找不到变量y的实例


我相信这很简单,但我做错了什么?(请不要因为解决
问题而放弃任何东西,即使是b_n__oddb_Sn
,除非我做得完全错误)。

正如danportin提到的,Coq告诉你它不知道如何实例化
y
。实际上,当您执行
rewrite->neg_move
时,您要求它用
y
替换一些
negb x
。现在,Coq应该在这里使用什么?它无法理解

一个选项是在重写时显式实例化
y

rewrite->neg\u move with(y:=某些术语)

这将执行重写并要求您证明前提,在这里它将添加一个子目标,形式为
x=negb some_term

另一个选项是在重写时专门化
neg_move

rewrite->(neg\u move\uh)

这里的
H
必须是
some_x=negb some_y
类型的术语。我为
neg\u move
x
y
参数设置了两个通配符,因为Coq能够从
H
中推断出它们分别是
一些x
一些y
。Coq随后将尝试用
some_y
重写目标中出现的
negb some_x
。 但是你首先需要在你的假设中得到这个
H
项,这可能是一些额外的负担

(请注意,我给您的第一个选项应该相当于
rewrite->(neg\u move\u some\u term)

另一个选项是
erewrite->negb\u move
,它将添加看起来像
?x
?y
的未实例化变量,并尝试进行重写。然后你必须证明这个前提,它看起来像
(evenb(S(sn'))=negb?y
,希望在解决这个子目标的过程中,Coq会发现从一开始就应该是什么(尽管存在一些限制,但如果Coq在没有弄清楚
?y
必须是什么的情况下解决了目标,可能会出现一些问题)


但是,对于您的特定问题,这相当容易:

==========
evenb (S n') = negb (evenb (S (S n')))
对称性。

==========
negb (evenb (S (S n'))) = evenb (S n')
应用负移动。

==========
evenb (S (S n')) = negb (evenb (S n'))
这就是你想要的(向后,做另一个
对称。
如果你愿意的话)。

短语“找不到变量y的实例”表示Coq无法在neg_move类型中找到替代变量y的值。您可以通过显式实例化neg_move的参数来解决此问题,包括条件的先行项(如果未实例化,将作为子目标生成)然而,条件陈述通常意味着应用;事实上,neg_移动可以应用于归纳假设,以获得更有用的假设。
==========
evenb (S (S n')) = negb (evenb (S n'))