Coq 如何显示函数的内射性?
我想证明的是:Coq 如何显示函数的内射性?,coq,coq-tactic,Coq,Coq Tactic,我想证明的是:定理add\n\u内射:对于所有的nmp,n+m=n+p->m=p. +是加上的符号,定义如下: 在Agda中,可以使用cong(n+)将n+m=n+p这一事实用于任何NMP Coq的内置策略注入和一致性似乎都很有希望,但它们只适用于构造函数 我尝试了以下策略,不断出现奇怪的错误或陷入困境: 制作一个感应类型,用于捆绑(n+m=s)和(n+m=s)的证明 在显示Sum(nms)=Sum(nps) 使用构造Sums、destruct,以及引理来表示n+m=n+p 有没有更简单的方
定理add\n\u内射:对于所有的nmp,n+m=n+p->m=p.
+
是加上
的符号,定义如下:
在Agda中,可以使用cong(n+)
将n+m=n+p
这一事实用于任何NMP
Coq的内置策略注入
和一致性
似乎都很有希望,但它们只适用于构造函数
我尝试了以下策略,不断出现奇怪的错误或陷入困境:
- 制作一个感应类型,用于捆绑(n+m=s)和(n+m=s)的证明
- 在显示
Sum(nms)=Sum(nps)
- 使用构造
s、Sum
,以及引理来表示n+m=n+pdestruct
展开时的一些诡计
更新
明白了:
Theorem add_n_injective : forall n m p, n + m = n + p -> m = p.
Proof.
intros. induction n.
- exact H.
- apply IHn. (* goal: n + m = n + p *)
simpl in H. (* H: S (n + m) = S (n + p) *)
congruence.
Qed.
感谢@ejgallego鉴于plus
函数可以是任意的(非内射的),因此plus
的内射性不是一个“基本”语句
我要说的是,标准证明确实需要在左参数上进行归纳
,事实上,使用这种方法,证明很快就会进行
当你达到形式为S(n+m)=S(n+p)
的目标时,你需要injection
来推导内部等式。鉴于plus
函数可以是任意的(非内射的),所以plus的内射性不是一个“基本”语句
我要说的是,标准证明确实需要在左参数上进行归纳
,事实上,使用这种方法,证明很快就会进行
当你达到一个形式为S(n+m)=S(n+p)
的目标时,你需要injection
来推导内部等式。Agda cong策略也不能证明这个目标。(它可以显示m=p->n+m=n+p
,但不能显示n+m=n+p->m=p
)在Agda和coq中,您必须对n进行归纳。更紧凑的证明现在是归纳n;[|注入1]。
@ejgallego,我尝试了证明。介绍。现在诱导n;[|注1]
并获得“即使在头部降低后,当前目标中也没有第一个非依赖性假设”。@MaxHeiber do介绍n m p
。Agda cong战术也不会证明这一目标。(它可以显示m=p->n+m=n+p
,但不能显示n+m=n+p->m=p
)在Agda和coq中,您必须对n进行归纳。更紧凑的证明现在是归纳n;[|注入1]。
@ejgallego,我尝试了证明。介绍。现在诱导n;[|注1]
并获得“即使在头部降低后,当前目标中也没有第一个非依赖性假设”。@MaxHeiber do简介n m p
。
Theorem add_n_injective : forall n m p, n + m = n + p -> m = p.
Proof.
intros. induction n.
- exact H.
- apply IHn. (* goal: n + m = n + p *)
simpl in H. (* H: S (n + m) = S (n + p) *)
congruence.
Qed.