ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОЛОГ ДЛЯ РЕШЕНИЯ ЛОГИЧЕСКИХ ЗАДАЧ - Студенческий научный форум

VII Международная студенческая научная конференция Студенческий научный форум - 2015

ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОЛОГ ДЛЯ РЕШЕНИЯ ЛОГИЧЕСКИХ ЗАДАЧ

Федорова А.А. 1
1Московский государственный областной социально-гуманитарный институт факультет математики, физики, химии, информатикиМосковский государственный областной социально-гуманитарный институт факультет математики, физики, химии, информатики
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Пролог (Prolog, программирование в логике) - один из наиболее широко используемых языков логического программирования.

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

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

Теми, кто только начинает изучать программирование, Пролог легко осваивается. Практически полное отсутствие синтаксических конструкций, таких как ветвления, циклы и т.д. также влияет на скорость освоения языка. Кроме того, программирование на Прологе упорядочивает мышление и позволяет человеку, изучающему этот язык программирования, лучше разобраться в своей мыслительной деятельности. Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. На языке Пролог эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил.

Целью моей работы является демонстрация возможностей языка Пролог при решении логических задач.

Создание логического программирования можно приписать Ковальскому и Колмероэ. Логическое программирование возникло главным образом благодаря успехам в автоматическом доказательстве теорем, в частности благодаря разработке принципа резолюции. Одно из первых исследований, связывающих резолюцию с программированием для ЭВМ, было предпринято Грином. Общая идея, состоящая в рассмотрении логических предложений как операторов в программах, а управляемого вывода – как исполнения программ, была исследована Хайсом, Сандвеллом и другими. Однако осознанию того, что логика является исполняемым языком программирования, в особенности способствовала процедурная интерпретация Ковальского.

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

Язык Пролог является представителем семейства языков логического программирования. Пролог основан на теории предикатов первого порядка. Фактически, Пролог, это не язык для программирования, а язык для описания данных и логики их обработки. Базовый принцип языка – декларативность, т.е. равнозначность представления данных. Утверждения, записанные в Прологе, это одновременно и записи, и правила, которые содержат способы обработки данных.

В сравнении с традиционными языками программирования, предназначенными для записи алгоритмов, такими как Бейсик, Фортран, Паскаль, Си, обладает существенными особенностями:

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

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

• Пролог требует особого стиля мышления программиста, что затрудняет изучение его теми, кто уже привык к процедурному программированию; однако во многих странах (Японии, Англии, Франции, Германии, Израиле и т.д.) расширяется практика применения Пролога в образовании как первого изучаемого языка программирования; переход к процедурным языкам типа Паскаля в этом случае трудностей не вызывает.

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

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

Работа в Прологе состоит из следующих этапов:

  1. объявление фактов об объектах и отношениях между ними;

  2. определение правил взаимосвязи объектов и отношений между ними;

  3. формулировка вопроса об объектах и отношениях между ними.

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

Факт - это утверждение о том, что соблюдается некоторое конкретное отношение. Он является безусловно верным. Факты в программе всегда истинны, доказывать их не нужно. Они служат основой при выполнении программы.

Например, "Завтра понедельник" или "Пете 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,Конец

Просмотров работы: 6305