如何避免放置模块前缀的必要性

时间:2019-07-01 14:19:57

标签: coq

在此之前,我是在Software Foundations中编辑IndProp.v文件的。但是,一旦将代码放入一个单独的文件中,我发现eqb_neq命令需要一个模块前缀才能起作用:Nat.eqb_neq

代码如下:

Set Warnings "-notation-overridden,-parsing".
Require Import List.
Import ListNotations.
Require Import PeanoNat.
Local Open Scope nat_scope.

Inductive nostutter {X:Type} : list X -> Prop :=
| ns_nil : nostutter []
| ns_one : forall (x : X), nostutter [x]
| ns_cons: forall (x : X) (h : X) (t : list X), nostutter (h::t) -> x <> h -> nostutter (x::h::t).

Example test_nostutter_1: nostutter [3;1;4;1;5;6].
Proof.
  repeat constructor; apply Nat.eqb_neq; auto.
Qed.

是否可以告诉coq我一直在这里使用Nat模块并摆脱Nat前缀?像在C ++中一样,您可以编写using namespace std;,并且无需在每个对象之前显式指定名称空间。

1 个答案:

答案 0 :(得分:3)

您可以使用Import Nat.来做到这一点。但这有时会损害可读性。某些模块设计为其前缀使用,例如stdlib的Vector