1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889(************************************************************************)(* * 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) *)(************************************************************************)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->tendmoduleMap(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)mendend