Шаг 15.
Основы логического программирования.
Переменные

    На этом шаге мы рассмотрим переменные.

    В простом запросе, чтобы найти того, кто любит теннис, можно использовать переменные. Например:    

 likes(X,tennis).

    В этом запросе буква X используется как переменная для нахождения неизвестного человека. Имена переменных в Прологе должны начинаться с заглавной буквы (или с символа подчеркивания), после которой может стоять любое количество букв (заглавных или строчных), цифр или символов подчеркивания. Ниже приведены правильные имена переменных:

    My_first_correct_variable_name
    Sales_10_ll_86

    следующие три - неправильные:

    lstattempt
    second_attempt
    "disaster"

    Удобно использовать в названии переменной буквы разного регистра:

    IncomeAndExpenditureAccount

    Осмысленный выбор имен переменных делает программу более удобной для чтения. Например:

   likes(Person,tennis).
    лучше, чем
   likes(X,tennis).
    потому что Person имеет больше смысла, чем х. Теперь испытайте цель в программе pro11_1.pro из шага 11:
   Цель: likes(Person,tennis).
    Пролог ответит:
   Person=ellen 
   Person=mark 
   2 решения
т.к. цель может получить два решения, а именно, сопоставляя переменную Person последовательно со значениями ellen и mark.

Инициализация переменных

    Вы уже могли заметить, что Пролог не имеет оператора присваивания. Это важное отличие Пролога от других языков программирования.


    Замечание: Переменные в Прологе инициализируются при сопоставлении с константами в фактах или правилах.

    До инициализации переменная свободна; после присвоения ей значения она станонится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение.


    Замечание: Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.

    В примере 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)
переменная Person свободна; ее значение неизвестно перед тем, как Пролог попытается найти решение. С другой стороны, второй аргумент, reading, известен. Пролог ищет факт, который соответствует первой части запроса. Первый факт в программе
   likes(ellen,reading)
удовлетворяет первой части запроса (reading в факте соответствует reading в запросе), значит Пролог связывает свободную переменную Person со значением ellen, соответствующим значению в факте. В тоже время Пролог помещает указатель и список фактов, показывающий, как далеко продвинулась процедура поиска.

    Далее, для полного разрешения запроса (поиск человека, которому нравится и чтение, и плавание) должна быть решена вторая часть запроса. Так как 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)

    Анонимные переменные сопоставляются с любыми данными.

    Со следующего шага мы начнем рассматривать цели.




Предыдущий шаг Содержание Следующий шаг