Functional programming Coq:使用“重写”或“应用”将(negb(neqb true)简化为true;?

Functional programming Coq:使用“重写”或“应用”将(negb(neqb true)简化为true;?,functional-programming,coq,coq-tactic,Functional Programming,Coq,Coq Tactic,在证明中,我想将(negb(negb-true))简化为true(与false类似) 我知道Coq的negb_对合程序,但由于我的教科书没有介绍它,我认为我应该设法只使用rewrite或apply来模拟它的功能,正如安东所说,解决这个目标的典型程序是使用自反性,或其较低级别的version应用eq\u refl 回想一下Coq是基于编程语言的,在这种情况下,~(~~true)的执行很容易被看作是true(这里我缩写为~~x=negbx),以同样的方式在Python或C中返回true apply

在证明中,我想将
(negb(negb-true))
简化为
true
(与
false
类似)


我知道Coq的
negb_对合
程序,但由于我的教科书没有介绍它,我认为我应该设法只使用
rewrite
apply
来模拟它的功能,正如安东所说,解决这个目标的典型程序是使用
自反性
,或其较低级别的version
应用eq\u refl

回想一下Coq是基于编程语言的,在这种情况下,
~(~~true)
的执行很容易被看作是
true
(这里我缩写为
~~x=negbx
),以同样的方式在Python或C中返回
true

apply eq\u refl
可以解决这个问题,因为Coq在进行匹配时会尝试“计算”或“减少”术语。eq\u refl的类型是
对于所有x,x=x
,因此当
~(~~真)
减少为
true
您的目标现在变为
true=true
,并且可以解决。在这种情况下,
siml
只会减少目标,让您看到它,但从技术上讲,证明中不需要它

在您的例子中,应用
negb\u对合
不是惯用方法,当
negb
的参数是一个变量时,这个引理很有用,如
~(~~~~(x))=~~x


你会发现自己在大多数涉及平等的目标中都使用了
rewrite

你不允许使用
siml.
?此外,
negb(negb-true)=true
可以通过
自反性来证明。
,因为左手侧和右手侧定义上是平等的。没有使用过“siml”以前,但也许我应该研究一下。我认为现在
siml
应该足够了。还有一个更强大的策略
compute
,但它可能会产生更大的术语。你可能想看看这个漂亮的东西。@Shuzheng,我真的建议你看看交互式课程软件基础,它提供了一个很好的介绍使用Coq。