Протокол Coq XML: вероятная неисправность PrintAST

Я использую протокол XML из Coq 8.6.1. Когда я попробовал вызов PrintAst, мне не удалось получить AST, но вместо этого я получил «todo». Это неисправность или я что-то не так сделал? Как мне получить AST из вызова print AST?

Вот мой случай: я использовал coqtop -toploop coqidetop -main-channel stdfds, чтобы открыть процесс ideslave, а затем ввел код Coq из coq-8.6.1/theories/FSets/FSetCompat.v.

Здесь я использую «‹‹‹‹‹‹‹», чтобы заключить некоторые подробные процедуры, если вы хотите повторить мой эксперимент.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Сначала я ввожу

<call val="Add"><pair><pair><string>(***********************************************************************)
(*  v      *   The Coq Proof Assistant  /  The Coq Development Team    *)
(* &lt;O___,, *        INRIA-Rocquencourt  &amp;  LRI-CNRS-Orsay              *)
(*   \VV/  *************************************************************)
(*    //   *      This file is distributed under the terms of the      *)
(*         *       GNU Lesser General Public License Version 2.1       *)
(***********************************************************************)

(** * Compatibility functors between FSetInterface and MSetInterface. *)

Require Import FSetInterface FSetFacts MSetInterface MSetFacts.
</string><int>1</int></pair><pair><state_id val="1"/><bool val="true"/></pair></pair></call>

потом

<call val="Add"><pair><pair><string>Set Implicit Arguments.
</string><int>1</int></pair><pair><state_id val="2"/><bool val="true"/></pair></pair></call>

потом

<call val="Add"><pair><pair><string>Unset Strict Implicit.
</string><int>1</int></pair><pair><state_id val="3"/><bool val="true"/></pair></pair></call>

и наконец

<call val="Add"><pair><pair><string>
(** * From new Weak Sets to old ones *)

Module Backport_WSets
 (E:DecidableType.DecidableType)
 (M:MSetInterface.WSets with Definition E.t := E.t
                        with Definition E.eq := E.eq)
 &lt;: FSetInterface.WSfun E.
</string><int>1</int></pair><pair><state_id val="4"/><bool val="true"/></pair></pair></call>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

В это время я позвонил <call val="PrintAst"><state_id val="5"/></call>, который, как я ожидаю, вернет AST

Module Backport_WSets
 (E:DecidableType.DecidableType)
 (M:MSetInterface.WSets with Definition E.t := E.t
                        with Definition E.eq := E.eq)
 &lt;: FSetInterface.WSfun E.

К моему разочарованию, я получил

<value val="good"><gallina begin="42" end="228"><todo begin="42" end="228">Module&nbsp;Backport_WSets&nbsp;(E:&nbsp;DecidableType.DecidableType)
&nbsp;&nbsp;(M:&nbsp;MSetInterface.WSets&nbsp;with&nbsp;Definition&nbsp;E.t&nbsp;:=&nbsp;E.t&nbsp;with&nbsp;Definition
&nbsp;&nbsp;&nbsp;E.eq&nbsp;:=&nbsp;E.eq)&lt;:&nbsp;FSetInterface.WSfun&nbsp;E.</todo></gallina></value>

Красивой печатью это

<value val="good">
    <gallina begin="42" end="228">
        <todo begin="42" end="228">Module Backport_WSets (E: DecidableType.DecidableType)
  (M: MSetInterface.WSets with Definition E.t := E.t with Definition
   E.eq := E.eq)<: FSetInterface.WSfun E.</todo>
    </gallina>
</value>

Но это всего лишь копия кода! Он даже не применил лексер... Почему это произошло? Может ли кто-нибудь помочь? Большое спасибо!


person Jian Wang    schedule 09.12.2017    source источник


Ответы (1)


Вызов print_ast так и не был завершен, и он был удален в более новых версиях Coq.

Если вам нужно структурированное представление данных Coq, я рекомендую Coq SerAPI, основанный на автоматической сериализации. [Отказ от ответственности: я автор]

Изменить: как это сделать в SerAPI:

echo '
(Add () "From Coq Require Import FSetInterface FSetFacts MSetInterface MSetFacts.

(** * From new Weak Sets to old ones *)

Module Backport_WSets
 (E:DecidableType.DecidableType)
 (M:MSetInterface.WSets with Definition E.t := E.t
                        with Definition E.eq := E.eq)
 <: FSetInterface.WSfun E.")
(Query () (Ast 3))
' | ./sertop.native --printer=human

дает [после удаления информации о местоположении из AST, которая довольно многословна]:

((CoqAst
  (VernacDefineModule ()
    (Id Backport_WSets)
    (((Id E)))
      (CMident
       (Ser_Qualid (DirPath ((Id DecidableType))) (Id DecidableType))
       DefaultInline)
     (()
      (((Id M)))
      ((CMwith
        (CMwith
         (CMident
          (Ser_Qualid (DirPath ((Id MSetInterface))) (Id WSets))))
        (CWith_Definition
         (((Id E) (Id t)))
         (CRef
          (Qualid
           ((Ser_Qualid (DirPath ((Id E))) (Id t))))
          ()))
        (CWith_Definition
         (((Id E) (Id eq)))
         (CRef
          (Qualid
           ((Ser_Qualid (DirPath ((Id E))) (Id eq))))
          ()))
        DefaultInline)))
     (Check
      (CMapply
       (CMident
        (Ser_Qualid (DirPath ((Id FSetInterface))) (Id WSfun))))
      ((v (CMident (Ser_Qualid (DirPath ()) (Id E))))
       DefaultInline)))
    ()))

более того, Coq и SerAPI в настоящее время предоставляют общую систему сопоставления форм AST с местоположением входного буфера.

person ejgallego    schedule 09.12.2017
comment
В более общем плане кажется, что пользователи Coq довольно хорошо умеют противодействовать рекомендациям вышестоящих разработчиков; это включает в себя разработку плагинов для старых версий, настаивание на использовании устаревших функций и т. д. Подсказка: ваша жизнь не будет легкой, а разочарование будет высоким. Мы все знаем, что история совместимости с Coq в последние годы была далеко не приятной, но у разработчиков есть веские причины рекомендовать то, что они считают путем наименьшей боли, и они действительно прилагают большие усилия, пытаясь сделать взаимодействие с Coq более плавным. опыта, но Рим не был построен за один день. - person ejgallego; 10.12.2017
comment
Спасибо! Основная причина, по которой я использую более старую версию, заключается в том, что я смотрю на Compcert, и он еще не поддерживает Coq 8.7. Я предполагаю, что это относится к большинству проектов Coq. Я боюсь, что будут некоторые ошибки, если я буду запускать эти проекты на Coq 8.7. - person Jian Wang; 10.12.2017
comment
Compcert поддерживает версии 8.7 и 8.8. Большинство важных проектов тоже. Ваше здоровье. - person ejgallego; 10.12.2017
comment
Кстати, такие вопросы лучше задавать на канале Coq gitter gitter.im/coq/coq. - person ejgallego; 10.12.2017
comment
Я понимаю. Звучит здорово! Я попробую самую новую версию с SerAPI! - person Jian Wang; 10.12.2017
comment
Прохладно. Давайте поговорим о Gitter, я был бы рад иметь более конкретное представление о том, что вы хотели бы сделать, в Coq upstream мы очень заинтересованы в том, чтобы попытаться обеспечить плавный опыт для пользователей / авторов инструментов. - person ejgallego; 10.12.2017