Coq-证明已经定义的东西?

Coq-证明已经定义的东西?,coq,proof,Coq,Proof,简单地证明“两个自然数之和是奇数的,如果其中一个是偶数,另一个是奇数”: 此代码块末尾的状态为: 2 subgoals n, m, x : nat H : n + m = 2 * x + 1 ______________________________________(1/2) odd n ______________________________________(2/2) even m 据我所知,它告诉我,我需要通过这个假设证明我有一个奇数n和一个偶数m?即使我已经说过n是奇数,m是偶数?

简单地证明“两个自然数之和是奇数的,如果其中一个是偶数,另一个是奇数”:

此代码块末尾的状态为:

2 subgoals
n, m, x : nat
H : n + m = 2 * x + 1
______________________________________(1/2)
odd n
______________________________________(2/2)
even m
据我所知,它告诉我,我需要通过这个假设证明我有一个奇数n和一个偶数m?即使我已经说过n是奇数,m是偶数?我如何从这里开始

更新:

经过一段时间的坐立不安(根据评论),我想我必须这样做

Lemma even_or_odd: forall (n: nat), even n \/ odd n.
Proof.
  induction n as [|n IHn].
  (* Base Case *)
  left. unfold even. exists 0. firstorder.
  (* step case *)
  destruct IHn as [IHeven | IHodd].
  right. unfold even in IHeven. destruct IHeven as [k Heq].
  unfold odd. exists k. firstorder.
  left. unfold odd in IHodd. destruct IHodd as [k Heq].
  unfold even. exists (k + 1). firstorder.
Qed.
这意味着现在:

Lemma sum_odd : forall n m, odd (n + m) -> odd n /\ even m \/ even n /\ odd m.
Proof.
  intros n. intros m. left. destruct H. firstorder.
  pose proof (even_or_odd n). pose proof (even_or_odd m).
结果:

    2 subgoals
n, m, x : nat
H : n + m = 2 * x + 1
H0 : even n \/ odd n
H1 : even m \/ odd m
______________________________________(1/2)
odd n
______________________________________(2/2)
even m
直觉上,我所做的只是说每个数字不是偶数就是奇数。现在我必须告诉coq,我的奇数和偶数确实是奇数和偶数(我猜是吧?)

更新2:

顺便说一句,这个问题只需一阶即可解决:

Lemma sum_odd : forall n m, odd (n + m) -> odd n /\ even m \/ even n /\ odd m.
Proof.
  intros n. intros m. firstorder.
  pose proof (even_or_odd n). pose proof (even_or_odd m).
  destruct H0 as [Even_n | Odd_n]. destruct H1 as [Even_m | Odd_m].
  exfalso. firstorder.
  right. auto.
  destruct H1. left. auto.
  exfalso. firstorder.
Qed.

您使用的
left
仍然不正确,无法完成校对。将其应用于以下目标:

odd (n + m) -> odd n /\ even m \/ even n /\ odd m
它给出了:

H : odd (n + m)
______________________________________(1/1)
odd n /\ even m
您承诺证明如果
n+m
是奇数,那么
n
是奇数,
m
是偶数。但事实并非如此:
n
可能是奇数,
m
可能是偶数。只有当你在上下文中有足够的信息来确定你想证明哪一个时,才能应用
left
right

因此,让我们在没有
左侧的情况下重新启动:

Lemma sum_odd : forall n m, odd (n + m) -> odd n /\ even m \/ even n /\ odd m.
Proof.
  intros n. intros m. firstorder.
  pose proof (even_or_odd n). pose proof (even_or_odd m).
目前,我们正处于:

H : n + m = 2 * x + 1
H0 : even n \/ odd n
H1 : even m \/ odd m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
现在你想从析取中证明一些东西。为了在Coq的构造逻辑中证明某种形式的
A\/B->C
,你必须同时证明
A->C
B->C
。您可以通过对
A\/B
进行案例分析(使用
destruct
或其他策略)来实现这一点。在这种情况下,我们需要分解两个析取:

  destruct H0 as [Even_n | Odd_n], H1 as [Even_m | Odd_m].
这就有四种情况。我给你看前两个,后两个是对称的

第一种情况:

H : n + m = 2 * x + 1
Even_n : even n
Even_m : even m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
假设是矛盾的:如果
n
m
都是偶数,那么
H
就不能成立。我们可以证明如下:

  - exfalso. destruct Even_n, Even_m. omega.
