"Информатика (базовый уровень)", Гейн А.Г., Юнерман Н.А.
Логическое программирование описывает не последовательность команд, а знания о предметной области: факты, правила и вопросы к ним. Система сама сопоставляет запрос с базой знаний, подбирает значения переменных и проверяет возможные цепочки вывода. Такой подход удобен для задач, где нужно искать связи, доказывать утверждения и находить несколько подходящих решений, например в экспертных системах и задачах на ограничения.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Логическое программирование — способ составления программ через описание фактов, правил и вопросов к ним, а не через пошаговое указание действий. Программист задаёт, что известно и какие выводы допустимы. Система сама ищет доказательство нужного результата.
Факт — утверждение о конкретном объекте или отношении, которое программа считает истинным. Например, любит(Анна, информатика) сообщает о связи Анны с информатикой. Факты образуют исходные сведения, от которых начинается вывод.
Правило — условное утверждение, показывающее, когда из одних фактов можно вывести другой факт. Его можно прочитать так: если выполнены условия справа, верно утверждение слева. Правила позволяют не перечислять все знания по отдельности, а получать новые связи.
Запрос — вопрос к базе знаний, на который система ищет доказанный ответ. В нём можно спрашивать как о конкретном утверждении, так и о неизвестном объекте. Результатом будет подтверждение, значения переменных или отсутствие решений.
База знаний строится из фактов и правил, потому что предметную область удобнее описывать её объектами и связями. Например, сведения о семье можно представить отношениями родитель, а не длинной последовательностью команд. Такое описание отделяет знания от способа их обработки: одну и ту же базу можно использовать для разных запросов.
Для записи отношений применяют предикаты — имена свойств или связей с аргументами. В выражении любит(Анна, информатика) предикат любит имеет два аргумента, обозначающих участников отношения. Благодаря этой форме система различает объекты и понимает, какие места в утверждении должны совпасть.
При проверке запроса система сопоставляет его с фактами и правилами. Если вместо конкретного имени стоит переменная, она подбирает значение, при котором выражение совпадает с известным утверждением. Например, запрос любит(X, информатика) найдёт такое X, для которого в базе есть соответствующий факт.
Одного сопоставления бывает недостаточно, потому что нужное утверждение может выводиться через несколько правил. Система сначала проверяет цель, затем пытается доказать условия выбранного правила и повторяет этот процесс для каждой подцели. Так образуется цепочка: исходные факты становятся основаниями для новых выводов.
Если выбранный путь не приводит к ответу, система возвращается к предыдущей точке выбора и пробует другой факт или правило. Такой механизм называют возвратом и перебором вариантов. Он позволяет найти все значения переменных, а после проверки всех цепочек установить, что решений нет.
| Элемент | Назначение | Пример записи |
|---|---|---|
| Факт | Задаёт исходное истинное утверждение | любит(Анна, информатика) |
| Правило | Позволяет вывести новое утверждение из условий | предок(X, Z) :- родитель(X, Y), родитель(Y, Z) |
| Запрос | Формулирует вопрос к базе знаний | любит(Анна, информатика)? |
| Переменная | Обозначает неизвестное значение, которое нужно подобрать | X в предок(X, Пётр) |
| Предикат и его аргументы | Обозначает свойство или отношение и связанные с ним объекты | родитель(Иван, Ольга) |
Таблицу удобно использовать как памятку при чтении логической программы. Сначала определите имя предиката и его аргументы, затем выясните, является ли запись фактом, правилом или запросом. После этого можно проследить, какие значения переменных система должна подобрать.
Задача 1. Нужно записать факт о том, что Анна любит информатику, и проверить соответствующий запрос. Здесь не требуется правило, потому что искомое утверждение дано непосредственно.
Ответ: запрос получает подтверждение, потому что такой факт есть в базе знаний.
Задача 2. Известно: родитель(Иван, Ольга) и родитель(Ольга, Пётр). Нужно применить правило «родитель родителя — предок» и выяснить связь Ивана с Петром.
Задача 3. Пусть дороги заданы фактами: дорога(А, Б), дорога(А, В), дорога(Б, Г), дорога(В, Г), дорога(Г, Д). Используем правила достижимости: достижим(X, Y) :- дорога(X, Y) и достижим(X, Y) :- дорога(X, Z), достижим(Z, Y).
Ответ: из А достижимы Б, В, Г и Д. Если для некоторого города цепочка не найдена, он в ответ не включается.
Путать факт с правилом. Факт сообщает уже известное, а правило описывает условие получения нового. Ошибка возникает, когда любую запись считают готовым результатом; проверьте, есть ли в ней условие и вывод.
Записывать запрос как команду действий. Запрос не говорит системе, что делать по шагам, а задаёт требование к результату. Чтобы проверить себя, сформулируйте его как вопрос: какое утверждение нужно доказать или какое значение найти?
Смешивать имена объектов и переменные. Конкретное имя обозначает один объект, а переменная может получить разные значения. Проверьте написание: если вместо переменной случайно указано имя, система не сможет подобрать другой объект.
Ожидать только один ответ. Несколько фактов или маршрутов могут давать разные решения. После первого результата нужно позволить системе выполнить возврат и проверить остальные варианты.
До темы нужны высказывания, логические связки, отношения между объектами и понятие переменной. Логическое программирование связано с алгоритмами, но задаёт не порядок команд, а условия поиска решения. Позже такой подход используется в искусственном интеллекте, экспертных системах, обработке знаний и задачах с ограничениями.
Чем логическое программирование отличается от обычного программирования?
В обычной программе разработчик задаёт порядок действий: что выполнить сначала, а что потом. В логической программе он описывает факты и правила, а система сама ищет способ получить ответ на запрос.
Почему факт и правило записываются по-разному?
Факт сообщает уже известное утверждение, поэтому ему не нужно условие. Правило содержит условие и вывод: если выполнены одни утверждения, можно получить другое.
Как программа понимает, какое значение присвоить переменной?
Система сопоставляет выражение с фактами и правилами базы знаний. Подходящие объекты становятся значениями переменной, а неподходящие варианты отбрасываются.
Почему на один запрос может быть получено несколько ответов?
Разные факты и цепочки правил могут приводить к доказательству одного запроса. Поэтому система возвращается к точкам выбора и проверяет другие варианты.
Что происходит, если доказать запрос не удаётся?
Система перебирает доступные варианты вывода. Если ни один не приводит к цели, запрос считается недоказанным, и ответом будет отсутствие решений.
§ 40. Знакомимся с логическим программированием