- •Билет № 6
- •Семантические сети.
- •Основные понятия Пролога – переменные свободные и связанные; анонимная переменная
- •Описать базу знаний о родственных отношениях
- •Билет № 7
- •1.Экспертные системы
- •Основные понятия Пролога – отсечения.
- •3.Создать предикат, который будет дублировать символ, введенный пользователем с клавиатуры
- •Билет № 8
- •Предметные области экспертных систем
- •Рекурсия в Прологе. Достоинства и недостатки
- •Создать предикат, позволяющий вычислить длину списка, т.Е. Количество элементов в списке
- •Билет № 9
- •Хвостовая рекурсия.
- •Создать предикат, позволяющий проверить принадлежность элемента списку
- •Билет № 10
- •Этапы и технология разработки экспертных систем
- •Организация циклов на основе рекурсии
- •Написать предикат, позволяющий соединить два списка в один.
Рекурсия в Прологе. Достоинства и недостатки
В отличие от традиционных языков программирования, в которых основным средством организации повторяющихся действий являются циклы, в Прологе для этого используются процедура поиска с возвратом (откат) и рекурсия. Откат дает возможность получить много решений в одном вопросе к программе, а рекурсия позволяет использовать в процессе определения предиката его самого.
По аналогии с математической индукцией, на которую рекурсия немного похожа, любая рекурсивная процедура должна включать в себя базис и шаг рекурсии.
Базис рекурсии - это предложение, определяющее некую начальную ситуацию или ситуацию в момент прекращения.
Шаг рекурсии - это правило, в теле которого обязательно содержится, в качестве подцели, вызов определяемого предиката. Если мы хотим избежать зацикливания, определяемый предикат должен вызываться не от тех же параметров, которые указаны в заголовке правила. Параметры должны изменяться на каждом шаге так, чтобы в итоге либо сработал базис рекурсии, либо условие выхода из рекурсии, размещенное в самом правиле.
С одной стороны, метод рекурсии имеет свои преимущества перед методом итерации, который используется в императивных языках программирования намного чаще. Рекурсивные алгоритмы, как правило, намного проще с логической точки зрения, чем итерационные. Некоторые алгоритмы удобно записывать именно рекурсивно.
С другой стороны, рекурсия имеет большой недостаток: ей, вообще говоря, может не хватать для работы стека. При каждом рекурсивном вызове предиката в специальном стековом фрейме запоминаются все промежуточные переменные, которые могут понадобиться. Максимальный размер стека при работе под управлением операционной системы MS DOS всего 64 Кб. Этого достаточно для размещения около трех-четырех тысяч стековых фреймов (в зависимости от количества и размера промежуточных переменных). При больших входных значениях стека может не хватить.
Создать предикат, позволяющий вычислить длину списка, т.Е. Количество элементов в списке
length([], 0). /* в пустом списке элементов нет */
length([_|T], L) :–
length(T, L_T), /* L_T — количество
элементов в хвосте */
L = L_T + 1. /* L — количество элементов
исходного списка */
Билет № 9
Обобщенная структура экспертных систем (7 билет)
Хвостовая рекурсия
Создать предикат, позволяющий проверить принадлежность элемента списку
Хвостовая рекурсия.
Есть, правда, один вариант рекурсии, который использует практически столько же оперативной памяти, сколько итерация в императивных языках программирования. Это так называемая хвостовая или правая рекурсия. Для ее осуществления рекурсивный вызов определяемого предиката должен быть последней подцелью в теле рекурсивного правила и к моменту рекурсивного вызова не должно остаться точек возврата (непроверенных альтернатив). То есть у подцелей, расположенных левее рекурсивного вызова определяемого предиката, не должно оставаться каких-то непроверенных вариантов и у процедуры не должно быть предложений, расположенных ниже рекурсивного правила. Турбо Пролог, на который мы ориентируемся в нашем курсе, распознает хвостовую рекурсию и устраняет связанные с ней дополнительные расходы. Этот процесс называется оптимизацией хвостовой рекурсии или оптимизацией последнего вызова.
