123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113(************************************************************************)(* * 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->boolvalupdate:'aonetag->('avalueoption->'avalueoption)->t->tvalmodify:'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)mletupdate(typea)(tag:aonetag)(f:aV.toption->aV.toption)m=M.update(keytag)(funoptv->letoptv:aV.toption=matchoptvwith|None->None|Some(V(tag',v))->letmoduleT=(valtag)inmatchtag_of_onetagtag'with|T.T->Somev|_->assertfalseinmatchfoptvwith|None->None|Somev->Some(V(tag,v)))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