Coq为内射函数定义类型构造函数


Coq define a type constructor for injective functions

从类型AB的内射函数会将不同的输入映射到不同的输出,但可能不会覆盖整个范围。

例如

1
2
f : ? -> ?
f = λx. 2*x

我试图弄清楚如何在Coq中表达这样的事情。

我认为,用Coq谈论这样一个对象的方式应该是某种产品类型,其中一个元素是"原始"函数A -> B本身,另一个是该函数具有内射性的证明。

我不知道如何用Coq的语法表达这一点……更具体地说,如何在相同的"结构"中定义类型的类型中引用函数的名称以及使用哪种产品-喜欢的东西最合适。

我尝试将一些东西放到这里的ellpises中,但无法捕获该功能。

1
2
Definition injection (A : Prop) (B: Prop) :=
  A -> B /\\ ...

我被困在椭圆上。

另一个无法捕获正确内容的示例定义是这样的:

1
2
Definition injection (A : Prop) (B: Prop) :=
  A * (not (A = A)) -> B * (not (B = B)).

这里的问题是=本身是在类型上操作的...并且,即使可以将此定义简化为更好的定义,它也需要大量的管道。


一种方法是定义一个名为injective的属性,并将其作为条件添加到要求其函数具有内射性的引理中:

1
2
3
4
Definition injective {A B} (f : A -> B) := forall x1 x2, f x1 = f x2 -> x1 = x2.

Lemma inj_comp {A B C} (f : B -> C) (g : A -> B) :
  injective f -> injective g -> injective (fun x => f (g x)).

这是Mathcomp / SSReflect中采用的方法(请参见此处的定义和用法)。

除非您正在开发内射函数理论,否则将函数及其内射性捆绑在一起可能不是最好的方法。