我想用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。
答案 0 :(得分:2)
通常,如果您以通常的方式安装了coq
和coqide
,则应该有一个名为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
的命令,以供以后复制证明。 coqtop
,coqide
或proof-general
之类的用户界面主要用于帮助您完成此录制任务。
有关更多信息,请输入
vscoq
您还应该考虑将coqtop --help
与coqtop
结合使用。