Coq 破坏应用谓词函数的结果

Coq 破坏应用谓词函数的结果,coq,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 => co

我是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或sy’。对于一般情况,我想做的是将destruct(beq_nat n y)设置为true或false,但我似乎无法实现这一点——我缺少了一些Coq语法

有什么想法吗?

你的代码坏了

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
    是一种语法,即它替换目标/假设中表达的术语。因此,您通常首先需要类似于
    siml
    (在这里工作)或
    unfold
    的内容
  • 术语的顺序很重要
    destruct(beq_nat n y)
    destruct(beq_nat n)
    不同。在这种情况下,您需要第二个
通常问题是
destruct
是哑的,所以你必须自己动手

不管怎样,开始证明吧

intros n y xs. simpl. destruct (beq_nat y n).
一切都会好的

啊,这是一个很好的发现——第一个bug是在堆栈溢出中键入时的一个输入错误。我想你的第二点关于析构函数(beq_nat Ny)与析构函数(beq_nat Ny)不同是我的问题。谢谢