123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* 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) *)(************************************************************************)(************************************************************************)(* SerAPI: Coq interaction protocol with bidirectional serialization *)(************************************************************************)(* Copyright 2016-2019 MINES ParisTech -- License LGPL 2.1+ *)(* Copyright 2019-2023 Inria -- License LGPL 2.1+ *)(* Written by: Emilio J. Gallego Arias and others *)(************************************************************************)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;bullet:Pp.toption;shelf:'alist;given_up:'alist}(** XXX: Do we need to perform evar normalization? *)moduleCDC=Context.Compacted.Declarationtypecdcl=EConstr.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:EConstr.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)(env:Environ.env)(sigma:Evd.evar_map)(g:Evar.t):_=letEvarInfoevi=Evd.findsigmaginletconcl=matchEvd.evar_bodyeviwith|Evd.Evar_empty->Evd.evar_conclevi|Evd.Evar_definedbody->Retyping.get_type_ofenvsigmabodyinppx@@EConstr.to_constr~abort_on_undefined_evars:falsesigmaconclletbuild_infosigmag={evar=g;name=Evd.evar_identgsigma}(** Generic processor *)letprocess_goal_genppxsigmag:'areified_goal=(* XXX This looks cumbersome *)letenv=Global.env()inletEvarInfoevi=Evd.findsigmaginletenv=Evd.evar_filtered_envenveviin(* why is compaction neccesary... ? [eg for better display] *)letctx=Termops.compact_named_contextsigma(EConstr.named_contextenv)inletppx=ppxenvsigmainleteppxc=ppx(EConstr.Unsafe.to_constrc)inlethyp=List.map(get_hypeppxsigma)ctxinletinfo=build_infosigmagin{info;ty=get_goal_typeppxenvsigmag;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.interp={lemmas=Somelemmas;_};_})->letproof=Vernacstate.LemmaStack.with_toplemmas~f:(funpstate->Declare.Proof.getpstate)inlet{Proof.goals;stack;sigma;_}=Proof.dataproofinletppx=List.map(process_goal_genppxsigma)inSome{goals=ppxgoals;stack=List.map(fun(g1,g2)->ppxg1,ppxg2)stack;bullet=if_not_empty@@Proof_bullet.suggestproof;shelf=Evd.shelfsigma|>ppx;given_up=Evd.given_upsigma|>Evar.Set.elements|>ppx}|Expired|Error_|Valid_->Noneletget_goals=get_goals_gen(fun__x->x)letget_egoals=get_goals_gen(funenvevdec->Constrextern.extern_constr~inctx:trueenvevdEConstr.(of_constrec))