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 |