Coq 偶数的归纳假设

Coq 偶数的归纳假设,coq,induction,Coq,Induction,我试图写一个归纳假设,专门用来证明偶数的性质。我提出并证明了以下几点: Theorem ind_hyp_on_evens: forall (p : nat -> Prop), (p 0 -> (forall n, p n -> p (S (S n))) -> forall n, p (n + n)). Proof. intros p P0 P1. intro n. assert(p (n + n) /\ p (S (S (n + n)))). induction

我试图写一个归纳假设,专门用来证明偶数的性质。我提出并证明了以下几点:

Theorem ind_hyp_on_evens:
forall (p : nat -> Prop), 
(p 0 -> (forall n, p n -> p (S (S n))) -> 
forall n, p (n + n)). 
Proof.
intros p P0 P1.
intro n.
assert(p (n + n) /\ p (S (S (n + n)))). 
induction n as [| n'].  
split. unfold plus. assumption.
unfold plus. 
apply (P1 0).
assumption.
destruct IHn' as [A B]. 
split. 
rewrite <- plus_Snm_nSm.
rewrite -> ? plus_Sn_m.
assumption. 
rewrite <- plus_Snm_nSm.
rewrite -> ? plus_Sn_m.
apply (P1 (S (S (n' + n')))).
assumption. 
destruct H as [H1 H2].
assumption. Qed. 
定理ind\u hyp\u on\u evens:
forall(p:nat->Prop),
(p0->(对于所有n,pn->p(S(sn))->
对于所有n,p(n+n))。
证明。
简介p P0 P1。
简介。
断言(p(n+n)/\p(S(n+n)))。
诱导n为[|n']。
分裂展开加号。假设。
展开加号。
应用(p10)。
假设。
将IHn'分解为[A B]。
分裂
重写?加上。
假设。
重写?加上。
应用(P1(S(n'+n')))。
假设。
将H分解为[H1 H2]。
假设。Qed。
尽管事实证明了这一点,但任何使用它的尝试都会导致错误消息:“错误:归纳参数的数量不正确。”

有人能告诉我归纳假设有什么问题吗?或者,如何应用它

谢谢


Mayer

< P>你可以考虑写一个描述偶数(未经测试的代码)的归纳谓词:

Coq将自动生成感应原理。
在能够对n的“均匀性”进行归纳之前,您必须证明
即使n也成立。

我相信
归纳
假设将使用的任何归纳原则都具有 固定形式

forall ... (P : SomeType -> Type) ..., (* or ->Set or ->Prop *)
   ... ->
   forall (v : SomeType), P v
你的
ind\u hyp\u on\u evens
只匹配
p(加n)
,这似乎混淆了
归纳法

如果你有一个合适的目标,比如说所有n个都是偶数(n+n)
,你可以手动执行
归纳法
通常执行的步骤,并扩展该步骤以处理特殊表单

intro n0;                            (* temp. var *)
pattern (n0 + n0);                   (* restructure as (fun x => (is_even x)) (n0+n0) *)
refine (ind_hyp_on_evens _ _ _ n0);  (* apply ind. scheme *)
clear n0; [| intros n IHn ].         (* clear temp., do one 'intros' per branch *)

我不知道是否有可能将其打包为任何入职培训计划的通用辅助策略,但将这些步骤打包为每个计划
Ltac
策略应该有效。

您是如何尝试应用它的?发布导致错误消息的代码。这是正确的,尽管您也可以想象使用简单的不动点定义手工编写归纳原则,而不需要引入辅助谓词。
intro n0;                            (* temp. var *)
pattern (n0 + n0);                   (* restructure as (fun x => (is_even x)) (n0+n0) *)
refine (ind_hyp_on_evens _ _ _ n0);  (* apply ind. scheme *)
clear n0; [| intros n IHn ].         (* clear temp., do one 'intros' per branch *)