从类型A
到B
的内射函数将不同的输入映射到不同的输出,但可能不会覆盖整个范围。
例如
f : ℕ -> ℕ
f = λx. 2*x
我正试图弄清楚如何用Coq表达这种东西。
我认为Coq谈论这种对象的方式将是某种产品类型,其中一个元素是“原始”函数A -> B
本身,而另一个是该函数是内射性的证明。 / p>
我不知道如何用Coq的语法表达这一点……更具体地讲,如何能够在相同的“结构”中的类型定义中引用函数的名称以及哪种类型像产品一样的东西最合适。
我已经尝试在此处放置一些内容,但无法捕获该功能。
Definition injection (A : Prop) (B: Prop) :=
A -> B /\ ...
我被困在椭圆上。
另一个无法捕获正确内容的示例定义如下:
Definition injection (A : Prop) (B: Prop) :=
A * (not (A = A)) -> B * (not (B = B)).
这里的问题是=
对类型本身进行操作……并且,即使可以将此定义简化为一个更好的定义,也将需要大量令人讨厌的管道操作。
答案 0 :(得分:2)
一种方法是定义一个名为injective
的属性,并将其作为条件添加到要求其函数具有内射性的引理中:
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中采用的方法(请参见definition和用法,例如here)。
除非您正在开发内射函数理论,否则将函数及其内射性捆绑在一起可能不是最好的方法。