我试图解决一些定理,基于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... *)
我想听听皮尔斯的建议:
请注意,由于这个问题有点开放,所以可行 你可能会提出一个真实的定理,但是它的证明 需要你尚未学到的技巧。随意寻求帮助 如果你卡住了!
那么,请你为我提出一些证明技巧吗?
答案 0 :(得分:3)
正如@eponier所说,你应该试着证明一个更普遍的引理,比如
Theorem count_repeat_gen: forall m n: nat, length (repeat n m) = m.
使用repeat n n
会在元素的值和列表的大小之间创建一个隐式链接,这使得您的语句无法直接证明。一旦你证明count_repeat_gen
,你就能证明你的定理。