Coq 破坏应用谓词函数的结果
我是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
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)不同是我的问题。谢谢