(一步一步来了解发生了什么!)
exfalso
并不是真的必要,但我们通过证明假设与假设相矛盾来进行证明是很好的文档

第二种情况:

H : n + m = 2 * x + 1
Even_n : even n
Odd_m : odd m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
现在,知道了适用于这种情况的假设,我们可以致力于正确的分离。这就是为什么你的
阻碍了你的进步

  - right.
有待证明的是:

Even_n : even n
Odd_m : odd m
______________________________________(1/1)
even n /\ odd m

auto
可以处理这个问题。

您使用
left
仍然是不正确的,这会妨碍您完成校对。将其应用于以下目标:

odd (n + m) -> odd n /\ even m \/ even n /\ odd m
它给出了:

H : odd (n + m)
______________________________________(1/1)
odd n /\ even m
您承诺证明如果
n+m
是奇数,那么
n
是奇数,
m
是偶数。但事实并非如此:
n
可能是奇数,
m
可能是偶数。只有当你在上下文中有足够的信息来确定你想证明哪一个时,才能应用
left
right

因此,让我们在没有
左侧的情况下重新启动:

Lemma sum_odd : forall n m, odd (n + m) -> odd n /\ even m \/ even n /\ odd m.
Proof.
  intros n. intros m. firstorder.
  pose proof (even_or_odd n). pose proof (even_or_odd m).
目前,我们正处于:

H : n + m = 2 * x + 1
H0 : even n \/ odd n
H1 : even m \/ odd m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
现在你想从析取中证明一些东西。为了在Coq的构造逻辑中证明某种形式的
A\/B->C
,你必须同时证明
A->C
B->C
。您可以通过对
A\/B
进行案例分析(使用
destruct
或其他策略)来实现这一点。在这种情况下,我们需要分解两个析取:

  destruct H0 as [Even_n | Odd_n], H1 as [Even_m | Odd_m].
这就有四种情况。我给你看前两个,后两个是对称的

第一种情况:

H : n + m = 2 * x + 1
Even_n : even n
Even_m : even m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
假设是矛盾的:如果
n
m
都是偶数,那么
H
就不能成立。我们可以证明如下:

  - exfalso. destruct Even_n, Even_m. omega.
(一步一步来了解发生了什么!)
exfalso
并不是真的必要,但我们通过证明假设与假设相矛盾来进行证明是很好的文档

第二种情况:

H : n + m = 2 * x + 1
Even_n : even n
Odd_m : odd m
______________________________________(1/1)
odd n /\ even m \/ even n /\ odd m
现在,知道了适用于这种情况的假设,我们可以致力于正确的分离。这就是为什么你的
阻碍了你的进步

  - right.
有待证明的是:

Even_n : even n
Odd_m : odd m
______________________________________(1/1)
even n /\ odd m

而且
auto
可以处理这个问题。

你认为你在哪里说n是奇数,m是偶数?您使用
left
表示您想证明这两件事(而不是
偶数n/\奇数m
),但在您这样做之前,您需要做一些归纳/案例分析。您是说您需要通过归纳来证明这一点?为什么?证明这一点的经典方法是简单地说:
n=2a+1
m=2b
,因此
n+m=2a+1+2b
=>
n+m=2(a+b)+1
。在coq中,我找不到通过定义/替换进行证明的明显方式。我想我只是(错误地)假设coq会假设n是奇数,m是偶数,因为要证明
奇数(n+m)->奇数n/\偶数m
需要假设n是奇数,m是偶数。参数“
n=2a+1
m=2b
因此
n+m=2a+1+2b
”证明
奇数n/\偶数m->奇数(n+m)
,不是你想证明的相反。更新,谢谢你的输入。你认为你在哪里说n是奇数,m是偶数?您使用
left
表示您想证明这两件事(而不是
偶数n/\奇数m
),但在您这样做之前,您需要做一些归纳/案例分析。您是说您需要通过归纳来证明这一点?为什么?证明这一点的经典方法是简单地说:
n=2a+1
m=2b
,因此
n+m=2a+1+2b
=>
n+m=2(a+b)+1
。在coq中,我找不到通过定义/替换进行证明的明显方式。我想我只是(错误地)假设coq假设n是奇数,m是偶数,因为要证明
odd(n+m)->oddn/