/* Makes new atoms, one at a time. Do not expect a repeat solution. You must ask each time you want an atom. It starts with some root, and appends an incrementing number onto it. Ask: ?-gensym( student, X ). get: X = student1. ?-gensym( student, X ). get: X = student2. ?-gensym( student, X ). get: X = student3. and ad infinitum. */ gensym( Root, Atom ) :- get_num( Root, Num ), name( Root, Name1 ), integer_name( Num, Name2 ), append( Name1, Name2, Name ), name( Atom, Name ). get_num( Root, Num ) :- retract( current_num( Root, Num1 )), !, Num is Num1 + 1, asserta( current_num( Root, Num)). get_num( Root, 1 ) :- asserta( current_num( Root, 1 )). integer_name( Int, List ) :- integer_name( Int, [], List ). integer_name( I, Sofar, [C|Sofar] ) :- I < 10, !, C is I + 48. integer_name( I, Sofar, List ) :- Tophalf is I/10, Bothalf is I mod 10, C is Bothalf + 48, integer_name( Tophalf, [C|Sofar], List ). append( [], L, L ). append( [Z|L1], L2, [Z|L3] ) :- append( L1, L2, L3 ). printstring( [] ). printstring( [] ). printstring( [H|T] ) :- put( H ), printstring( T ).