Вы можете прочитать термины, используя опцию variable_names
, которая дает список пар Name = Variable в термине чтения. Так что, возможно, это то, что вам нужно.
Вот командная строка, которая читает термин, затем объединяет переменные с их именами и, наконец, выводит результат в атом так, как вы указали в своем вопросе.
?- read_term(Term, [variable_names(VarNames)]), maplist(call, VarNames),
with_output_to(atom(Atom), maplist(write, Term)).
|: [p(X,Y,Z),r(H,G,K)].
Term = [p('X', 'Y', 'Z'), r('H', 'G', 'K')],
VarNames = ['X'='X', 'Y'='Y', 'Z'='Z', 'H'='H', 'G'='G', 'K'='K'],
Atom = 'p(X,Y,Z)r(H,G,K)'.
Обратите внимание, что он изменяет условие чтения, поэтому вы можете сначала сделать его копию (copy_term/2
).