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'))