12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697(* This file is free software, part of Logtk. See file "license" for more details. *)(** {1 Variable} *)type+'at={id:ID.t;ty:'a;}type'avar='atletmake~tyid={ty;id;}letof_string~tyname={ty;id=ID.makename;}letmakef~tymsg=CCFormat.ksprintfmsg~f:(of_string~ty)letgensym~ty()={ty;id=ID.gensym();}letcopyv=make~ty:v.ty(ID.copyv.id)letupdate_tyv~f={vwithty=fv.ty;}lettyt=t.tyletidt=t.idletnamet=t.id.ID.nameletcompareab=ID.comparea.idb.idletequalab=ID.equala.idb.idlethasha=ID.hasha.idletppouta=ID.ppouta.idletto_stringa=ID.to_stringa.idletpp_fullouta=ID.pp_fullouta.idletpp_fullcouta=ID.pp_fullcouta.idmoduleSet=structtype'at='avarID.Map.tletis_empty=ID.Map.is_emptyletempty=ID.Map.emptyletaddtv=ID.Map.addv.idvtletmemtv=ID.Map.memv.idtletfind_exntid=ID.Map.findidtletfindtid=trySome(find_exntid)withNot_found->Noneletdiffab=ID.Map.merge_safeab~f:(fun_pair->matchpairwith|`Leftx->Somex|`Right_->None|`Both_->None)letcardinalt=ID.Map.cardinaltletintersection_emptyst=trylet_=ID.Map.merge_safest~f:(fun_o->matchowith|`Left_|`Right_->None|`Both_->raiseExit)intruewithExit->falseletof_iters=s|>Iter.map(funv->v.id,v)|>ID.Map.of_iterletadd_seqms=s|>Iter.map(funv->v.id,v)|>ID.Map.add_itermletadd_listms=s|>List.map(funv->v.id,v)|>ID.Map.add_listmletof_listl=l|>List.map(funv->v.id,v)|>ID.Map.of_listletto_itert=ID.Map.to_itert|>Iter.mapsndletto_listt=ID.Map.fold(fun_vacc->v::acc)t[]letppoutt=Util.pp_iter~sep:", "ppout(to_itert)endmoduleSubst=structtype('a,'b)t=('avar*'b)ID.Map.tletempty=ID.Map.emptyletis_empty=ID.Map.is_emptyletsize=ID.Map.cardinalletaddtvx=ID.Map.addv.id(v,x)tletsingletonvx=addemptyvxletmemtv=ID.Map.memv.idtletremovetv=ID.Map.removev.idtletfind_exntv=snd(ID.Map.findv.idt)letfindtv=trySome(find_exntv)withNot_found->Noneletof_listl=l|>List.map(fun(v,x)->v.id,(v,x))|>ID.Map.of_listletof_iters=s|>Iter.map(fun(v,x)->v.id,(v,x))|>ID.Map.of_iterletto_itert=ID.Map.to_itert|>Iter.mapsndletto_listt=ID.Map.fold(fun_tupacc->tup::acc)t[]letpppp_voutt=letpp_pairout(v,x)=Format.fprintfout"@[%a → %a@]"pp_fullvpp_vxinFormat.fprintfout"@[%a@]"(Util.pp_iter~sep:", "pp_pair)(to_itert)letmergeab=ID.Map.merge_safeab~f:(fun_v->matchvwith|`Both(_,x)->Somex(* favor right one *)|`Leftx|`Rightx->Somex)end