Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания по ИИС.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
3.88 Mб
Скачать

Контрольные вопросы:

  1. Дайте понятие цели.

  2. Как называется цель, состоящая из двух или более частей?

  3. Как называется каждая часть составной цели?

  4. Дайте понятие конъюнктивной и дизъюнктивной подцелей.

  5. Сформулируйте понятие условия.

  6. Какие типы фраз составляют язык Пролог?

  7. Из чего основана программа, написанная на языке Пролог?

  8. Должен ли Prolog искать или выводить подтверждения факта?

  9. Сформулируйте понятие и приведите пример правила.

Лабораторная работа №8. Переменные на языке программирования пролог.

Цель работы: формирование знаний синтаксических особенностей переменных, навыков работы с переменными на языке программирования Пролог.

Используемое программное обеспечение: Visual Prolog 5.2.

Теоретические сведения

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

Переменная, не имеющая значения, называется свободной, переменная, имеющая значение, - конкретизированной.

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

В простых запросах можно использовать переменные, для постановки вопросов. Например, Who likes tennis (кто любит теннис)?:

likes(X, tennis).

В имени переменной, за исключением первого символа (который должен быть символом верхнего регистра или символом подчеркивания), Visual Prolog позволяет использовать нижний регистр или символы верхнего регистра на любой позиции. Один из способов сделать имя переменной более удобочитаемым - это использовать совместно верхний регистр и символы нижнего регистра: IncomeAndExpenditureAccount.

В Прологе нет оператора присваивания; это существенное различие между Прологом и другими языками программирования. Переменные в Прологе получают их значения, будучи согласованными, с константами в фактах или правилах.

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

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

Анонимные переменные

Анонимные переменные позволяют Вам упростить ваши программы. Если Вы нуждаетесь только в некоторой части информации из запроса, можно использовать анонимные переменные, чтобы игнорировать ненужные Вам значения. В Прологе анонимные переменные обозначаются символом нижнего подчеркивания (_).

Анонимные переменные можно использовать вместо любой другой переменной. Различие заключается в том, что для анонимной переменной никогда не будет устанавливаться значение.

Рассмотрим пример, который демонстрирует, как и когда переменные получают свои значения.

  1. Реализуйте следующий программный код в Visual Prolog:

PREDICATES

nondeterm likes(symbol, symbol)

CLAUSES

likes(ellen, reading).

likes(john, computers).

likes(john, badminton).

likes(leonard, badminton).

likes(eric, swimming).

likes(eric, reading).

  1. Рассмотрите такой запрос: Is there a person who likes both reading and swimming (Этот человек любит и чтение, и плавание)?

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

Пролог ищет следующего человека, который любит чтение, т.е. пытается найти факт подобно likes(eric, reading). Переменная Person теперь связана с eric, и Пролог еще раз пытается удовлетворить вторую часть запроса, ища в программе факт подобно следующему:

likes(eric, swimming).

  1. На этот раз соответствие полностью найдено, и запрос полностью удовлетворен. Пролог выдаст ответ (рис. 1):

Person=eric

1 Solution

Р ис. 1. Вывод результата к вышеописанной программе

  1. Рассмотрим следующий пример и составим новое отношение-правило дед(X,Y) и определим, кто является дедушкой Кати.

Заданы отношения-факты:

родитель(“иван”, “катя”).

родитель(“анна”, “олег ”).

родитель(“олег”, “дима”).

родитель(“игорь”, “ольга”).

родитель(“олег”, “виктор”).

родитель(“игорь”, “иван”).

мужчина(“дима”).

мужчина(“иван”).

мужчина(“игорь”).

мужчина(“олег”).

мужчина(“виктор”).

женщина(“катя”).

женщина(“ольга”).

женщина(“анна”).

  1. Опишем разделы доменов и предикатов.

DOMAINS

имя=string

PREDICATES

nondeterm родитель(имя, имя)

женщина(имя)

мужчина(имя)

nondeterm дед(имя, имя)

  1. Отношение grandfather можно непосред­ственно записать на языке Prolog следующим образом: дед(X, Z):- родитель(X, Y), родитель(Y, Z), мужчина(X) или grandfather (X, Z):- parent(X, Y), parent(Y, Z) (рис. 2).

Рис. 2. Графы, которые определяют отношения mother и grandfather

  1. После определения отношения необходимо прописать нашу цель:

GOAL

дед(X, "катя").

  1. Откомпилируйте исходный код примера и запустите его. Результат выполнения программы должен отобразиться в окне (рис. 3):

Р ис. 3. Окно вывода результата

В следующем примере рассмотрим использование анонимных переменных.

1. Реализуйте ниже приведенный код.

PREDICATES

male(symbol)

female(symbol)

nondeterm parent(symbol, symbol)

CLAUSES

male(bill).

male(joe).

female(sue).

female(tammy).

parent(bill, joe).

parent(sue, joe).

parent(joe, tammy).

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

2. Задайте следующую цель:

GOAL

parent(Parent, _).

П олучив такой запрос, Пролог выдаст ответ (рис. 4):

Рис. 4. Вывод результата

В этом случае, из-за использования анонимной переменной, Пролог находит и сообщает о трех родителях, но ничего не упоминается о значении второго аргумента.