关于Coq中列表的推理

时间:2015-12-28 12:37:36

标签: coq

我试图解决一些定理,基于Pierce"软件基础"。

首先,我创建了一些有用的功能:

Inductive natlist: Type :=
  | nil: natlist
  | cons : nat -> natlist -> natlist.

Notation "x :: l" := (cons x l) (at level 60, right associativity).

Fixpoint repeat (n count: nat): natlist :=
    match count with
      | O => nil
      | S count' => n :: (repeat n count')
    end.

  Fixpoint length (l: natlist): nat :=
    match l with
      | nil => O
      | h :: t => S (length t)
    end.

 Theorem count_repeat: forall n: nat, length (repeat n n) = n.
  Proof.
    intros n. induction n as [| n'].
    simpl. reflexivity.
    simpl. (* and here I can't continue... *)

我想听听皮尔斯的建议:

  

请注意,由于这个问题有点开放,所以可行   你可能会提出一个真实的定理,但是它的证明   需要你尚未学到的技巧。随意寻求帮助   如果你卡住了!

那么,请你为我提出一些证明技巧吗?

1 个答案:

答案 0 :(得分:3)

正如@eponier所说,你应该试着证明一个更普遍的引理,比如

Theorem count_repeat_gen: forall m n: nat, length (repeat n m) = m.

使用repeat n n会在元素的值和列表的大小之间创建一个隐式链接,这使得您的语句无法直接证明。一旦你证明count_repeat_gen,你就能证明你的定理。