软件基础:证明leb_complete和leb_correct

时间:2017-12-01 22:01:32

标签: coq

我一直在研究Benjamin Pierce等人的第1卷,软件基础,我在IndProp一章中遇到了一些问题。不幸的是,我不知道有更好的地方可以问:任何人都有任何提示吗?

 Theorem leb_complete : forall n m,
   leb n m = true -> n <= m.
 Proof.
 (* FILL IN HERE *) Admitted.

Theorem leb_correct : forall n m,
   n <= m ->
   leb n m = true.
Proof.
(* FILL IN HERE *) Admitted.

这些是在线教科书中的练习;请不要提出解决方案。但是有一个起点可能会有所帮助。

2 个答案:

答案 0 :(得分:1)

ejgallego有它! generalize dependent是你的朋友。

  

因此,在这种情况下,您需要为所有自然数证明一个属性[并且它不会从您的组合理论中得出,因为您只是定义对象],因此感应通常是正确的工具。但请注意,你有两个数字,你会想要你的归纳假设,让我们说n足够通用以涵盖所有m!这是一个重要的步骤,Coq的感应策略实际上并不能很好地涵盖。 - ejgallego Dec 2 at 1:32

答案 1 :(得分:0)

这是一个generalize dependent示例:

 Theorem leb_correct : forall n m,
  n <= m ->
  Nat.leb n  m = true.
Proof.
  intros.
  generalize dependent n.
  induction m.
  - intros.
    destruct n.
    + easy.
    + easy.
  - intros.
    destruct n.
    + easy.
    + apply IHm.
      apply (Sn_le_Sm__n_le_m _ _ H).
Qed.


Theorem Sn_le_Sm__n_le_m : forall n m,
  S n <= S m -> n <= m.
Proof.
  intros. inversion H.
    apply le_n.
    apply le_trans with (n := S n). apply n_le_Sn.
    apply H2.
Qed.