Я пытаюсь написать предикат SWI-Prolog, который применяет numbervars/3
к анонимным переменным термина, но сохраняет предоставленные пользователем имена его неанонимных переменных.В конце концов я планирую добавить какой-нибудь хук к term_expansion
(или что-то в этом роде).
Пример желаемого результата:
?- TestList=[X,Y,Z,_,_].
> TestList=[X,Y,Z,A,B].
Этот ответ квопрос Преобразование терминов в атомы с сохранением имен переменных в прологе YAP показывает, как использовать read_term
для получения в качестве атомов имен переменных, используемых в термине.Этот список (в форме [X = 'X', Y = 'Y', ...]) не содержит анонимных переменных, в отличие от списка переменных, полученного с помощью term_variables
, что делает изоляцию анонимных переменных довольно простой.
Однако полезность этой замечательной функции несколько ограничена, если ее можно применять только к терминам, считываемым непосредственно из терминала.Я заметил, что все примеры в ответе включают непосредственный пользовательский ввод термина. Можно ли получить (в виде атомов) имена переменных для терминов, которые не получены путем прямого ввода данных пользователем? То есть есть какой-то способ «написать» термин (сохранениеимена переменных) в какой-то невидимый поток, а затем «прочитать» его, как если бы он был введен с терминала?
В качестве альтернативы ... Возможно, это скорее образ мышления LaTeX, но есть ли какой-то способ«обернуть» переменные внутри одинарных кавычек (тем самым, используя их атомизацию) до того, как Prolog развернет / попытается объединить их как переменные, в результате чего они будут рассматриваться как атомы, начинающиеся с заглавных букв, а не как переменные?