45 lines
		
	
	
		
			805 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			805 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| /**
 | |
|  * @file   gensym.yap
 | |
|  * @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
 | |
|  * @date   Tue Nov 17 18:37:13 2015
 | |
|  * 
 | |
|  * @brief  Generate a new atom.
 | |
|  * 
 | |
|  * 
 | |
| */
 | |
| :- module(gensym, [
 | |
| 	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.
 | |
| 
 | |
| gensym(Atom, New) :-
 | |
| 	retract(gensym_key(Atom,Id)), !,
 | |
| 	atomic_concat(Atom,Id,New),
 | |
| 	NId is Id+1,
 | |
| 	assert(gensym_key(Atom,NId)).
 | |
| gensym(Atom, New) :-
 | |
| 	atomic_concat(Atom,1,New),
 | |
| 	assert(gensym_key(Atom,2)).
 | |
| 
 | |
| reset_gensym(Atom) :-
 | |
| 	retract(gensym_key(Atom,_)).
 | |
| 
 | |
| reset_gensym :-
 | |
| 	retractall(gensym_key(_,_)).
 | |
| 
 | |
| 
 |