我正在尝试编写一个归纳假设,专门用于证明偶数的属性。我制定并证明了以下内容:
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.
尽管事实已经证实,但任何使用它的尝试都会导致错误信息:“错误:感应参数的数量不正确。”
有人可以告诉我归纳假设有什么问题,或者其他方法,如何应用它?
谢谢,
迈耶
答案 0 :(得分:2)
我相信induction
假设将使用的任何归纳原理都具有
固定表格
forall ... (P : SomeType -> Type) ..., (* or ->Set or ->Prop *)
... ->
forall (v : SomeType), P v
您的ind_hyp_on_evens
仅匹配P (plus n n)
,这似乎会混淆induction
。
如果你有一个合适的目标,比如forall n, is_even (n+n)
,你可以手动执行
induction
通常执行的步骤,并扩展它以处理特殊形式。
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
策略应该有效。
答案 1 :(得分:0)
您可以考虑编写一个描述偶数的归纳谓词(代码未经过测试):
Inductive even : nat -> Prop :=
| evenO : even O
| evenSSn : forall n, even n -> even (S (S n))
.
Coq将自动生成归纳原理。
在能够对n的“均匀度”进行归纳之前,你必须证明even n
成立。