Есть проблема с тем, что вы хотите сделать. Удобное для пользователя имя, которое вы даете переменным (например, 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]]].
person
gusbro
schedule
20.07.2011