Язык Пролог Пролог (Prolog) - один из наиболее широко используемых языков логического программирования. Пролог декларативный язык, который основывается на исчисление предикатов и при работе с которым необходимо описать ситуацию (правила и факты) и сформулировать цель (запрос), позволяя интерпретатору Пролога найти решение задачи. Название языка "Пролог" происходит от слов ЛОГическое ПРОграммирование (PROgramming in LOGic). В 1965 году в работе "A machine oriented logic based on the resolution principle" Дж Робинсон представил метод автоматического поиска доказательства теорем в исчислении предикатов первого порядка, получивший название "принцип резолюции". На самом деле, идея данного метода была предложена Эрбраном еще в 1931 году. В 1973 году группа по искусственному интеллекту во главе с Аланом Колмероэ создала в Марсельском университете программу Prolog, предназначенную для доказательства теорем, которая использовалась при построении систем обработки текстов на естественном языке и которая послужила прообразом Пролога. Большое значение для развития логического программирования имела работа Роберта Ковальского "Логика предикатов как язык программирования", в которой он показал, что для того чтобы добиться эффективности, нужно ограничиться использованием множества хорновских дизъюнктов. В 1976 г. Ковальский вместе с его коллегой Маартеном ван Эмденом предложил два подхода к прочтению текстов логических программ: процедурный и декларативный. В 1977 году в Эдинбурге Уоррен и Перейра создали очень эффективный компилятор языка Пролог для ЭВМ DEC–10 (реализация Пролога, известная как "эдинбургская версия", фактически стала первым и единственным стандартом языка), который послужил прототипом для многих последующих реализаций Пролога. В 1980 году Кларк и Маккейб в Великобритании разработали версию Пролога для персональных ЭВМ. На сегодня существует довольно много реализаций Пролога, как коммерческих, так и свободно распространяемых (BinProlog, AMZI-Prolog, Arity Prolog, CProlog, Micro Prolog, МПролог, Prolog-2, Quintus Prolog, SICTUS Prolog). 1 Будем ориентироваться на PDC Prolog, возможностей которого вполне достаточно для первоначального знакомства с основами языка Пролог. Эта версия языка Пролог доступна для свободного использования пользователями ОС Windows. В 1990 PDC получила монопольное право на Турбо Пролог и продвигала его под названием PDC Prolog. В 1992 вышла версия PDC Prolog 3.31. В 1996, при участии группы питерских программистов, Prolog Development Center выпустила систему Visual Prolog 4.0. Пролог ориентирован на задачи, связанные с разработкой систем ИИ. Он используется для обработки ЕЯ и обладает мощными средствами для работы с БД, причем методы поиска в Прологе принципиально отличаются от традиционных (сопоставление с образцом, вывод с поиском и возвратом). Для хранения данных в Прологе используются списки, а не массивы. В языке отсутствуют операторы присваивания и безусловного перехода, указатели. Естественным и зачастую единственным методом программирования является рекурсия. При этом он не является универсальным языком программирования и не предназначен, например, для решения задач, связанных с графикой или численными методами. Основные области применения Пролога: быстрая разработка прототипов прикладных программ; автоматический перевод с одного языка на другой; создание естественно-языковых интерфейсов для существующих систем; символьные вычисления для решения уравнений, дифференцирования и интегрирования; проектирование динамических реляционных баз данных; экспертные системы и оболочки экспертных систем; автоматизированное управление производственными процессами; автоматическое доказательство теорем; полуавтоматическое составление расписаний; системы автоматизированного проектирования; базирующееся на знаниях программное обеспечение; организация сервера знаний, к которому может обращаться клиентское приложение, написанное на каком-либо языке программирования. 2 Программа на языке Пролог (ее иногда называют БЗ), состоит из предложений (или утверждений), каждое предложение заканчивается точкой. Предложения бывают двух видов: факты (БД), правила. Предложение имеет вид A:B1,... , Bn. A называется заголовком или головой предложения, а B1,..., Bn - телом. Факт констатирует, что между объектами выполнено некоторое отношение. Он состоит только из заголовка. Можно считать, что факт - это предложение с пустым телом. Факт представляет собой безусловно истинное утверждение. Например, известный нам факт, что Наташа является мамой Даши, может быть записан в виде: мама(Наташа, Даша). В Турбо Прологе предложения с одним и тем же предикатом в заголовке должны идти одно за другим. Такая совокупность предложений называется процедурой. Правило - это предложение, истинность которого зависит от истинности одного или нескольких предложений. Обычно правило содержит несколько целей, которые должны быть истинными для того, чтобы правило было истинным. Пример. Бабушка человека - это мама его мамы или мама его папы. бабушка(X,Y):мама(X,Z),мама(Z,Y). бабушка(X,Y):мама(X,Z),папа(Z,Y). Символ ":-" означает "если", и вместо него можно писать if. Символ "," - это конъюнкция, вместо него можно писать and. В примере X, Y и Z - переменные. Переменные в теле правила неявно связаны квантором всеобщности. Переменные могут быть свободными или связанными. Свободная (неконкретизированная) переменная - это переменная, которая еще не получила значения. Переменная, которая получила какое-то значение и оказалась связанной с определенным объектом, называется связанной и она уже не может быть изменена. Областью действия переменной в Прологе является одно предложение. В разных предложениях может использоваться одно имя переменной для обозначения разных объектов. Исключением является анонимная переменная, которая обозначается символом подчеркивания "_". Третьим специфическим видом предложений Пролога можно считать вопросы. Вопросы используют для выяснения выполнимости некоторого отношения между описанными в программе объектами. Система рассматривает вопрос 3 как цель, к которой надо стремиться. Ответ на вопрос может оказаться положительным ("Yes" и если в вопросе содержатся переменные, то система выдает их значения) или отрицательным ("No solution" или "No"), в зависимости от того, может ли быть достигнута соответствующая цель. Программа на Прологе может содержать вопрос в программе (так называемая внутренняя цель). Если программа содержит внутреннюю цель, то после запуска программы система проверяет достижимость заданной цели. Если внутренней цели в программе нет, то после запуска программы система выдает приглашение вводить вопросы в диалоговом режиме (внешняя цель). Рассмотрим несколько примеров. Пусть заданы следующие отношения: мама("Наташа","Даша"). мама("Даша","Маша"). Можно спросить у системы, является ли Наташа мамой Даши. Этот вопрос можно ввести в виде: мама("Наташа","Даша") Найдя соответствующий факт, система ответит "Yes" ("Да"). Можно найти имена всех известных системе мам и дочек, задав вопрос: мама(X,Y). Система последовательно будет пытаться согласовывать вопрос с имеющимися в программе предложениями от первого до последнего. В итоге получим ответ: X=Наташа Y=Даша X=Даша Y=Маша 2 solutions Если надо получить только имена всех мам, можно воспользоваться анонимной переменной и записать вопрос: мама(X,_). Получим ответ: X=Наташа X=Даша 2 solutions И, наконец, если надо получить ответ на вопрос: есть ли информация о людях, находящихся в отношении "мама - дочка", то его можно сформулировать в виде: мама(_,_), В данном случае нам не важны конкретные имена, а интересует, есть ли в БЗ хотя бы один соответствующий факт. Ответ в данном случае будет "Yes". 4