用Coq表示定理定义

用Coq表示定理定义,coq,Coq,我想查看通过Search找到的标准库定理的定义。我想看到这个定义会帮助我完成一个类似的定理 执行打印Rdiv\u lt\u 0\u compat.会产生: Rdiv_lt_0_compat = fun (a b : R) (H : (0 < a)%R) (H0 : (0 < b)%R) => Rmult_lt_0_compat a (/ b) H (Rinv_0_lt_compat b H0) : forall a b : R, (0 < a)%R ->

我想查看通过
Search
找到的标准库定理的定义。我想看到这个定义会帮助我完成一个类似的定理

执行
打印Rdiv\u lt\u 0\u compat.
会产生:

Rdiv_lt_0_compat = 
fun (a b : R) (H : (0 < a)%R) (H0 : (0 < b)%R) =>
Rmult_lt_0_compat a (/ b) H (Rinv_0_lt_compat b H0)
     : forall a b : R, (0 < a)%R -> (0 < b)%R -> (0 < a / b)%R

Argument scopes are [R_scope R_scope _ _]
Rdiv\u lt\u 0\u compat=
乐趣(ab:R)(H:(0
Rmult_lt_0_compat a(/b)H(Rinv_0_lt_compat b H0)
:对于所有AB:R,(0(0(0

设置
设置全部打印。
没有帮助。在

中没有任何额外的可用性整个Coq系统是基于理念的证明是程序,逻辑公式是类型。当你考虑一个定理时,它是一个证明(一个程序),它的陈述是一个逻辑公式(程序的类型)。非常 在Coq的最初几年,没有战术语言,每一个证明都使用与定义程序时相同的关键字来定义

几年后,人们认识到完全用手编写程序既冗长又乏味,于是发明了一种策略性语言来解释如何以更短、更轻松的方式构造证明程序。但记录并最终检查的仍然是使用
Print
看到的程序

在构建验证程序时,策略
intros
构造匿名函数表达式(也称为lambdas,通常用关键字
fun
apply
编写,将函数应用于一定数量的参数,这些参数
apply
推断或留给用户作为目标。策略
归纳
重写
类似,但它们应用的定理并不相同 由用户给定。策略
destruct
实质上产生一段程序,它是一个模式匹配结构

有了Rdiv\u lt\u 0\u compat
,你很幸运,用策略生成的证明非常短。通常,用策略编写的证明生成的程序要长得多

如果你不想看到程序,而是想看到生成它的战术序列,你需要在系统的源代码中找到它,因为 并没有被保存在证据助理的记忆中。以下是线索

Require Import Reals.

Locate Rdiv_lt_0_compat.
答案是
常数Coq.Reals.RIneq.Rdiv\u lt\u 0\u compat

此名称序列表示保留定理的模块层次结构。第一个名称
Coq
表示此定理位于Coq源代码中,基本上位于目录
…theory/
,第二个名称
Reals
,表示您应该查看tge子目录
…theory/Reals
。 第四个名称不应用作目录名,而应用作文件名。因此,您应该查看文件
RIneq.v

所以,仔细看一下,您可能会发现用于生成定理的脚本片段(对于Coq的8.12版本)


Locate
提供的名称序列不是查找存储定理脚本的文件的可靠方法。当使用模块和函子实例化定义定理时,长名称和文件路径之间的对应关系将被破坏。在这种情况下,您必须更深入地了解Coq系统是如何工作的有效。

“两个正数的商是正数,因为除法是由倒数相乘(不可见,可以尝试
Locate/“
找到定义),正数的倒数是正数(
Rinv\u 0 lt\u compat
),正数的乘积是正数(
Rmult\u lt\u 0\u compat
)。”证明是用Gallina给出的,这并不总是人眼可读的。Gallina证明是Ltac程序的输出,您只能在中找到。仅供参考,一些IDE可能会提供一些功能来直接“跳转到定义”(内部依赖于类似的命令)。参见例如:哇,谢谢。这是我需要的详细程度。我最近一直在阅读和查看很多关于Coq的内容,但没有在你的介绍中听到关于战术语言发展的一点。我只是从表面上看,当我在定理上打印
时,不明白那是什么乱七八糟的。听起来我需要Vim/Emacs标签为Coq的克隆回购进行设置,以使其在导航方面表现得体…这似乎是@ErikMD的建议。我已经觉得我需要的不仅仅是基本的
搜索
@user2183336 BTW关于Coq的用户界面,在这个URL上有一个专用网页: