Coq:帮助形式化一个非正式的证明

Coq: help to formalize an informal proof

Theorem ev_ev__ev_full : forall n m,
  even (n+m) <-> (even n <-> even m).
Proof.
  intros n m. split.
  - intros H. split.
    + intros H1. apply (ev_ev__ev n m H H1).
    + intros H1. rewrite plus_comm in H. apply (ev_ev__ev m n H H1).
  - intros H.

输出:

  n, m : nat
  H : even n <-> even m
  ============================
  even (n + m)

现在n可以是偶数也可以不是偶数。

偶数 ((n' + m') + 2)。在 apply ev_SS 之后我们得到偶数 (n' + m')。由于我们知道 n' 是偶数且 m' 是偶数,我们 apply ev_sum。这证明了定理。

如何在 coq 中编写这个非正式证明?

从这些引理开始:

Theorem even_S (n : nat) : (~even n <-> even (S n)) /\ (even n <-> ~even (S n)). Admitted.
Theorem contra {A B : Prop} (prf : A -> B) : ~B -> ~A. Admitted.

even_S 是通过归纳法证明的,我认为这是定理的例子之一,使结论比您预期的更强大可以更容易地证明(删除 /\ 的任一侧使剩下的一方困难)。 contra 是一个 tauto 逻辑。

知道 even_Seven n 的可判定性直接从对 n 的归纳得出。

Theorem even_dec (n : nat) : {even n} + {~even n}. Admitted.

这是一个决策程序:even_dec n 告诉您 n 是否是 even,取决于它 returns 是左选项还是右选项。 { _ } + { _ }sumbool 的表示法。它基本上就像一个 bool(它在 Set 中,因此可以在计算相关的上下文中被破坏)除了它还见证了两个给定的 Prop 之一,具体取决于替代方案。在你的证明中,第一步是分支 属性:

    destruct (even_dec n) as [prf_n | prf_n].

如果even n,证明是微不足道的。

    + admit.

否则,反向蕴涵的逆反告诉我们~even m。我们还可以消除 nots:

    + pose proof (contra (proj2 H) prf_n) as prf_m.
      apply even_S in prf_n.
      apply even_S in prf_m.

证明的其余部分(断言 n = S n'm = S m'even n'even m' 因此 even (n + m))紧随其后的是一些工作(与inversion).

      admit.

(我自己填写了 admit 并且这条路径 确实 成功地导致了证明,但只是泄露所有答案并不好玩 :)。 )