我需要使用名为Coq.Arith.PeanoNat(https://coq.inria.fr/library/Coq.Arith.PeanoNat.html)的标准库部分。
我已尝试导入整个Arith库或仅导入此模块,但无论如何都无法使用它。
我尝试过的每个其他图书馆工作得很好。当我Require Import Bool.
编译时,我可以正确使用它。在Print Bool.
后,我可以看看下一格式中的所有函数:
Module
Bool
:= Struct
Definition...
.
.
.
End
当我执行Require Import Arith.PeanoNat.
或Require Import Arith.
时,我将其视为即时输出:
[Loading ML file z_syntax_plugin.cmxs ... done]
[Loading ML file quote_plugin.cmxs ... done]
[Loading ML file newring_plugin.cmxs ... done]
<W> Grammar extension: in [tactic:simple_tactic], some rule has been masked
<W> Grammar extension: in [tactic:simple_tactic], some rule has been masked
<W> Grammar extension: in [tactic:simple_tactic], some rule has been masked
<W> Grammar extension: in [tactic:simple_tactic], some rule has been masked
<W> Grammar extension: in [tactic:simple_tactic], some rule has been masked
当我问Coq Print Arith.PeanoNat
它输出:Module Arith := Struct End
时,它似乎是空的。当我尝试使用库中的任何内容时,例如布尔比较下的le_le
,我得到了标准Error: leb_le not a defined object.
我更新了Coq和库,我不知道这里可能会发生什么。我很感激您在解决此库问题方面的意见。
答案 0 :(得分:11)
如果我没弄错的话,Require
是加载文件的关键字。 Import
与管理名称空间有关。通常它们一起使用,如Require Import PeanoNat.
,但它们实际上做了两件不同的事情。
当coq文件(DirName/FileName.vo
)加载了Require
时,好像FileName.vo
的内容包含在Module DirName.FileName
... End.
中然后使用DirName.FileName.Name
访问文件中定义的每个内容。
该文件本身可以包含模块M
,要获取M
的内容,必须输入DirName.FileName.ModuleName.Name1
等。
Import
用于将所有定义提升到最高级别。通过执行Import DirName.FileName.ModuleName
,模块Name1
现在被导入到顶层,并且可以在没有长路径的情况下被引用。
在上面的示例中,文件Arith/PeanoNat.vo
定义了模块Nat
。实际上,这就是它所定义的全部内容。因此,如果您执行Require Import Arith.PeanoNat
,则会在顶级获得PeanoNat.Nat
。然后Import PeanoNat.Nat
会将Nat
带到最高级别。请注意,您无法执行Require Import PeanoNat.Nat
,因为它不是.vo
文件。
Coq有时可以找到.vo
文件而无需指定整个路径,因此您也可以执行Require Import PeanoNat.
并且coq将找到该文件。如果您想知道它在哪里找到它,请Locate PeanoNat.
Coq < Require Import PeanoNat.
Coq < Locate PeanoNat.
Module Coq.Arith.PeanoNat
另一个Nat
也可以从PeanoNat.
Coq < Require Import Nat.
Warning: Notation _ + _ was already used in scope nat_scope
Warning: Notation _ * _ was already used in scope nat_scope
Warning: Notation _ - _ was already used in scope nat_scope
Coq < Locate Nat.
Module Coq.Init.Nat
所以,你没有Import
一个库,你Require
它。您使用Import
不必使用完整路径名。我希望这可以帮助您调试正在发生的事情。
答案 1 :(得分:0)
当我尝试Print Arith.PeanoNat
时,输出略有不同:我得到Module PeanoNat := Struct Module Nat End
,然后即使leb_le
不在范围内,Nat.leb_le
也是。
(如果相关,我会运行8.5beta2
。