123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)(* <O___,, * (see CREDITS file for the list of authors) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)(************************************************************************)(* Coq serialization API/Plugin *)(* Copyright 2016-2018 MINES ParisTech -- Dual License LGPL 2.1 / GPL3+ *)(* Written by: Emilio J. Gallego Arias *)(************************************************************************)(* Status: Very Experimental *)(************************************************************************)type'ahyp=(Names.Id.tlist*'aoption*'a)typeinfo={evar:Evar.t;name:Names.Id.toption}type'areified_goal={info:info;ty:'a;hyp:'ahyplist}type'aser_goals={goals:'alist;stack:('alist*'alist)list;shelf:'alist;given_up:'alist;bullet:Pp.toption}(** XXX: Do we need to perform evar normalization? *)moduleCDC=Context.Compacted.Declarationtypecdcl=Constr.compacted_declarationletto_tupleppx:cdcl->(Names.Id.tlist*'pcoption*'pc)=letopenCDCinfunction|LocalAssum(idl,tm)->(List.mapContext.binder_nameidl,None,ppxtm)|LocalDef(idl,tdef,tm)->(List.mapContext.binder_nameidl,Some(ppxtdef),ppxtm)(** gets a hypothesis *)letget_hyp(ppx:Constr.t->'pc)(_sigma:Evd.evar_map)(hdecl:cdcl):(Names.Id.tlist*'pcoption*'pc)=to_tupleppxhdecl(** gets the constr associated to the type of the current goal *)letget_goal_type(ppx:Constr.t->'pc)(sigma:Evd.evar_map)(g:Goal.goal)=ppx@@EConstr.to_constrsigma(Goal.V82.conclsigmag)letbuild_infosigmag={evar=g;name=Evd.evar_identgsigma}(** Generic processor *)letprocess_goal_genppxsigmag:'areified_goal=letenv=Goal.V82.envsigmagin(* why is compaction neccesary... ? [eg for better display] *)letctx=Termops.compact_named_context(Environ.named_contextenv)inletppx=ppxenvsigmainlethyp=List.map(get_hypppxsigma)ctxinletinfo=build_infosigmagin{info;ty=get_goal_typeppxsigmag;hyp}letif_not_empty(pp:Pp.t)=ifPp.(reprpp=Ppcmd_empty)thenNoneelseSomeppletget_goals_gen(ppx:Environ.env->Evd.evar_map->Constr.t->'a)~docsid:'areified_goalser_goalsoption=matchStm.state_of_id~docsidwith|`Valid(Some{Vernacstate.proof=Somepstate;_})->letproof=Proof_global.give_me_the_proofpstateinletProof.{goals;stack;shelf;given_up;sigma;_}=Proof.dataproofinletppx=List.map(process_goal_genppxsigma)inSome{goals=ppxgoals;stack=List.map(fun(g1,g2)->ppxg1,ppxg2)stack;shelf=ppxshelf;given_up=ppxgiven_up;bullet=if_not_empty@@Proof_bullet.suggestproof}|`Expired|`Error_|`Valid_->Noneletget_goals=get_goals_gen(fun__x->x)letget_egoals=get_goals_gen(funenvevdec->Constrextern.extern_constrtrueenvevdEConstr.(of_constrec))