如何导入库:Coq.Arith.PeanoNat在Coq中?

时间:2016-04-14 11:30:05

标签: coq

我需要使用名为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和库,我不知道这里可能会发生什么。我很感激您在解决此库问题方面的意见。

2 个答案:

答案 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