Язык Пролог Пролог (Prolog)

advertisement
Язык Пролог
Пролог (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
Download