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

格雷戈里·尼斯贝特

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

例如

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

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

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

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

我已经尝试过将一些事情放到这里,但无法捕获该功能。

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

我被困在椭圆上。

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

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

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

安东·特鲁诺夫(Anton Trunov)

一种方法是定义一个称为的属性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中采用的方法(请参见此处定义和用法)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Coq使用强制类型定义构造函数的困难

证明单数(内射)和史诗(外射)函数在Coq中具有反函数

我们怎么知道所有的Coq构造函数都是内射的和不相交的?

如何在构造函数上为静态属性定义类型

TypeScript 为大量构造函数属性定义类型

如何理解Coq类型构造函数var(t:T)

Coq:如何引用由特定构造函数生成的类型?

Coq无法区分依存类型归纳命题的构造函数

在简单的构造演算中,构造函数是不相交和内射的吗?

为采用带有类型参数的方法的类型类定义构造函数?

构造函数内部对象定义内的For循环

如何在 IUnityContainer 的构造函数中为抽象类型正确定义 ParameterOverride

没有为类型dbcontext定义无参数构造函数

是否可以将容器的复制构造函数定义为不可复制的值类型已删除?

没有为'System.Collections.Generic.IList`1的类型定义无参数构造函数

如何使用构造函数约束定义类型为泛型列表的参数?

为数组创建构造函数并使用自定义类型填充它

为什么将Reader的构造函数参数定义为函数?

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

没有明确证明数据构造函数是内射的相等性测试

用户定义类型的Show的Haskell实例-构造函数不在范围内

(SML)将类型定义为函数并创建此类型的函数

如何使用类型别名定义类型构造函数

为“精炼”类型获取正确的类型构造函数参数

使用QuickCheck生成内射函数吗?

使用内射函数的逆值

如何在Scala Cats中创建自定义类型构造函数的类型为Monad [F [_]]的类的实例

转到构造函数类型

类型上的模式匹配,以实现Coq中存在类型的构造函数的相等性