На этом шаге мы рассмотрим переменные.
В простом запросе, чтобы найти того, кто любит теннис, можно использовать переменные. Например:
likes(X,tennis).
В этом запросе буква X используется как переменная для нахождения неизвестного человека. Имена переменных в Прологе должны начинаться с заглавной буквы (или с символа подчеркивания), после которой может стоять любое количество букв (заглавных или строчных), цифр или символов подчеркивания. Ниже приведены правильные имена переменных:
My_first_correct_variable_name
Sales_10_ll_86
следующие три - неправильные:
lstattempt
second_attempt
"disaster"
Удобно использовать в названии переменной буквы разного регистра:
IncomeAndExpenditureAccount
Осмысленный выбор имен переменных делает программу более удобной для чтения. Например:
likes(Person,tennis).
likes(X,tennis).
Цель: likes(Person,tennis).
Person=ellen Person=mark 2 решения
Вы уже могли заметить, что Пролог не имеет оператора присваивания. Это важное отличие Пролога от других языков программирования.
До инициализации переменная свободна; после присвоения ей значения она станонится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение.
В примере pro15_1.pro, приведенном ниже, рассмотрено как и когда переменные получают свои значения.
predicates likes(symbol,symbol) clauses likes (ellen, reading). likes(John,computers). likes(John,badminton). likes(leonard,badminton). likes(eric,swimming). likes(eric,reading).
Рассмотрим запрос: есть ли человек, который любит и чтение, и плавание?
likes(Person,reading), likes(Person,swimming).
Пролог будет решать обе части запроса посредством поиска фактов с начала и до конца программы. В первой части запроса
likes(Person,reading)
likes(ellen,reading)
Далее, для полного разрешения запроса (поиск человека, которому нравится и чтение, и плавание) должна быть решена вторая часть запроса. Так как Person сейчас связана со значением ellen, Пролог должен искать факт
likes(ellen,swimming)
Пролог ищет этот факт от начала программы, но совпадений нет (потому что в программе нет такого факта). Вторая часть запроса ложна, если Person имеет значение ellen.
Теперь Пролог освободит переменную Person и попытается найти иное решение первой части запроса. Поиск другого факта, удовлетворяющего первой части запроса, начинается с указателя в списке фактов(такое возвращение к отмеченной позиции называется поиском с возвратом).
Пролог ищет следующего человека, кто любит чтение и находит факт likes (eric, reading). Переменная Person сейчас связана со значением eric, и Пролог пытается вновь найти соответствие со второй частью запроса посредством поиска в программе факта:
likes(eric,swimming)
Пролог находит совпадение (последнее предложение в программе), и запрос полностью удовлетворяется. Пролог возвращает
Person=eric. 1 решение.
Анонимные переменные позволяют "привести в порядок" наши программы. Если вам нужна только определенная информация запроса, можно использовать анонимные переменные для игнорирования ненужных значений. В Прологе анонимные переменные обозначаются символом подчеркивания (_).
Следующий "семейный" пример pro15_2.pro демонстрирует использование анонимных переменных.
predicates male(symbol) female(symbol) parent(symbol, symbol) clauses male(bill). male (joe). female(sue). female(tammy). parent(bill,joe). parent (sue, joe). parent(joe,tammy).
Например, в следующем запросе нам понадобится узнать, какие люди являются родителями, но вам неинтересно, кто их дети. Пролог знает, что каждый раз, когда вы используете символ подчеркивания в запросе, вам не нужна информация о значении, представленном на месте переменной.
parent(Parent, _ ).
Получив такой запрос, Пролог отвечает:
Parent=bi11 Parent=sue Parent=joe 3 решения
В этом случае Пролог находит и выдает трех родителей, но он не выдает значения, связанные со вторым аргументом в предложении parent.
Анонимные переменные также можно использовать в фактах. Следующие факты Пролога:
owns(_,shoes). eats(_).
У каждого есть туфли. (Everyone owns shoes)
Каждый ест. (Everyone eats)
Анонимные переменные сопоставляются с любыми данными.
Со следующего шага мы начнем рассматривать цели.