如何在Linux中使用交互式shell来编写Coq代码?

问题描述 投票:0回答:1

我想在Coq中编写和调试代码,就像在Python、R等中编写代码一样。具体来说。

我有一个终端窗口 code.v 文件被显示出来,例如

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

现在在另一个终端上,我想有一个交互式的shell,它可以接受命令,从一个... code.v、检查等。比如说

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

问题一: 什么样的命令提供给我这样的交互式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: 有没有一个交互式的shell命令,比如 check code.v 这将打印出我的证明状态,就像Coqide一样,当你按下 ctrl+down

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

请注意,我更喜欢通过linux终端来完成一切,而不是使用IDE。

linux shell coq
1个回答
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. 然后你可以在终端中输入更多的命令来查看它们对状态的影响。coqtop 程序。 然后,你有责任记录下你发送给以下程序的命令 coqtop 以便日后复制证明。 用户界面如 coqide, proof-generalvscoq 主要是为了帮助你完成这个记录任务。

要了解更多信息,你应该输入

coqtop --help

您还应该考虑使用 coqtop 结合 rlwrap.

© www.soinside.com 2019 - 2024. All rights reserved.