33 lines
813 B
Prolog
33 lines
813 B
Prolog
:- module(gensym, [gensym/2,
|
|
reset_gensym/1]).
|
|
|
|
:- use_module(library(error)).
|
|
:- use_module(library(lists)).
|
|
:- use_module(library(iso_ext)).
|
|
:- use_module(library(si)).
|
|
|
|
gensym_key(Base, BaseKey) :-
|
|
atom_concat('gensym_', Base, BaseKey).
|
|
|
|
append_id(Base, UniqueID, Unique) :-
|
|
atom_chars(Base, BaseChars),
|
|
number_chars(UniqueID, IDChars),
|
|
append(BaseChars, IDChars, AtomChars),
|
|
atom_chars(Unique, AtomChars).
|
|
|
|
gensym(Base, Unique) :-
|
|
must_be(var, Unique),
|
|
atom_si(Base),
|
|
gensym_key(Base, BaseKey),
|
|
( bb_get(BaseKey, UniqueID0) ->
|
|
UniqueID is UniqueID0 + 1,
|
|
bb_put(BaseKey, UniqueID),
|
|
append_id(Base, UniqueID, Unique)
|
|
; bb_put(BaseKey, 1),
|
|
append_id(Base, 1, Unique)
|
|
).
|
|
|
|
reset_gensym(Base) :-
|
|
atom_si(Base),
|
|
bb_put(Base, 0).
|