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