2016-04-14 11 views
5

Coq.Arith.PeanoNat(https://coq.inria.fr/library/Coq.Arith.PeanoNat.html)という標準ライブラリの部分を使用する必要があります。ライブラリをインポートする方法:Coq.Arith.PeanoNat in Coq?

私は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、それは空のようです。ライブラリから何かを使用しようとすると、たとえばboolean比較の下でle_leという標準が得られます。Error: leb_le not a defined object.私はCoqとライブラリを更新しましたが、ここで何が起こっているのか分かりません。このライブラリの問題を修正していただきありがとうございます。

+0

競合の原因となる他のモジュールを同時にインポートしていますか? – ichistmeinname

+0

@ichistmeinname、私はBoolとArithだけをインポートしています。テスト目的のために、私は他のものをインポートし、彼らがうまく動作するのを見たときにファイルから削除しました。 – Sara

答えて

0

私がPrint Arith.PeanoNatを試してみると、出力はわずかに異なります:を取得し、leb_leが有効範囲にない場合でもNat.leb_leです。

(該当する場合は8.5beta2

+0

違いがあると思います。私はNat.leb_leもチェックしてみましたが、同じ "定義されたオブジェクトではありません"ということになります。 – Sara

+0

こんにちは@gallais。どうにかして、Nat.leb_leは現在範囲に入っています(今日は同じファイルを再度実行しようとしたときにcoqを閉じただけですが、それはもっとうまくいきました...)。しかし、まだ問題があります。私はNat.leb_leがスコープであることを持っています。私はどのように今、証拠に使うことができますか? "apply leb_le"は "Te reference leb_leが現在の環境で見つかりませんでした" – Sara

+0

@Sara素晴らしいニュース! 'leb_le'が有効ではなく' Nat.leb_le'であれば、コンテンツ(leb_leを含む)をスコープに持たせるために、長い名前 'Nat.leb_le'または' Import Nat'を最初に使用する必要がありますcf [モジュールに関するマニュアルの一部](https://coq.inria.fr/distrib/current/refman/Reference-Manual004.html#hevea_command54))。 – gallais

10

私が間違っていない場合、Requireはファイルをロードするキーワードです。 Importは名前空間の管理と関係があります。彼らはしばしばRequire Import PeanoNat.のように一緒に使用されますが、実際には2つの異なることをしています。

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をトップレベルに持ち込みます。 .voファイルではないため、Require Import PeanoNat.Natは実行できません。

Coqはパス全体を指定することなく.voファイルを見つけることがあるため、Require Import PeanoNat.も指定でき、coqがファイルを検索します。それはそれを見つけた場所を疑問に思う場合は、Locate PeanoNat.

Coq < Require Import PeanoNat. 

Coq < Locate PeanoNat. 
Module Coq.Arith.PeanoNat 

を行う別のNatあなたRequireは、だから、あなたがいないImportライブラリを行う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を使用します。これが起こっていることをデバッグするのに役立ちます

+0

詳細な説明をいただきありがとうございます。私はもう問題はありません。 – Sara

+0

@Saraこの回答があなたの問題を解決する場合、良い答えは答えを受け入れることです。 –

関連する問題