12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697(************************************************************************)(* * The Rocq Prover / The Rocq 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) *)(************************************************************************)moduletypeValueS=sigtype'atendmoduletypeTag=sigtype_tag=..endmoduleMake(Tag:Tag)=structopenTagmoduletypeOneTag=sigtypeatype_tag+=T:atagendtype'aonetag=(moduleOneTagwithtypea='a)letrefl=SomeCSig.Reflleteq_onetag(typeab)(tag:aonetag)(tag':btag):(a,b)CSig.eqoption=letmoduleT=(valtag)inmatchtag'with|T.T->refl|_->Noneletmake(typea)():aonetag=(modulestructtypenonreca=atype_tag+=T:atagend)lettag_of_onetag(typea)(tag:aonetag):atag=letmoduleT=(valtag)inT.TmoduletypeMapS=sigtypettype_valuevalempty:tvalfind:'atag->t->'avaluevaladd:'aonetag->'avalue->t->tvalmem:'atag->t->boolvalmodify:'atag->('avalue->'avalue)->t->ttype'accfold={fold:'a.'aonetag->'avalue->'acc->'acc}valfold:'accfold->t->'acc->'accendmoduleMap(V:ValueS)=structtypev=V:'aonetag*'aV.t->vletkeyt=Obj.Extension_constructor.(id(of_valt))letonekeyt=key(tag_of_onetagt)moduleM=Int.Maptypet=vM.tletempty=M.emptyletfind(typea)(tag:atag)m:aV.t=letV(tag',v)=M.find(keytag)minletmoduleT=(valtag')inmatchtagwith|T.T->v|_->assertfalseletaddtagvm=M.add(onekeytag)(V(tag,v))mletmemtagm=M.mem(keytag)mletmodify(typea)(tag:atag)(f:aV.t->aV.t)m=M.modify(keytag)(fun_(V(tag',v))->letmoduleT=(valtag')inmatchtagwith|T.T->V(tag',fv)|_->assertfalse)mtype'accfold={fold:'a.'aonetag->'aV.t->'acc->'acc}letfoldfmacc=M.fold(fun_(V(tag,v))acc->f.foldtagvacc)maccendend