从另一个文件导入Coq变量

时间:2019-05-18 04:02:30

标签: import coq

我证明了基于公理here的字段的一些基本属性,现在我继续定义矢量空间的公理。特别是,Field.v包含以下几行:

(***********)
(* IMPORTS *)
(***********)
Require Import Setoid Morphisms.

Variable (F:Type).
Variable (zero:F).
Variable (one :F).  
Variable (add: F -> F -> F).
Variable (mul: F -> F -> F).
Variable (eq: F -> F -> Prop).

我将其导入了名为VectorSpace.v的文件中,但Coq抱怨它不知道F

(*******************)
(* GENERAL IMPORTS *)
(*******************)
Require Import Setoid Morphisms.

(*******************)
(* PROJECT IMPORTS *)
(*******************)
Require Import Field.

(****************)
(* Vector Space *)
(****************)
Variable (V:Type).
Variable (zerov:V).
Variable (onev :V).
Variable (addv: V -> V -> V).
Variable (mulv: F -> V -> V).

这是错误消息:

The reference F was not found in the current environment.

2 个答案:

答案 0 :(得分:2)

  1. 在任何地方都用Variable声明替换Axiom

  2. 使用项目的结构在项目的根目录下创建一个_CoqProject文件。例如:

    -Q . MyProject
    Field.v
    VectorSpace.v
    

    现在,您可以使用MyProject.Field来引用Field.v中的VectorSpace.v(我相信您以前是从标准库中导入Field模块的。)

  3. 生成一个makefile并编译该项目:

    coq_makefile -f _CoqProject -o Makefile
    make
    

如果您在Emacs中使用Proof General,则应该可以交互运行VectorSpace.v。我相信CoqIDE支持自动执行步骤(2)和(3),但是我不确定。

答案 1 :(得分:2)

如果您真的想为整个开发项目分配一个字段,请改用Parameter(或Axiom,含义相同)。

相反,Variable是要在Section中使用的,它声明将被转换为参数的绑定,以便可以用不同的字段实例化开发。

Variable在各节之外的含义完全不同,因此为避免混淆,我建议不要以这种方式使用此命令。

  

Variable ...
  (...)   在任何部分之外使用Variable命令等同于使用Local Parameter

     

Local Parameter ...
  导入及其变体永远不会通过其非限定名称来访问此类参数。您必须明确给出其完全限定的名称才能引用它们。

     

--- Coq参考手册