Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РЛП.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
681.47 Кб
Скачать

Министерство образования и науки Российской Федерации

Рязанский государственный радиотехнический университет

Кафедра электронных вычислительных машин

Конспект лекций по дисциплине

«Рекурсивно-логическое программирование»

Специальность 010503 – «Математическое обеспечение и администрирование информационных систем»

Квалификация выпускника – математик-программист

Форма обучения – очная

Подготовил доцент кафедры ЭВМ

Саблина Виктория Александровна

Рязань 2011

Содержание

1 Введение в язык Пролог 4

2 Логические основы Пролога 4

3 Основные понятия Пролога 7

4 Рекурсия 10

5 Структура программы на Турбо Прологе 13

6 Управление выполнением программы на Прологе 14

7 Списки 17

8 Сортировка списков 18

9 Множества и деревья 22

10 Строки 30

11 Файлы 34

12 Внутренние (динамические) базы данных 37

13 Пролог и искусственный интеллект 40

1 Введение в язык Пролог

Название языка «Пролог» происходит от слов «ЛОГическое ПРОграммирование». Пролог основывается на таком разделе математической логики, как исчисление предикатов.

Традиционно под программой понимают последовательность операторов (команд, выполняемых компьютером). Этот стиль программирования принято называть императивным. Программируя в императивном стиле, программист должен объяснить компьютеру, как нужно решать задачу.

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

Основные области языка Пролог:

  • автоматизированный перевод с одного языка на другой

  • быстрая разработка интерфейсов для существующих систем

  • символьные вычисления для решения уравнений, дифференцирование и интегрирование

  • экспертные системы и оболочки

  • автоматическое доказательство теорем

  • полуавтоматическое составление расписаний

  • САПР

Области, для которых Пролог не предназначен: большой объем арифметических вычислений (обработка аудио, видео и т.д.); написание драйверов.

2 Логические основы Пролога

Задана формализованная система F, если определены:

  1. Алфавит – счетное множество символов

  2. Формулы системы – некоторое подмножество всех слов, которое можно образовать из символов, входящих в алфавит

  3. Аксиомы – выделенное множество формул системы

  4. Правила вывода системы – конечное множество отношений между формулами системы.

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

Алфавит логики первого порядка составляют следующие символы:

  1. переменные (будем обозначать их последними буквами английского алфавита u, v, x, y, z);

  2. константы (будем обозначать их первыми буквами английского алфавита a, b, c, d);

  3. функциональные символы (используем для их обозначения ближние буквы f и g);

  4. предикатные символы (обозначим их дальними буквами p, q и r);

  5. пропозициональные константы истина и ложь (true и false);

  6. логические связки ¬ (отрицание),   (конъюнкция),   (дизъюнкция),   (импликация);

  7. кванторы:  (существования),  (всеобщности);

  8. вспомогательные символы (, ), ,.

Если предикатный или функциональный символ имеет N – аргументов, он называется N-местным предикатным или функциональным символом.

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

Атомная (элементарная) формула получается путём применения предиката к термам.

Формулы логики первого порядка получаются следующим образом:

  1. Всякая атомная формула есть формула

  2. Если А и В – формулы, х – переменная, тогда - тоже формулы.

  3. Других формул нет

Литералом называют атомную формулу или отрицание атомной формулы. Атом называют положительным литералом, а его отрицание – отрицательным литералом.

Дизъюнкт – дизъюнкция конечного числа литералов. Если дизъюнкт не содержит литералов, его называют пустым дизъюнктом.

КНФ – конъюнкция конечного числа дизъюнктов.

Существуют алгоритмы приведения произвольной формулы исчисления к множеству дизъюнктов.

Унификация позволяет отождествлять формулы логики 1-го порядка путем замены свободных переменных на термы.

Метод резолюций

Если для двух дизъюнктов существует атомная формула, которая в один дизъюнкт входит положительно, а в другой отрицательно, то, вычеркнув соответственно из одного дизъюнкта положительное вхождение атомной формулы, а из другого — отрицательное, и объединив эти дизъюнкты, мы получим дизъюнкт, называемый резольвентой. Исходные дизъюнкты в таком случае называются родительскими или резольвируемыми, а вычеркнутые формулы — контрарными литералами. Другими словами, резольвента — это дизъюнкт, полученный из объединения родительских дизъюнктов вычеркиванием контрарных литералов.

Пример.

  1. – родительский дизъюнкт

и – контрарные литералы - резольвента

  1. – родительский дизъюнкт

и – контрарные литералы - резольвента

Метод резолюций является обобщением метода «доказательства от противного». Вместо вывода некоторой формулы, гипотезы из имеющегося непротиворечивого множества аксиом, мы добавляем отрицание нашей формулы к множеству аксиом и пытаемся вывести из него противоречие. Если нам удается это сделать, мы приходим к выводу, пользуясь законом исключающего третьего, сто исходная формула была выводима из множества аксиом.

Добавим отрицание исходной формулы к множеству посылок, преобразуем каждую из этих формул во множество дизъюнктов, объединим получившиеся множества дизъюнктов и попытаемся вывести из этого множества дизъюнктов противоречие (пустой дизъюнкт ℵ). Для этого будем выбирать из нашего множества дизъюнкты, содержащие унифицируемые контрарные литералы, вычислять их резольвенту по правилу резолюции, добавлять ее к исследуемому множеству дизъюнктов. Этот процесс будем продолжать до тех пор, пока не выведем пустой дизъюнкт.

Возможны, вообще говоря, три случая:

  1. Этот процесс никогда не завершается.

  2. Среди текущего множества дизъюнктов не окажется таких, к которым можно применить правило резолюции. Это означает, что множество дизъюнктов выполнимо, и, значит, исходная формула не выводима.

  3. На очередном шаге получена пустая резольвента. Это означает, что множество дизъюнктов невыполнимо и, следовательно, начальная формула выводима.

Теорема. Описанный процесс обязательно завершится за конечное число шагов, если множество дизъюнктов было невыполнимо.

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

Если дизъюнкт состоит только из одного положительного литерала, он называется фактом.

Если дизъюнкт состоит только из отрицательных литералов, его называют вопросом.

Если дизъюнкт содержит и положительные и отрицательные литералы, то его называют правилом.

Правила вывода:

Prolog:

Логической программой называют конечное непустое множество хорновских дизъюнктов (фактов, правил).

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

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

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