如何在Coq中导入库:Coq.Arith.PeanoNat?
我需要使用标准库中名为Coq.Arith.PeanoNat()的部分 我已经尝试过导入整个Arith库或者只导入这个模块,但我无法以任何方式使用它 我试过的其他图书馆都很好用。当我如何在Coq中导入库:Coq.Arith.PeanoNat?,coq,Coq,我需要使用标准库中名为Coq.Arith.PeanoNat()的部分 我已经尝试过导入整个Arith库或者只导入这个模块,但我无法以任何方式使用它 我试过的其他图书馆都很好用。当我需要导入Bool.时,我会编译并正确使用它。当打印Bool.时,我可以用下一种格式查看其中的所有函数: Module Bool := Struct Definition... . . . End 当我执行Require Import Arith.PeanoNat.或Require Import Arith.时,我会将
需要导入Bool.
时,我会编译并正确使用它。当打印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
[加载ML文件z_syntax_plugin.cmxs…完成]
[正在加载ML文件quote_plugin.cmxs…完成]
[正在加载ML文件newring_plugin.cmxs…完成]
语法扩展:在[策略:简单策略]中,一些规则被掩盖了
语法扩展:在[策略:简单策略]中,一些规则被掩盖了
语法扩展:在[策略:简单策略]中,一些规则被掩盖了
语法扩展:在[策略:简单策略]中,一些规则被掩盖了
语法扩展:在[策略:简单策略]中,一些规则被掩盖了
当我询问Coq
Print Arith.PeanoNat
时,它输出:Module Arith:=Struct End
,它似乎是空的。当我尝试使用库中的任何内容时,例如布尔比较下的le\le
,我会得到标准的错误:leb\ue不是一个定义的对象。
我已经更新了Coq和库,我不知道这里会发生什么。我非常感谢您在解决此库问题时提供的帮助。当我尝试打印Arith.PeanoNat时,输出略有不同:我得到Module PeanoNat:=Struct Module Nat End
,然后即使leb
不在范围内,Nat.leb
也在范围内
(如果相关的话,我会运行
8.5beta2
。如果我没有弄错,Require
是加载文件的关键字<代码>导入与管理名称空间有关。它们通常一起使用,如在Require Import PeanoNat.
中,但它们实际上在做两件不同的事情
当coq文件(DirName/FileName.vo
)加载了Require
,就好像FileName.vo
的内容被包装在模块DirName.FileName
中一样<代码>结束。然后使用DirName.FileName.Name
访问文件中定义的所有内容
文件本身可以包含模块M
,要访问M
的内容,必须键入DirName.FileName.ModuleName.Name1
等
Import
用于将所有定义升级到顶层。通过执行导入DirName.FileName.ModuleName操作,模块Name1
现在导入到顶层,并且可以在没有长路径的情况下引用
在上面的示例中,文件Arith/PeanoNat.vo
定义了模块Nat
。事实上,这就是它定义的全部。因此,如果您确实需要导入Arith.PeanoNat
,您将在顶层获得PeanoNat.Nat
。然后Import PeanoNat.Nat
将Nat
带到顶层。请注意,您不能要求导入PeanoNat.Nat,因为它不是.vo
文件
Coq有时可以找到.vo
文件,而无需指定整个路径,因此您也可以执行要求导入PeanoNat。
Coq将找到该文件。如果你想知道它在哪里找到的,一定要找到PeanoNat。
Coq < Require Import PeanoNat.
Coq < Locate PeanoNat.
Module Coq.Arith.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
不必使用完整路径名。我希望这有助于您调试正在发生的事情。您是否同时导入任何可能导致冲突的其他模块?@ichistmeinname,我只导入布尔和Arith。出于测试的目的,我导入了其他的,当我看到它们工作得很好时,我从我的文件中删除了它们。我认为这确实起到了作用。我试着检查Nat.leb_le是否也一样,我得到了相同的“nota defined object”。Hi@gallais。不知何故,Nat.leb_le现在已经在范围内了(我只关闭了coq一天,当我今天再次尝试运行同一个文件时,它工作得更好了…),但我仍然有问题。我知道Nat.leb_le是范围。我现在如何使用,在一个证明?“应用leb_le”产生“在当前环境中找不到参考leb_le”@Sara好消息!如果leb_le
不在范围内,但Nat.leb_le
在范围内,则您必须使用长名称Nat.leb_le
或首先导入Nat
,以便将其内容(包括leb_le
)纳入范围(cf.)。谢谢,这已经解决了!我意识到我也在以错误的顺序导入东西(我不知道这会有什么不同!)。现在一切似乎都在运行。谢谢你的详细解释,我想我不会再有问题了。@Sara如果这个答案解决了你的问题,最好接受这个答案。这个答案最接近我的问题,所以我在这里发布了一个问题:我首先键入Require Import Coq.Numbers.Natural.Abstract.NDiv.
然后命令打印NDiv.
返回模块NDiv:=Struct模块type NDivProp End
,命令打印NDivProp
打印一个引理列表,我想使用其中一个。但是导入NDivProp。
抛出一个错误NDivProp不是一个模块
,Print add\u mod
(我想使用的引理)抛出一个错误错误:add\u mod不是一个定义的对象。
,命令NDiv.add\u mod
,NDivProp.add\u mod
,也有打印错误。那么如何访问add_mod
引理呢?我认为最好的方法是发布一个新问题。