Coq 为什么"ev n(S n)&"x27 ;;减少数量而不是增加数量?

Coq 为什么"ev n(S n)&"x27 ;;减少数量而不是增加数量?,coq,Coq,我在浏览时看到了以下简单代码: Inductive ev : nat -> Prop := | ev_0 : ev 0 | ev_SS : forall n : nat, ev n -> ev (S (S n)). 但是,当在证明ev 4为真的情况下使用apply ev SS.策略时: Theorem ev_4 : ev 4. Proof. (* goal: ev 4*) apply ev_SS. (* goal changed to: ev 2, why??? *) a

我在浏览时看到了以下简单代码:

Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
但是,当在证明
ev 4
为真的情况下使用
apply ev SS.
策略时:

Theorem ev_4 : ev 4.
Proof.  (* goal: ev 4*)
  apply ev_SS. (* goal changed to: ev 2, why??? *)
  apply ev_SS. 
  apply ev_0. 
Qed.
ev\u SS.
的应用让我困惑。如果我在“推断规则”中插入一个数字,我会得到它是增加而不是减少的:

ev 2 == ev 2 -> ev (S (S 2)).
我误解了什么


同样,这里发生了什么:

Theorem ev_4' : ev 4.
Proof. 
  apply (ev_SS 2 (ev_SS 0 ev_0)). 
Qed.

总的来说,有没有更好的方法来探索Coq中从一个地方到另一个地方的转换是如何发生的?如果我能做到这一点,我就可以更清楚地检查验证程序中发生的事情以及原因。

策略
应用
尝试使用函数/引理等来证明当前目标。在您的案例中,当前目标是
ev4
,因此要使用
ev\u SS
,我们需要将
ev\u SS
的结论与目标相匹配
ev\u SS:forall n:nat,ev n->ev(S n))。
,因此结论是
ev(S n))
。要将其与
ev 4
匹配,
n
必须为2

一旦
apply
弄清楚你还需要证明什么,它就会让这些东西成为新的目标。在这种情况下,
ev\u SS
以自然数
n
和类型
ev n
为前提。因为它计算出
n
必须是2,所以将
ev2
作为目标。
apply
的下一个用法是使用
n:=0
,因此剩下的目标是
ev0
。最后,
evu 0
没有任何前提,因此使用
apply evu 0
不会留下任何剩余目标

如果这没有帮助,想想非正式的证据会是什么样子。根据定义,零是偶数,如果n是偶数,则n+2是偶数。我们如何证明4是偶数?因为2是偶数。为什么?2是偶数,因为0是偶数。为什么?根据定义,0是偶数

定理
ev_4'
同时具有整个证明项<代码>应用看到没有什么需要证明的了,所以没有新的目标。apply的用法与策略
exact
完全相同

要了解战术如何运作的细节,我建议阅读。然而,由于文档通常是技术性的,并且缺乏示例,所以阅读其他人的Coq脚本并简单地自己进行实验是很重要的


关于你的评论:


在数学方面,我更习惯于从假设中得出目标,然后通过这种方式得出结论。但似乎在Coq中,我们通常从目标开始,这似乎是倒退的(尽管是正确的)。对于Coq来说,这通常是正确的,还是仅限于此示例

使用类似于
set(ev_2:=ev_SS ev_0)
,然后使用
exact(ev_SS ev_2)
的方法,可以从前提开始工作,而不是从目标开始工作。这可能是一个很好的单独问题

另外,为什么ev_0:ev 0被视为一个真实命题?是因为它是归纳定义的一部分吗

对。请记住,
ev
定义为

Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
因此,根据定义,ev_0:ev 0


你能给我解释一下语法的用法吗(ev_SS 2(ev_SS 0 ev_0))。意味着什么


这意味着“使用参数调用策略
apply
(ev_ss2(ev_ss0 ev_0))。如果您还没有意识到,Coq使用语法
fx
代替数学中通常编写的
f(x)
。Coq还用于表示具有多个参数的函数。而不是
f(x,y)
,我们写
fxy
。这实际上意味着类似于
f(x)(y)
,因此
f(x)
是一个以
y
为参数的函数。如果我们要用更传统的语法重写这一行,当你计算术语时,它将是
应用(ev_SS(2,ev_SS(0,ev_0))
。“
n
会增加”,但当你做一个归纳证明时,你会问“我是怎么到这里来的?”如果你有一个证明
ev(S(sn))
是真的,那么你能到达那里的唯一方法(如果你的逻辑是正确的)这也是真的。

在阅读了更多关于Coq的文档之后,我想我对Coq策略的理解比这个具体的例子更为笼统。从我对什么策略的阅读来看,
策略实现了反向推理。
正如文档中所说。来自文档:
“为了证明这一点,我必须证明这个和这个”。例如,为了证明∧ B、 我必须证明A,我必须证明B。
所以要证明ev 4我们需要证明ev 2等等。Apply只是尝试将当前目标与我们提供的任何术语匹配,并产生一定数量的子目标,我们现在需要证明或匹配

我认为主要的事情是,因为
ev\u SS
的定义,我们知道如果
ev2
是真的,那么因为我们定义了真实的含义
ev2=>ev4
,那么我们就可以得出
ev4
。所以我们真的只需要检查
ev2
是真的。如果我们真的证明了这一点,那么我们可以通过Modus Ponens(MP)来证明我们知道ev 4是真的。这就是为什么反向推理“有效”的原因,因为我们将目标与一些真的推理规则的结论相匹配,因此当我们证明前提为真时,目标是真的(因为推理规则).我这么说是因为从目标开始对我来说似乎很奇怪,因为我们不知道这是真的。(然而)。尽管如此,现在我看到我们通过简单地显示前提和匹配正确的推理规则来证明目标是真的。至少在这个例子中是这样的

我假设在一般战术中实施某种反向推理,我们需要显示子目标,不确定它是否始终是一个推理规则,但我认为总体思路对我来说现在是有意义的。