Анонимные переменные Prolog не играют роли в разрешении SLD или в объединении терминов, но играют практическую роль в коде Prolog и запросах Prolog. Фундаментальный аспект анонимных переменных заключается в том, что каждое вхождение анонимной переменной является отдельной переменной. Рассмотрим следующий запрос:
| ?- a(_, _) = a(1, 2).
yes
Объединение не удалось бы, если бы две анонимные переменные были одной и той же переменной. Теперь рассмотрим запрос:
| ?- a(X, _) = a(1, 2).
X = 1
yes
Привязки переменных сообщаются только для переменных, которые не являются анонимными. Это позволяет использовать анонимную переменную каждый раз, когда нас не интересуют какие-либо привязки для переменной.
Анонимные переменные также упрощают написание определений предикатов, где они аналогично действуют как переменные "не заботятся". Рассмотрим в качестве примера обычное определение предиката member/2
:
member(Element, [Element| _]).
member(Element, [_| List]) :-
member(Element, List).
В первом предложении нас не интересует хвост списка. Во втором пункте нам нет дела до заголовка списка. Используя анонимные переменные, мы можем игнорировать эти подслови и избегать жалоб компилятора на переменные, которые будут использоваться один раз в предложении.
Обновление
Обратите внимание, что все различные переменные в запросе получают уникальные внутренние ссылки на переменные, не путать их с именами переменных, введенными пользователем. Имена переменных используются только интерпретатором верхнего уровня для сообщения о привязках для успешных запросов. Механизм вывода, используемый для доказательства запроса, использует переменные (внутренние) ссылки. Следующий запрос, использующий предикат стандарта ISO Prolog read_term/2
со стандартными опциями, может помочь:
| ?- read_term(Term, [variable_names(Names), variables(Variables)]).
a(X, _, Y, _).
Names = ['X'=A,'Y'=B]
Term = a(A,C,B,D)
Variables = [A,C,B,D]
yes
В термине read есть четыре разные переменные, но только две из них имеют (предоставленные пользователем) имена.