/** * @file gensym.yap * @author VITOR SANTOS COSTA * @date Tue Nov 17 18:37:13 2015 * * @brief Generate a new atom. * * */ :- module(gensym, [ init_gensym/1, gensym/2, reset_gensym/1, reset_gensym/0 ]). /** * @defgroup gensym Generate a new symbol. * @ingroup library * * Predicates to create new atoms based on the prefix _Atom_. * They use a counter, stored as a * dynamic predicate, to construct the atom's suffix. * */ :- dynamic gensym_key/2. init_gensym(Key) :- retractall(gensym_key(Key,_)), assert(gensym_key(Key,0) ). gensym(Key, New) :- retract(gensym_key(Key,Id)), !, atomic_concat(Key,Id,New), NId is Id+1, assert(gensym_key(Key,NId)). gensym(Atom, New) :- atomic_concat(Atom,0,New), assert(gensym_key(Atom,1)). reset_gensym(Atom) :- retract(gensym_key(Atom,_)). reset_gensym :- retractall(gensym_key(_,_)).