:- module(clpbn_vmap, [init_vmap/1, % init_vmap(-Vmap) add_to_vmap/4, % add_to_vmap(+V,-I,+VMap0,VMapF) get_from_vmap/3, % add_to_vmap(+V,-I,+VMap0) vars_to_numbers/4, % vars_to_numbers(+Vs,-Is,+VMap0,VMapF) lvars_to_numbers/4, % lvars_to_numbers(+LVs,-LIs,+VMap0,VMapF) vmap_to_list/2 ]). :- use_module(library(rbtrees)). :- use_module(library(maplist)). % % vmap: map V->I % contiguous Vs to contiguous integers % init_vmap(vmap(0,Empty)) :- rb_new(Empty). get_from_vmap(V, I, VMap0) :- VMap0 = vmap(_I,Map0), rb_lookup(V, I, Map0). add_to_vmap(V, I, VMap0, VMap0) :- VMap0 = vmap(_I,Map0), rb_lookup(V, I, Map0), !. add_to_vmap(V, I0, vmap(I0,Map0), vmap(I, Map)) :- I is I0+1, rb_insert(Map0, V, I0, Map). vars_to_numbers(Vs, Is, VMap0, VMap) :- foldl(add_to_vmap, Vs, Is, VMap0, VMap). lvars_to_numbers(LVs, LIs, VMap0, VMap) :- foldl(vars_to_numbers, LVs, LIs, VMap0, VMap). vmap_to_list(vmap(_,Map), L) :- rb_visit(Map, L).