在Linux中如何使用交互式Shell进行Coq代码?

时间:2020-06-10 15:54:16

标签: linux shell coq

我想用Coq编写和调试代码,类似于用Python,R等编写代码的方式。

我有一个终端窗口,其中显示了我的code.v文件,例如:

Definition double (x:nat) : nat := 2 * x.
Definition tripple (x:nat) : nat := 3 * x.

现在在另一个终端中,我想要一个可以接受命令的交互式外壳 从code.v加载代码,进行检查等。例如:

Load code.v // What's the command for this?
Print double. // Expect to see output "double : nat -> nat"

问题1:什么样的命令为我提供了这样的交互式shell,我应该在交互式shell中执行什么命令来加载文件?

此外,如果在我的code.v文件中,我有未完成的证明,例如

Lemma ex4: forall (X : Set) (P : X -> Prop),
  ~(forall x, ~ (P x)) -> (exists x, (P x)).
Proof.
  intros X P A.
  apply not_all_ex_not in A.
  destruct A.

问题2:是否有来自check code.v之类的交互式shell的命令,该命令会向我打印出我的证明状态,就像Coqide在您按ctrl+down时所做的一样

1 subgoal
X : Set
P : X -> Prop
x : X
H : ~ ~ P x
______________________________________(1/1)
exists x0 : X, P x0

请注意,我更喜欢通过linux终端执行所有操作,而不是使用IDE。

1 个答案:

答案 0 :(得分:2)

通常,如果您以通常的方式安装了coqcoqide,则应该有一个名为coqtop的命令(这是coq toplevel的简写)。它会从stdin中读取所有命令,并在coqide中打印所有结果(通常会在目标stdout或响应窗口中显示)。

以您的code.v为例,您可以运行以下命令。

coqtop -require-import Classical < code.v

这将显示文件中所有命令生成的所有输出并终止。最后的输出将是最后一条命令的结果,从而可以看到最后一个未完成的目标。请注意,-require-import Classical是必需的,因为在该模块中定义了引理not_all_ex_not

实际上,这不是很方便,因为每次添加新命令时都必须重新运行整个文件。您还可以通过键入以下命令行来使系统保持运行状态,以执行已记录的文件code.v

coqtop -require-import Classical -load-vernac-source code.v

这不会在最后一条命令之后显示目标,但是您可以通过键入命令Show.来要求目标。然后,您可以在终端中键入更多命令以查看其对{{1}状态的影响} 程式。然后,您有责任记录下发送给coqtop的命令,以供以后复制证明。 coqtopcoqideproof-general之类的用户界面主要用于帮助您完成此录制任务。

有关更多信息,请输入

vscoq

您还应该考虑将coqtop --help coqtop结合使用。

相关问题