2016-12-02 42 views
3

在较早版本的Coq(< 8.5)中,主要进程将使用字符串与IDE交换数据。访问Coq丰富的类似于XML的AST输出

这应该是最近发生了变化 - 如何查询代表AST的更丰富的类似于XML的结构?

使用案例:我想以不同的方式解释任何Coq计算 - 也就是说,我需要在执行操作(例如调用策略)后以不需要解析的字符串的形式得到它的结果。

+0

你可以更具体地说明你的用例是什么吗?你可以使用XML协议(但不会给你AST串行数据)或coq-serapi。顺便说一下,我认为老版本的Coq对这个xml插件的支持非常有限,但我现在还不确定... – ejgallego

+0

请注意,您的问题非常具体:_querying代表ASTs的更丰富的类似于XML的结构_如果您想要什么要构建一个Coq IDE,那么答案会有点不同。 – ejgallego

回答

2

使用XML协议,您可以使用Annotate stm call,其中stm是您要打印的句子。但是请注意,XML打印机在8.5/8.6版本中功能远远不足,可能会被删除。 你可以看到所有的遗失案例here。另外请注意,它不输出任何级别的术语的结构化表示。

或者,您可以使用SerAPI,专门用于该特定用途的插件。使用SerAPI,您可以获得任何Coq结构的完整表示:

$ rlwrap ./sertop.native --printer=human --prelude=/home/egallego/external/coq-v8.6/ 
(Control (StmAdd() "Lemma u n : n + 0 = n.")) 
> (Answer 0 (StmAdded 2 (...) NewTip)) 
(Query() (Ast 2)) 
> (Answer 1(ObjList 
> ((CoqAst 
> (VernacStartTheoremProof Lemma 
>  ((((((Id u))())) 
>  (((LocalRawAssum 
>   (((Name (Id n)))) 
>   (Default Explicit) 
>   (CHole() IntroAnonymous()))) 
>  (CNotation 
>   "_ = _" 
>   (((CNotation 
>   "_ + _" 
>   (((CRef 
>    (Ident 
>     (Id n))) 
>    ()) 
>    (CPrim 
>    (Numeral (Ser_Bigint 0)))) 
>   ()())) 
>   (CRef 
>   (Ident 
>    (Id n))) 
>   ())) 
>   ()())) 
>  ()))) 
>  false))))) 

请注意,SerAPI是实验软件。

+0

这是什么'Annotate'事物的一部分? – ScarletAmaranth

+1

这是一个XML协议调用,有关更多详细信息,请参阅https://github.com/siegebell/vscoq/wiki/XML-protocol。不过要注意的是,它远没有完成,它可能会被删除。 – ejgallego

+0

哦,哇,我一直是一个googlin'现在很多天,但我没有偶然发现你提到的链接。谢谢。 – ScarletAmaranth