Существует проблема с тем, что вы хотите сделать.Удобное для пользователя имя, которое вы даете переменным (например, X, Y), известно синтаксическому анализатору верхнего уровня, но «потеряно» внутри вашей программы.В этом фрагменте будут перечислены все привязки, но переменные будут иметь общие имена:
find_mappings(Template, Mappings):-
term_variables(Template, Vars),
find_mappings1(Vars, Mapping),
findall(Mapping, Template, Mappings).
find_mappings1([], []).
find_mappings1([Var|Vars], [[Name,Var]|Mappings]):-
term_to_atom(Var, Name),
find_mappings1(Vars, Mappings).
?- find_mappings(a(X,Y), L).
L = [[['_G385', 0], ['_G386', 1]], [['_G385', 1], ['_G386', 1]]].
Вы можете предпочесть добавить еще один аргумент в вашу процедуру, чтобы получить правильные имена ваших переменных:
find_mappings(Template, Names, Mappings):-
term_variables(Template, Vars),
find_mappings1(Vars, Names, Mapping),
findall(Mapping, Template, Mappings).
find_mappings1([], [], []).
find_mappings1([Var|Vars], [Name|Names], [[Name,Var]|Mappings]):-
find_mappings1(Vars, Names, Mappings).
?- find_mappings(a(X,Y), ['X', 'Y'], L).
L = [[['X', 0], ['Y', 1]], [['X', 1], ['Y', 1]]].