破坏应用谓词函数的结果

时间:2011-12-27 00:47:38

标签: coq

我是Coq的新手,对于破坏战术有一个快速的问题。假设我有一个count函数,它计算自然数列表中给定自然数的出现次数:

Fixpoint count (v : nat) (xs : natlist) : nat :=
  match xs with
    | nil => 0
    | h :: t =>
      match beq_nat h v with
        | true => 1 + count v xs
        | false => count v xs
      end
  end.

我想证明以下定理:

Theorem count_cons : forall (n y : nat) (xs : natlist),
  count n (y :: xs) = count n xs + count n [y].

如果我证明n = 0的类似定理,我可以简单地将y破坏为0或S y'。对于一般情况,我想要做的是将(beq_nat n y)破坏为真或假,但我似乎无法使其工作 - 我错过了一些Coq语法。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您的代码已损坏

Fixpoint count (v : nat) (xs : natlist) : nat :=
 match xs with
  | nil => 0
  | h :: t =>
  match beq_nat h v with
    | true => 1 + count v xs (*will not compile since "count v xs" is not simply recursive*)
    | false => count v xs
  end
end.
你可能意味着

Fixpoint count (v : nat) (xs : natlist) : nat :=
 match xs with
  | nil => 0
  | h :: t =>
  match beq_nat h v with
    | true => 1 + count v t
    | false => count v t
  end
end.

使用destruct是获得解决方案的绝佳方式。但是,你需要记住一些事情

  • destruct是句法,即它取代了您的目标/假设中表达的术语。因此,您通常需要simpl(在此工作)或unfold首先使用。
  • 条款的顺序很重要。 destruct (beq_nat n y)destruct (beq_nat y n)不同。在这种情况下,您需要第二个

一般来说问题是destruct是愚蠢的,所以你必须自己做聪明才智。

无论如何,开始你的证明

intros n y xs. simpl. destruct (beq_nat y n).

一切都会好的。