代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

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

coq
  •  2
  • Greg Nisbet  · 技术社区  · 6 年前

    类型的内射函数 A B

    例如

    f : ℕ -> ℕ
    f = λx. 2*x
    

    我在想怎么用Coq来表达这样的东西。

    A -> B

    我试着把一些东西放在这里的ellpies里,但是不能捕获函数。

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

    我不知道该把什么放在椭圆里。

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

    = 正在操作类型本身。。。而且,即使这个定义可以被修改成更好的定义,它也需要大量令人讨厌的管道。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Anton Trunov    6 年前

    一种方法是定义一个名为 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 ).