如何划分Coq代码以提供Coq ideslave(XML协议)?

时间:2017-12-19 04:34:20

标签: coq coqide

我认为Coq ideslave(也称为Coq XML协议)的“Add”调用一次只占用一块代码,用句点(.)分区。在大多数情况下,我仍然相信这是真的。例如,

Inductive or (A B:Prop) : Prop :=
  | or_introl : A -> A \/ B
  | or_intror : B -> A \/ B

where "A \/ B" := (or A B) : type_scope.

尽管这个代码块有几行,但它应该通过一个“Add”调用来输入,因为只有最后一行有一个句点。

但是,当存在子弹(+-*{})时,情况并非如此。例如,

- intros [H _]; exact H.

应该通过两个“添加”来电,-intros [H _]; exact H.来提供,在另一种情况下,

{ destruct Hl; [ right | destruct Fl | ]; assumption. }

应分为三个部分:{destruct Hl; [ right | destruct Fl | ]; assumption.}。我在CoqIDE中观察到了这些行为,我认为这些行为在内部使用了Coq ideslave。

我的第一个问题:这些是将.v文件分区为块以使用“添加”调用的完整规则吗?如果不是,那么完整的规则是什么?

第二个问题:如果我只使用“按周期分区”规则,假如我尝试将{ destruct Hl; [ right | destruct Fl | ]; assumption. }作为一个“添加”调用而不是三个,则XML不会立即引发错误。但是,在几个证明步骤之后,它可能引发一个从未出现在Coq IDE中的错误(This proof is focused, but cannot be unfocused this way),并且我无法通过

撤消错误
<call val="Edit_at">
    <state_id val="..."/>
</call>

如果我尝试撤消错误,Coq XML会提供相同的错误消息。这个错误是否与将子弹作为一个大块相关?如果是的话,为什么一旦我提供了块,Coq XML就不会抱怨这个?

另一个问题:我想在不久的将来尝试SerAPI。 SerAPI是否共享相同的代码块提供规则?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

事实上,Jim分裂Coq命令是一项非常重要的任务,我要说的是事实上的方法是CoqIDE使用的方法,请参阅CoqIDE's lexerthis mail,{ {3}}和Emacs' regexp

对于协议的Add调用,您应该发送一个句子!其余的被忽略,事实上,句子确实包括括号。这就是你的问题所在。

SerAPI确实包含额外的支持,以帮助分割工具。最重要的区别是:

  • 当您提交一个句子时,SerAPI将回复实际的句子结尾位置。因此,您可以通过让SerAPI进行拆分来准确地解析Coq文档。
  • SerAPI可以一次解析完整的Coq文档(并将回复分割位置)。

有关全文档支持的更多技术细节,但应在项目页面更好地解决这些问题。