如何使Coq形式化可重用?

如何使Coq形式化可重用?,coq,Coq,我正在研究一种算法的Coq形式化。但是这个算法的组件(一些函数和引理)可以在不同的类型上“重载”(在Haskell意义上) 我的目的是避免代码重复。我知道Coq有模块(比如ML)和类型类(比如Haskell)。实现引理和函数定义的可重用性的最佳方法是什么?它可以在不同的类型上参数化?最好避免使用Coq模块来执行名称空间或使定义不透明以外的任何操作。在编写参数化定义方面,依赖记录(类型类背后的底层功能)通常优于模块,因为它们是一级对象,可以通过应用于Coq中其他对象的相同规则进行操作。也就是说,当

我正在研究一种算法的Coq形式化。但是这个算法的组件(一些函数和引理)可以在不同的类型上“重载”(在Haskell意义上)


我的目的是避免代码重复。我知道Coq有模块(比如ML)和类型类(比如Haskell)。实现引理和函数定义的可重用性的最佳方法是什么?它可以在不同的类型上参数化?

最好避免使用Coq模块来执行名称空间或使定义不透明以外的任何操作。在编写参数化定义方面,依赖记录(类型类背后的底层功能)通常优于模块,因为它们是一级对象,可以通过应用于Coq中其他对象的相同规则进行操作。也就是说,当将Coq代码提取到OCaml中时,Coq模块被提取到OCaml模块中,而依赖记录依赖于智能记录来正常工作。因此,如果您关心如何提取到OCaml中,以及如何与提取的代码交互,那么模块可能是更好的选择

类型类是建立在依赖记录之上的一种功能,通过添加自动实例推理,使它们更易于使用。不幸的是,Coq中的类型类实例推理并不是超级健壮的,需要您调整实例或手动提供实例以使其在实践中发挥作用——在任何情况下,它们肯定比Haskell对应的实例更难使用——并且也会减慢编译时间。该库在很大程度上依赖于类型类来定义数学结构,而且似乎对它们很有效

还有另一个特性称为规范结构,它也基于依赖记录,实现的功能与类型类大致相同,但编程模型和推理引擎略有不同。在某些情况下,它们比类型类工作得更好,但在其他情况下更难使用。例如,图书馆广泛使用它们

有一个关于使用模块或记录的小讨论