我正在阅读软件基金会这本书。在“更多关于归纳”一章中,作者讨论了当定义归纳类型时由coq生成的归纳原理。
练习如下。在定义中封装“+”的关联概念,然后在其上应用nat_ind。
我对该定义的第一个猜测如下:
Definition P_plusassoc (n m o:nat) : Prop :=
n + (m+ o) = (n+m) +o.
但是,当我想证明这一点时,我遇到了问题:
Theorem plus_assoct : forall o m n, P_plusassoc n m o.
Proof.
apply nat_ind.
nat_ind
不起作用。所以我认为这是因为P_plusassoc
不仅仅依赖于一个整数而是三个。
所以我用这种方式重写P_plusassoc
:
Definition P_plusassoc (n:nat) : nat->nat->Prop :=
fun (m o:nat) => n + (m+ o) = (n+m) +o.
但它仍然无效。问题出在哪儿 ?如何定义P_plusassoc
以使用nat_ind
?
答案 0 :(得分:1)
这本书给出了答案。定义可以是:
Definition P_plusassoc (n:nat) : Prop :=
forall m o, n + (m+ o) = (n+m) +o.
答案 1 :(得分:0)
这个问题希望你证明一个引理。但是,您正在定义一个函数。你应该做的是定义类型为Prop的东西(如Definition P_plusassoc (n:nat) : Prop := forall m o, n + (m+ o) = (n+m) +o.
)。
就个人而言,我会定义一个Lemma : forall m n o :nat, n+(m+o)=(n+m)+o.
Coq然后会让你证明这个引理,你可以通过intros. apply (nat_ind n).