123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265typet=Vernacstate.t(* EJGA: This requires patches to Coq, they are in the lsp_debug branch
let any_out oc (a : Summary.Frozen.any) = (* let (Summary.Frozen.Any (tag,
_value)) = a in *) (* let name = Summary.Dyn.repr tag in *) (*
Lsp.Io.log_error "marshall" name; *) Marshal.to_channel oc a []
let _frozen_out oc (s : Summary.Frozen.t) = Summary.Frozen.iter (any_out oc)
s
let summary_out oc (s : Summary.frozen) = let { Summary.summaries; ml_module
} = s in (* frozen_out oc summaries; *) Marshal.to_channel oc summaries [];
Marshal.to_channel oc ml_module []; ()
let summary_in ic : Summary.frozen = let summaries = Marshal.from_channel ic
in let ml_module = Marshal.from_channel ic in { Summary.summaries; ml_module
}
let system_out oc ((l : Lib.frozen), (s : Summary.frozen)) = (* Both parts of
system have functional values !! Likely due to Lib.frozen having a
Summary.frozen inside? *) Marshal.to_channel oc l [ Closures ]; summary_out
oc s; ()
let system_in ic : Vernacstate.System.t = let l : Lib.frozen =
Marshal.from_channel ic in let s : Summary.frozen = summary_in ic in (l, s)
let _marshal_out oc st = let { Vernacstate.parsing; system; lemmas; program;
opaques; shallow } = st in Marshal.to_channel oc parsing []; system_out oc
system; (* lemmas doesn't !! *) Marshal.to_channel oc lemmas [];
Marshal.to_channel oc program []; Marshal.to_channel oc opaques [];
Marshal.to_channel oc shallow []; ()
let _marshal_in ic = let parsing = Marshal.from_channel ic in let system =
system_in ic in let lemmas = Marshal.from_channel ic in let program =
Marshal.from_channel ic in let opaques = Marshal.from_channel ic in let
shallow = Marshal.from_channel ic in { Vernacstate.parsing; system; lemmas;
program; opaques; shallow } *)letmarshal_inic:t=Marshal.from_channelicletmarshal_outocst=Marshal.to_channelocst[]letof_coqx=xletto_coqx=x(* let compare x y = compare x y *)letcompare(x:t)(y:t)=letopenVernacstateinlet{parsing=ps1;system=is1;lemmas=l1;program=g1;opaques=o1;shallow=h1}=xinlet{parsing=ps2;system=is2;lemmas=l2;program=g2;opaques=o2;shallow=h2}=yinifps1==ps2&&is1==is2&&l1==l2&&g1==g2&&o1==o2&&h1==h2then0else1letequalxy=comparexy=0lethashx=(* OCaml's defaults are 10, 100, but not so good for us, much improved
settings are below (best try so far) *)letmeaningful,total=(64,256)inHashtbl.hash_parammeaningfultotalxletmode~st=Option.map(fun_->Vernacinterp.get_default_proof_mode())st.Vernacstate.lemmasletparsing~st=st.Vernacstate.parsingmoduleProof_=ProofmoduleProof=structtypet=Vernacstate.LemmaStack.tletto_coqx=xletequalxy=x==y(* OCaml's defaults are 10, 100, we use this as to give best precision for
petanque-like users *)lethashx=letmeaningful,total=(128,256)inHashtbl.hash_parammeaningfultotalxendletlemmas~st=st.Vernacstate.lemmasmoduleDeclare_=DeclaremoduleDeclare=structopenNamesopenConstr[@@@ocaml.warning"-34"][@@@ocaml.warning"-37"]type'aobligation_body=|DefinedOblof'a|TermOblofconstrtypefixpoint_kind=|IsFixpointoflidentoptionlist|IsCoFixpointmoduleObligation=structtypet={obl_name:Id.t;obl_type:types;obl_location:Evar_kinds.tLoc.located;obl_body:pconstantobligation_bodyoption;obl_status:bool*Evar_kinds.obligation_definition_status;obl_deps:Int.Set.t;obl_tac:unitProofview.tacticoption}endmoduleProgramDecl=structtypeobligations={obls:Obligation.tarray;remaining:int}type'at={prg_cinfo:constrDeclare.CInfo.t;prg_info:Declare.Info.t;prg_opaque:bool;prg_hook:'aoption;prg_body:Constr.constr;prg_uctx:UState.t;prg_obligations:obligations;prg_deps:Id.tlist;prg_fixkind:fixpoint_kindoption;prg_notations:Metasyntax.where_decl_notationlist;prg_reduce:constr->constr}endmoduleProgMap=Id.MapmoduleOblState=structtypet=prg_hookProgramDecl.tCEphemeron.keyProgMap.tandprg_hook=PrgHookoftDeclare.Hook.gmoduleView=structmoduleObl=structtypet={name:Names.Id.t;loc:Loc.toption;status:bool*Evar_kinds.obligation_definition_status;solved:bool}letmake(o:Obligation.t)=let{Obligation.obl_name;obl_location;obl_status;obl_body;_}=oin{name=obl_name;loc=fstobl_location;status=obl_status;solved=Option.has_someobl_body}endtypet={opaque:bool;remaining:int;obligations:Obl.tarray}letmake{ProgramDecl.prg_opaque;prg_obligations;_}={opaque=prg_opaque;remaining=prg_obligations.remaining;obligations=Array.mapObl.makeprg_obligations.obls}letmakeeph=CEphemeron.geteph|>makeendletviews=Names.Id.Map.mapView.make(Obj.magics)endendletprogram~st=NeList.headst.Vernacstate.program|>Declare.OblState.viewletdrop_proof~st=letopenVernacstatein{stwithlemmas=Option.cata(funs->snd@@Vernacstate.LemmaStack.pops)Nonest.lemmas}letdrop_all_proofs~st=letopenVernacstatein{stwithlemmas=None}letin_state~token~st~fa=letfa=Vernacstate.unfreeze_interp_statest;fainProtect.eval~token~faletin_stateM~token~st~fa=letopenProtect.E.Oinlet*()=Protect.eval~token~f:Vernacstate.unfreeze_interp_statestinfaletadmit~st()=let()=Vernacstate.unfreeze_interp_statestinmatchst.Vernacstate.lemmaswith|None->st|Somelemmas->letpm=NeList.headst.Vernacstate.programinletproof,lemmas=Vernacstate.(LemmaStack.poplemmas)inletpm=Declare_.Proof.save_admitted~pm~proofinletprogram=NeList.map_head(fun_->pm)st.Vernacstate.programinletst=Vernacstate.freeze_interp_state~marshallable:falsein{stwithlemmas;program}letadmit~token~st=Protect.eval~token~f:(admit~st)()letadmit_goal~st()=let()=Vernacstate.unfreeze_interp_statestinmatchst.Vernacstate.lemmaswith|None->st|Somelemmas->letfpf=Declare_.Proof.byProofview.give_uppf|>fstinletlemmas=Some(Vernacstate.LemmaStack.map_top~flemmas)in{stwithlemmas}letadmit_goal~token~st=Protect.eval~token~f:(admit_goal~st)()letcount_edgesuniv=letuniv=UGraph.reprunivinUniv.Level.Map.fold(fun_nodeacc->acc+matchnodewith|UGraph.Alias_->1|Nodem->Univ.Level.Map.cardinalm)univ(Univ.Level.Map.cardinaluniv)letinfo_universes~token~st=letopenProtect.E.Oinlet+univ=in_state~token~st~f:Global.universes()inletunivs=UGraph.domainunivinletnuniv=Univ.Level.Set.cardinalunivsinletnconst=count_edgesunivin(nuniv,nconst)