Coq define a type constructor for injective functions
从类型
例如
1 2 | f : ? -> ? f = λx. 2*x |
我试图弄清楚如何在Coq中表达这样的事情。
我认为,用Coq谈论这样一个对象的方式应该是某种产品类型,其中一个元素是"原始"函数
我不知道如何用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)). |
这里的问题是
一种方法是定义一个名为
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中采用的方法(请参见此处的定义和用法)。
除非您正在开发内射函数理论,否则将函数及其内射性捆绑在一起可能不是最好的方法。