我对Coq的归纳谓词不熟悉。我已经学会了如何定义简单的归纳谓词,例如" even" (如adam.chlipala.net/cpdt/html/Predicates.html)或" last" (如http://www.cse.chalmers.se/research/group/logic/TypesSS05/resources/coq/CoqArt/inductive-prop-chap/SRC/last.v)。
现在我想尝试一些稍微复杂的东西:将加法定义为归纳谓词,但我陷入困境。我做了以下事情:
Inductive N : Type :=
| z : N (* zero *)
| s : N -> N. (* successor *)
Inductive Add: N -> N -> N -> Prop :=
| add_z: forall n, (Add n z n)
| add_s: forall m n r, (Add m n r) -> (Add m (s n) (s r)).
Fixpoint plus (x y : N) :=
match y with
| z => x
| (s n) => (s (plus x n))
end.
我想证明一个简单的定理(类似于www.cse.chalmers.se/research/group/logic/TypesSS05/resources/coq/CoqArt/inductive-prop-中为last和last所做的事情。 CHAP / SRC / last.v):
Theorem T1: forall x y r, (plus x y) = r -> (Add x y r).
Proof.
intros x y r. induction y.
simpl. intro H. rewrite H. apply add_z.
case r.
simpl. intro H. discriminate H.
???
但后来我陷入困境。归纳假设似乎很奇怪。我不知道我是否错误地定义了Add
,或者我是否只是使用了错误的策略。你能帮助我,纠正我的归纳Add
或告诉我如何完成这个证明吗?
答案 0 :(得分:2)
您在使用r
上的归纳之前介绍了y
。一般来说,你会在引入任何东西之前使用归纳法,因此归纳假设尽可能通用。
Conjecture injectivity : forall n m, s n = s m -> n = m.
Theorem T1: forall x y r, (plus x y) = r -> (Add x y r).
Proof.
intros x y. induction y.
simpl. intros r H. rewrite H. apply add_z.
intro r. case r.
simpl. intro H. discriminate H.
simpl. intros n H. apply add_s. apply IHy. apply injectivity. apply H.
Qed.