Итак, как предлагается в комментариях, вы должны использовать atom_concat/3
следующим образом:
generate :-
Output = 'abc',
generate_random_string(Output,Result,0),
write(Result).
generate_random_string(Output,Result,5):- !,
Characters = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g'],
random(0, 14, RandomValue),
nth0(RandomValue, Characters, RandomCharacter),
atom_concat(RandomCharacter,Output,Result).
generate_random_string(Output,Result,CharNum) :-
CharNum \= 5,
Characters = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g'],
random(0, 14, RandomValue),
nth0(RandomValue, Characters, RandomCharacter),
atom_concat(RandomCharacter,Output,Concat),
Count is CharNum + 1,
generate_random_string(Concat,Result,Count).
Запрос:
?- generate.
feFaaCabc
true
Как видите, если вы введетестроку и вы хотите добавить к ней несколько символов, программа выведет строку указанной длины (в вашем случае 5+1
, потому что вы начинаете с 0) плюс длина входной строки.
Другойи модульный способ сделать это может быть следующим, используя random_member/2
:
pick_random(_,0,L,L):- !.
pick_random(LC,I,SIn,SOut):-
I > 0,
random_member(R,LC),
atom_concat(SIn,R,Concat),
I1 is I-1,
pick_random(LC,I1,Concat,SOut).
random_string(Len,SIn,SOut):-
LC = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g'],
string_length(SIn,Ls),
Len1 is Len - Ls,
pick_random(LC,Len1,SIn,SOut).
Запрос:
?- random_string(4,'gr',S).
S = grAd % note gr is in the string
?- random_string(4,'',S).
S = fdGb
С этой отправной точки довольно легко сделать также длинуслучайная строка.