41 lines
969 B
Prolog
41 lines
969 B
Prolog
|
|
:- 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).
|
|
|