2016-04-14 28 views
5

我需要使用名爲Coq.Arith.PeanoNat(https://coq.inria.fr/library/Coq.Arith.PeanoNat.html)的標準庫的一部分。如何導入Coq庫中的Coq.Arith.PeanoNat?

我試過要麼導入整個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 

當我問勒柯克Print Arith.PeanoNat它輸出:Module Arith := Struct End,它似乎是空的。當我嘗試使用庫中的任何東西時,例如在布爾比較下的le_le,我得到標準Error: leb_le not a defined object.我已經更新了Coq和庫,並且我不知道這裏會發生什麼。我會很感激你在解決這個庫問題上的投入。

+0

您是否在可能導致衝突的同一時間導入任何其他模塊? – ichistmeinname

+0

@ichistmeinname,我只導入Bool和Arith。出於測試目的,我導入了其他文件,並在我看到它們工作得很好時從文件中刪除它們。 – Sara

回答

0

當我嘗試Print Arith.PeanoNat時,輸出略有不同:我得到Module PeanoNat := Struct Module Nat End然後即使leb_le不在範圍內,Nat.leb_le是。

(如果相關,我運行8.5beta2)。

+0

我認爲它確實有所作爲。我試着檢查是否Nat.leb_le,並且我得到相同的「不是定義的對象」。 – Sara

+0

嗨@gallais。不知何故,Nat.leb_le現在已經在範圍之內(我今天只關閉coq,當我今天再次嘗試運行同一個文件時,效果更好......),但我仍然遇到問題。我有那個Nat.leb_le是範圍。我現在如何使用證明? 「應用leb_le」產生「在當前環境中未找到te參考leb_le」 – Sara

+0

@Sara好消息!如果'leb_le'不在範圍內,而是'Nat.leb_le',那麼您必須首先使用長名稱'Nat.leb_le'或'Import Nat'來將其內容(包括'leb_le')納入範圍內參見[關於模塊的手冊](https://coq.inria.fr/distrib/current/refman/Reference-Manual004.html#hevea_command54))。 – gallais

10

如果我沒有弄錯,Require是加載文件的關鍵字。 Import與管理名稱空間有關。通常他們一起使用,如Require Import PeanoNat.,但他們真的在做兩件不同的事情。

當COQ文件(DirName/FileName.vo)裝載有Require,這是因爲如果的FileName.vo內容被包裹在Module DirName.FileName ...該文件中定義End. Everyting然後用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不必使用完整的路徑名稱。我希望這可以幫助您調試正在發生的事情。

+0

謝謝你的詳細解釋,我想我不會再有問題了。 – Sara

+0

@Sara如果這個答案解決了你的問題,一件好事就是接受答案。 –