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