证明构造函数是 Coq 中的偏函数

Proving constructors are partial functions in Coq

归纳定义如下:

Inductive A :=
 mkA : nat -> A.

证明构造函数是部分函数可以编码为:

Lemma constructor_functional :
 forall i1 i2, mkA i1 <> mkA i2 -> i1 <> i2.

虽然证明起来很简单,但对每个定义的类型都这样做听起来很奇怪。

是否有编码此 属性 的策略?或者图书馆里的一些等价物?尽管通过搜索 (_ <> _).

我没有在 ssreflect 中找到任何东西

您可以声明一个通用引理,将此结果包含在每个 Coq 函数中。由于像您的 mkA 这样的构造函数只是函数,因此结果也适用于它们。

Lemma function_functional :
  forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
    f x1 <> f x2 -> x1 <> x2.
Proof.
  intros X Y f x1 x2 H1 H2.
  apply H1.
  now rewrite H2.
Qed.

这条语句实际上是标准库中下面一条语句的反面。

Lemma f_equal :
  forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
    x1 = x2 -> f x1 = f x2.