| 1 | % (c) 2009-2026 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
| 2 | % Heinrich Heine Universitaet Duesseldorf | |
| 3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
| 4 | ||
| 5 | :- module(gensym, | |
| 6 | [gensym/2, get_gensym_counter/2, | |
| 7 | reset_gensym/0, | |
| 8 | gennum/1, gennum_count/1, reset_gennum/0, reset_gennum/1]). | |
| 9 | ||
| 10 | :- use_module(module_information). | |
| 11 | :- module_info(group,tools). | |
| 12 | :- module_info(description,'Tools for generating fresh symbols and numbers.'). | |
| 13 | ||
| 14 | :- use_module(tools_strings, [string_concatenate/3]). | |
| 15 | ||
| 16 | /* ===================================================== */ | |
| 17 | ||
| 18 | /* ------ */ | |
| 19 | /* GENSYM */ | |
| 20 | /* ------ */ | |
| 21 | ||
| 22 | /* generate a new symbol with the given prefix */ | |
| 23 | /* code from the "Art of Prolog" */ | |
| 24 | gensym(Prefix,V) :- | |
| 25 | var(V), | |
| 26 | atom(Prefix), | |
| 27 | oldvalue(Prefix,N), | |
| 28 | N1 is N + 1, | |
| 29 | set_flag(Prefix,N1), | |
| 30 | string_concatenate(Prefix,'__',PreSep), | |
| 31 | string_concatenate(PreSep,N1,V). | |
| 32 | get_gensym_counter(Prefix,R) :- (flag(Prefix,Count) -> R=Count ; R=0). | |
| 33 | ||
| 34 | :- dynamic gennum_count/1. | |
| 35 | gennum_count(0). | |
| 36 | ||
| 37 | gennum(Nr) :- | |
| 38 | retract(gennum_count(Nr)), N1 is Nr + 1, | |
| 39 | assertz(gennum_count(N1)). | |
| 40 | ||
| 41 | reset_gensym :- retractall(flag(_,_)). | |
| 42 | reset_gennum :- reset_gennum(0). | |
| 43 | ||
| 44 | reset_gennum(Nr) :- retractall(gennum_count(_)), assertz(gennum_count(Nr)). | |
| 45 | ||
| 46 | oldvalue(Prefix,N) :- flag(Prefix,N),!. | |
| 47 | oldvalue(_Prefix,0). | |
| 48 | set_flag(Name,X) :- | |
| 49 | nonvar(Name), | |
| 50 | retract(flag(Name,_Val)),!, | |
| 51 | asserta(flag(Name,X)). | |
| 52 | set_flag(Name,X) :- | |
| 53 | nonvar(Name), | |
| 54 | asserta(flag(Name,X)). | |
| 55 | ||
| 56 | :- dynamic flag/2. | |
| 57 | %flag(foo,foo) :- fail. | |
| 58 |