123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566type'aelement=intmoduletypeSet=sigtypettypenonrecelement=telementvaln:intendmoduleSet(X:sigvaln:intend):Set=structletn=X.ntypettypenonrecelement=telementendtype'tset=(moduleSetwithtypet='t)letcardinal(typea)((moduleO):aset)=O.nmoduleElement=structtype'at=intletof_int(typea)((moduleO):aset)n=ifn>=0&&n<O.nthennelsePrintf.ksprintfinvalid_arg"Finite.Set(%d).of_int %d: %d is not in [0; %d["O.nnnO.nletto_intx=xletiter(typea)((moduleO):aset)f=fori=0toO.n-1dofidoneletrev_iter(typea)((moduleO):aset)f=fori=O.n-1downto0dofidoneletall_elements(typea)((moduleO):aset)=Array.initO.n(funx->x)endmoduletypeMap=sigmoduleDomain:Settypecodomainvalelement:Domain.telement->codomainendtype'amap=(moduleMapwithtypecodomain='a)letiter_map(typea)((moduleMap):amap)(f:a->unit)=Element.iter(moduleMap.Domain)(funo->f(Map.elemento))letmap_of_array(typea)(a:aarray):amap=letmoduleResult=structmoduleDomain=Set(structletn=Array.lengthaend)typecodomain=aletelementi=a.((i:Domain.telement:>int))endin(moduleResult)moduleMap_of_array(A:sigtypecodomainvaltable:codomainarrayend)=structmoduleDomain=Set(structletn=Array.lengthA.tableend)typecodomain=A.codomainletelementi=A.table.((i:Domain.telement:>int))end