У каждого из языков программирования есть свой круг задач, при решении которых он используется с наибольшей эффективностью. Для Пролога это задачи, связанные с разработкой систем искусственного интеллекта (различные экспертные системы, программы-переводчики, интеллектуальные игры). Пролог является декларативным языком программирования: логика программы выражается в терминах отношений, представленных в виде фактов и правил. Он обладает мощными средствами, позволяющими извлекать информацию из баз данных, причем методы поиска, используемые в нем, принципиально отличаются от традиционных.
Пролог нашел применение и в ряде других областей, например, при решении задач составления сложных расписаний. При этом он не является универсальным языком программирования и не предназначен, например, для решения задач, связанных с графикой или численными методами.
Теми, кто только начинает изучать программирование, Пролог легко осваивается. Практически полное отсутствие синтаксических конструкций, таких как ветвления, циклы и т.д. также влияет на скорость освоения языка. Кроме того, программирование на Прологе упорядочивает мышление и позволяет человеку, изучающему этот язык программирования, лучше разобраться в своей мыслительной деятельности. Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. На языке Пролог эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил.
Целью моей работы является демонстрация возможностей языка Пролог при решении логических задач.
Создание логического программирования можно приписать Ковальскому и Колмероэ. Логическое программирование возникло главным образом благодаря успехам в автоматическом доказательстве теорем, в частности благодаря разработке принципа резолюции. Одно из первых исследований, связывающих резолюцию с программированием для ЭВМ, было предпринято Грином. Общая идея, состоящая в рассмотрении логических предложений как операторов в программах, а управляемого вывода – как исполнения программ, была исследована Хайсом, Сандвеллом и другими. Однако осознанию того, что логика является исполняемым языком программирования, в особенности способствовала процедурная интерпретация Ковальского.
Основная цель логического программирования – создать возможность разработки программ на языке высокого уровня. В идеале в программе должны записываться аксиомы, определяющие требуемые отношения, причем игнорируя, каким образом эти аксиомы будут использоваться в процессе выполнения.
Язык Пролог является представителем семейства языков логического программирования. Пролог основан на теории предикатов первого порядка. Фактически, Пролог, это не язык для программирования, а язык для описания данных и логики их обработки. Базовый принцип языка – декларативность, т.е. равнозначность представления данных. Утверждения, записанные в Прологе, это одновременно и записи, и правила, которые содержат способы обработки данных.
В сравнении с традиционными языками программирования, предназначенными для записи алгоритмов, такими как Бейсик, Фортран, Паскаль, Си, обладает существенными особенностями:
• программа на Прологе не является алгоритмом, а представляет собой запись условия задачи на языке формальной логики (т.е. это дескриптивный, описательный язык программирования);
• язык Пролог предназначен не для решения вычислительных или графических задач, а для решения логических задач, для моделирования процесса логического умозаключения человека; вычисления же и графические построения выполняются в Прологе как побочный продукт логического вывода;
• Пролог требует особого стиля мышления программиста, что затрудняет изучение его теми, кто уже привык к процедурному программированию; однако во многих странах (Японии, Англии, Франции, Германии, Израиле и т.д.) расширяется практика применения Пролога в образовании как первого изучаемого языка программирования; переход к процедурным языкам типа Паскаля в этом случае трудностей не вызывает.
Логическая программа на языке Пролог представляет собой набор утверждений, фактов и (возможно) правил в рамках формальной логики. Если программа содержит только факты, то ее называют база данных. Если она содержит еще и правила, то часто используют термин база знаний.
При работе с Прологом мы описываем ситуацию (правила и факты) и формулируем цель (запрос), позволяя интерпретатору найти решение задачи за нас. Под интерпретатором в языке понимают механизм решения задачи при помощи языка Пролог. Другими словами, интерпретатор языка - это исполнитель Пролог-программ, т. е. та "активная сила", которая выполняет программы, написанные на Прологе.
Работа в Прологе состоит из следующих этапов:
объявление фактов об объектах и отношениях между ними;
определение правил взаимосвязи объектов и отношений между ними;
формулировка вопроса об объектах и отношениях между ними.
Программировать на Прологе - значит описывать некий мир. Программа на этом языке состоит из множества фраз, задающих взаимосвязь между объектами. Каждый объект обозначает ту или иную сущность, принадлежащую миру. Один из способов описания - это задание фактов.
Факт - это утверждение о том, что соблюдается некоторое конкретное отношение. Он является безусловно верным. Факты в программе всегда истинны, доказывать их не нужно. Они служат основой при выполнении программы.
Например, "Завтра понедельник" или "Пете 13 лет". На Прологе это запишется в виде:
"Завтра понедельник".
"Пете 13 лет".
Теперь зададим вопросы интерпретатору Пролога, например:
?- "Завтра понедельник".
Yes
?- "Пете 13 лет".
Yes
?- "Завтра понедельник", "Пете 13 лет".
Yes
Запятая между фактами в последнем запросе означает операцию логического умножения (конъюнкцию). Такая форма записи соответствует логике высказываний, возможности которой, как уже говорилось, достаточно ограничены. Мы не можем задать, например, вопрос о том, сколько лет Пете. Естественно, гораздо удобнее использовать факты с параметрами, работу с которыми поддерживает логика предикатов. На Прологе факт может быть записан в виде предиката, аргументы которого являются символьными или числовыми константами.
В общем случае предикат - это логическая функция от одного или нескольких аргументов, задающая отношения между этими аргументами. Другими словами, предикат это функция, действующая во множество из двух значений: истина и ложь. Предикат Пролога записывается в виде составного объекта:
имя_предиката(аргументы).
Аргументы перечисляются через запятую и представляют собой какие-то объекты или свойства объектов, а имя предиката обозначает связь или отношение между аргументами. Предикат однозначно определяется парой: имя и количество аргументов. Два предиката с одинаковым именем, но различным количеством аргументов, считаются различными. Количество параметров предиката называется его арностью. Как правило, имена предикатов и аргументов записываются в именительном падеже. Пробелы в них не допускаются, поэтому в качестве разделителей в символьных константах используется символ подчеркивания.
Пример. Факт "Маша купила конфету" на Прологе запишется следующим образом:
купила(маша, конфета).
Здесь предикат «купила» имеет два аргумента: первый означает имя человека, а второй – предмет покупки. Факт "Пете 13 лет" можно представить в виде:
возраст("Петя", 13).
Порядок аргументов предиката связан со смыслом факта и поэтому не изменяем. При записи фактов надо помнить, что:
имя факта начинается со строчной буквы;
запись каждого факта заканчивается точкой.
Все факты в прологе складываются в базы данных. База данных на Прологе - это совокупность фактов. В процессе работы в базу данных можно добавлять новые факты, удалять или изменять старые.
Кроме фактов в Прологе существуют правила, позволяющие получать дополнительные знания о том мире, который описывает программа. Правило задает новый предикат через определенные ранее.
Правило состоит из головы (предиката) и тела (последовательности предикатов, разделенных запятыми). Голова и тело разделены знаком " :- " (если) и, подобно каждой фразе Пролога, правило должно заканчиваться точкой. Запятая в теле правила означает конъюнкцию (&&, логическое и).
Интуитивный смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если Пролог сможет показать, что все выражения (подцели) в теле правила являются истинными.
Пример. Правило, определяющее отношение «ниже» через отношение «выше», запишется следующим образом:
ниже(X, Y) :- выше(Y, X).
Это означает, что если человек Y выше человека X, то X выше Y. Здесь X и Y - переменные.
Задача 1. Дана база данных «Дни Рождения». Составить следующие запросы: Кто родился в 2001 году? У кого день рождения 6 числа? Когда день рождения у Антона? Есть ли у кого-то день рождения в ноябре? Есть ли у кого-то день рождения в апреле?
predicates
день_рождения(symbol,symbol,integer,symbol,integer)
clauses
день_рождения("Антон","Грозный",22,"август",2000).
день_рождения("Миша","Петров",6,"апрель",2001).
день_рождения("Коля","Иванов",1,"сентябрь",2002).
день_рождения("Дима","Орлов",6,"апрель",2001).
день_рождения("Аня","Родина",31,"деабрь",2003).
День_рождения("Петя","Виноградов",20,"март",1994).
goal
%день_рождения(Имя,Фамилия,_,_,2001). %Кто родился в 2001 году?
%день_рождения(Имя,Фамилия,6,_,_). %У кого день рождения 6 числа?
%день_рождения("Антон",Фамилия,День,Месяц,Год).%Когда день рождения у Антона?
%день_рождения(_,_,_,"ноябрь",_). %Есть ли дни рождения в ноябре?
день_рождения(_,_,_,"апрель",_). %Есть ли дни рождения в апреле?
Задача 2. База данных “Колобок”: ушел(колобок,дедушка), ушел(колобок, бабушка), ушел(колобок, заяц), ушел(колобок, волк), ушел(колобок, медведь), не_ушел(колобок, лиса). Сформулировать вопросы на Прологе:Кто ушел от волка? Кто не ушел от лисы? Кто ушел от волка и от бабушки? Какой следует задать вопрос, чтобы узнать всех персонажей сказки?
predicates
ушел(symbol,symbol)
не_ушел(symbol,symbol)
clauses
ушел("Колобок","Дедушка").
ушел("Колобок","Бабушка").
ушел("Колобок","Заяц").
ушел("Колобок","Волк").
ушел("Колобок","Медведь").
не_ушел("Колобок","Лиса").
goal
%ушел(Кто,"Волк"). %Кто ушел от волка?
%не_ушел(Кто,"Лиса"). %Кто не ушел от лисы?
%ушел("Колобок",От_Кого). %От кого ушел колобок?
Задача 3. База данных “Режим дня”: занятие(00.00, 7.30, сон), занятие(7.30, 8.00, завтрак), занятие(8.00, 13.00, школа), занятие(13.00, 14.00, обед), занятие(14.00, 19.00, прогулка), занятие(19.00, 20.00, ужин), занятие(20.00, 22.00, отдых), занятие(22.00, 24.00, сон). Сформулировать вопросы на Прологе: Когда бывает обед? Что бывает между 14 и 19 часами? Когда бывает сон?
predicates
распорядок_дня(integer,integer,symbol)
clauses
распорядок_дня(0,7,"сон").
распорядок_дня(7,8,"завтрак").
распорядок_дня(8,13,"школа").
распорядок_дня(13,14,"обед").
распорядок_дня(14,16,"уроки").
распорядок_дня(16,18,"свободное время").
распорядок_дня(18,19,"ужин").
распорядок_дня(19,21,"свободное время").
распорядок_дня(21,24,"сон").
goal
%распорядок_дня(Начало,Конец,"обед"). %Когда бывает обед?
%распорядок_дня(Начало,Конец,Действие),Начало>=14,Конец