123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127(************************************************************************)(* * 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 SERAPI *)(* Copyright 2016-2019 MINES ParisTech -- LGPL 2.1+ *)(* Copyright 2019-2022 Inria -- LGPL 2.1+ *)(* Written by: Emilio J. Gallego Arias *)(************************************************************************)type'ahyp={names:stringlist;def:'aoption;ty:'a}letmap_hyp~f{names;def;ty}=letdef=Option.mapfdefinletty=ftyin{names;def;ty}typeinfo={evar:Evar.t;name:Names.Id.toption}type'areified_goal={info:info;hyps:'ahyplist;ty:'a}letmap_reified_goal~f{info;ty;hyps}=letty=ftyinlethyps=List.map(map_hyp~f)hypsin{info;ty;hyps}type('a,'pp)goals={goals:'alist;stack:('alist*'alist)list;bullet:'ppoption;shelf:'alist;given_up:'alist}letmap_goals~f{goals;stack;bullet;shelf;given_up}=letgoals=List.mapfgoalsinletstack=List.map(fun(s,r)->(List.mapfs,List.mapfr))stackinletshelf=List.mapfshelfinletgiven_up=List.mapfgiven_upin{goals;stack;bullet;shelf;given_up}type'ppreified_pp=('ppreified_goal,'pp)goals(** XXX: Do we need to perform evar normalization? *)moduleCDC=Context.Compacted.Declarationtypecdcl=EConstr.compacted_declarationletbinder_namen=Context.binder_namen|>Names.Id.to_stringletto_tupleppx:cdcl->'pchyp=letopenCDCinfunction|LocalAssum(idl,tm)->letnames=List.mapbinder_nameidlin{names;def=None;ty=ppxtm}|LocalDef(idl,tdef,tm)->letnames=List.mapbinder_nameidlin{names;def=Some(ppxtdef);ty=ppxtm}(** gets a hypothesis *)letget_hyp(ppx:EConstr.t->'pc)(_sigma:Evd.evar_map)(hdecl:cdcl):'pchyp=to_tupleppxhdecl(** gets the constr associated to the type of the current goal *)letget_goal_type(ppx:EConstr.t->'pc)(env:Environ.env)(sigma:Evd.evar_map)(g:Evar.t):_=let(EvarInfoevi)=Evd.findsigmaginletconcl=matchEvd.evar_bodyeviwith|Evd.Evar_empty->Evd.evar_conclevi|Evd.Evar_definedbody->Retyping.get_type_ofenvsigmabodyinppxconclletbuild_infosigmag={evar=g;name=Evd.evar_identgsigma}(** Generic processor *)letprocess_goal_genppxsigmag:'areified_goal=(* XXX This looks cumbersome *)letenv=Global.env()inlet(EvarInfoevi)=Evd.findsigmaginletenv=Evd.evar_filtered_envenveviin(* why is compaction neccesary... ? [eg for better display] *)letctx=Termops.compact_named_contextsigma(EConstr.named_contextenv)inletppx=ppxenvsigmainlethyps=List.map(get_hypppxsigma)ctx|>List.revinletinfo=build_infosigmagin{info;ty=get_goal_typeppxenvsigmag;hyps}letif_not_empty(pp:Pp.t)=ifPp.(reprpp=Ppcmd_empty)thenNoneelseSomeppletreify~ppxlemmas=letlemmas=State.Proof.to_coqlemmasinletproof=Vernacstate.LemmaStack.with_toplemmas~f:(funpstate->Declare.Proof.getpstate)inlet{Proof.goals;stack;sigma;_}=Proof.dataproofinletppx=List.map(process_goal_genppxsigma)in{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}