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)

  • 使用构造
    Sum
    s、
    destruct
    ,以及引理来表示n+m=n+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.

感谢@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.