1 % (c) 2009-2019 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 assert(gennum_count(N1)).
42
43 reset_gensym :- retractall(flag(_,_)).
44 reset_gennum :- reset_gennum(0).
45
46 reset_gennum(Nr) :- retractall(gennum_count(_)), assert(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