home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / prolog / pdprolog / gensym.pro < prev    next >
Text File  |  1986-05-05  |  1KB  |  42 lines

  1. /* Makes new atoms, one at a time. Do not expect a repeat solution. 
  2. You must ask each time you want an atom. It starts with some root,
  3. and appends an incrementing number onto it. 
  4.  
  5. Ask: ?-gensym( student, X ).      get: X = student1.
  6.      ?-gensym( student, X ).      get: X = student2.
  7.      ?-gensym( student, X ).      get: X = student3.
  8.  
  9.     and ad infinitum. */
  10.  
  11. gensym( Root, Atom ) :-
  12.     get_num( Root, Num ),
  13.     name( Root, Name1 ),
  14.     integer_name( Num, Name2 ),
  15.     append( Name1, Name2, Name ),
  16.     name( Atom, Name ).
  17.  
  18. get_num( Root, Num ) :-
  19.     retract( current_num( Root, Num1 )), !,
  20.     Num is Num1 + 1,
  21.     asserta( current_num( Root, Num)).
  22.  
  23. get_num( Root, 1 ) :- asserta( current_num( Root, 1 )).
  24.  
  25. integer_name( Int, List ) :- integer_name( Int, [], List ).
  26. integer_name( I, Sofar, [C|Sofar] ) :-
  27.     I < 10, !, C is I + 48.
  28. integer_name( I, Sofar, List ) :-
  29.     Tophalf is I/10,
  30.     Bothalf is I mod 10,
  31.     C is Bothalf + 48,
  32.     integer_name( Tophalf, [C|Sofar], List ).
  33.  
  34.  
  35. append( [], L, L ).
  36. append( [Z|L1], L2, [Z|L3] ) :- append( L1, L2, L3 ).
  37.  
  38. printstring( [] ).
  39. printstring( [] ).
  40. printstring( [H|T] ) :- put( H ), printstring( T ).
  41.  
  42.