Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Предисловие

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

Язык Пролог возвестил о начале новой эры в программировании. Он ориентирован не на разработку решений, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В настоящее время в программировании наметился переход от поиска решения задачи к определению того, какое решение требуется. Пролог является существенным шагом в этом направлении. Мы надеемся, что читатели разделят наши взгля­ды в данной области науки о программировании. Надеемся, что чте­ние этой книги доставит вам удовольствие.

Глава 1 Введение в Пролог

Пролог существенно отличается от языков, традиционно исполь­зуемых в программировании. В языках Бейсик, Алгол и Паскаль ос­новным методом программирования является разбиение задачи на ди­скретные шаги и их последовательное описание. Последовательность шагов отображается в машинные команды, выполняемые компьюте­ром. Отменить ранее выполненные команды невозможно, поскольку содержимое памяти постоянно обновляется. Языки программирова­ния такого вида называются алгоритмическими. Алгоритм - математическая процедура, которая позволяет решить задачу за конечное число шагов. Пролог не относится к алгоритмическим языкам.

Свое название Пролог получил от слов «ПРОграммирование на языке ЛОГики». На самом деле Пролог не считается чистым языком логического программирования, но его создание - важный этап в этом направлении.

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

Пролог был принят в качестве базового языка в японской про­грамме создания ЭВМ пятого поколения, ориентированной на иссле­дование методов логического программирования и искусственного интеллекта, а также на разработку нового поколения компьютеров, специально предназначенных для реализации данных методов.

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

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

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

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

В сущности, после завершения работы программы на Прологе (до­казательства цели) могут возникнуть только два состояния: «доказа­но» и «не доказано». Иногда они называются соответственно «истинно» и «ложно». Мы не будем употреблять термины «истинно» и «ложно», поскольку они определяют смысл результата. Доказанное утвержде­ние обычно является истинным, но не обязательно, так как доказа­тельство зависит от известных фактов и сделанных на их основе выво­дов. Итак, мы ввели два новых термина. Факт есть некоторое утверж­дение; все факты определяются как доказанные. В частности, факт «рекс - это собака» считается доказанным по определению. Но такой запрос к факту, как «Является ли феликс собакой ?», не будет доказан с помощью известных фактов. Отрицательный ответ системы Пролог означает вовсе не то, что утверждение «феликс - собака» ложно, а лишь то, что у нас нет фактов о «феликсе» и о том, является ли он соба­кой. Другим термином, который мы использовали, был вывод. Имея множество фактов, мы можем определять новые свойства описанных в них объектов. Иными словами, допускается вывод свойств из фактов. Вернемся к факту «рекс - это собака». Предположим, мы хотим на ос­нове известных фактов выявить все объекты, обладающие свойством «быть собакой». Задав вопрос «Какие существа являются собаками?», получим ответ: «Рекс - это собака». Мы привели тривиальный пример вывода. Введем некоторую дополнительную информацию.

«рекс - это собака» : факт

«голди является родителем рекса» : факт

«джок является родителем рекса» : факт

«объект является собакой при условии, что он является родителем собаки»

Первые три элемента данных представляют собой факты, четвер­тый элемент - формализованный вывод, называемый правилом. Теперь, если мы спросим: «Какие объекты являются собаками ?», то получим ответ, что «рекс», «голди» и «джок» - собаки, причем «рекс» является собакой по определению, а «голди» и «джок» - вследствие вывода. Они должны быть собаками как родители собаки. В этом и заключается основное различие между алгоритмическим и логиче­ским мышлением. Если сформулировать приведенный выше запрос в алгоритмических терминах, то получится весьма сложное определе­ние:

Объект является собакой в том случае,

если он имеет свойство «быть собакой» или же имеет

свойство «быть родителем» и существует объект,

связанный с родителем и обладающий свойством

«быть собакой».

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

В приводимой ниже программе прежде всего описывается инфор­мация, относящаяся к «рексу», «голди» и «джоку», а затем перечис­ляются объекты, являющиеся собаками по определению и вследствие вывода.

program являтьсяСобакой(Іприt, output);

type

строка = packed array [1..6] of char;

{Определить символы}

символ = (рекс.голди.джок);

{Определить виды информации}

информация = (собакаИнф,родительИнф);

объект = record

case инф: информация of

родительИнф: (родительЧей-либо: символ);

собакаИнф: (являтьсяСобакой: логический);

end {record};

var

дачные : array [символ] of объект;

имя : array [символ] of строка;

Х : символ;

{Эта функция будет возвращать значение «истина»,

если объект является собакой}

function собака (X: объект) : логический;

begin

if Х.инф = собакаИнф

then собака := Х.являтьсяСобакой

else

собака := собака (данные [Х.родительЧей-либо];

end;

begin

{Установить имена объектов}

имя [рекс] := рекс;

имя [голди] := голди;

имя [джок] := джок;

{Установить информацию для рекса}

with данные [рекс] do

begin

инф := собакаИнф;

являтьсяСобакой := истина; {рекс - это собака}

end;

{Установить информацию для голди}

with данные [голди] do

begin

инф := родительИнф;

родитель := рекс;

{голди является родителем рекса}

end;

{джок имеет те же свойства, что и голди}

данные [джок] := данные [голди];

{Теперь напечатаем имена объектов, обладающих

свойством быть собакой по определению или

вследствие вывода}

for Х := рекс to джок do

if собака (данные [X]) then

печататьСтроку (имя [X]);

end;

При написании программы пришлось много заниматься вопроса­ми, не связанными непосредственно с решением задачи «Какие объ­екты являются собаками ?». Надо было определить типы данных, со­здать данные, в которых должна храниться информация, и устано­вить их значения. Имея факты и выводы, мы должны были запрог­раммировать, как отвечать на вопрос «Какие объекты являются соба­ками ?». Только тогда программа давала ответ.

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

Какие собаки имеют родителей ?

Кто является родителем рекса ?

Кто является родителем ?

Для того чтобы представить, как решается на Прологе задача «Какие объекты являются собаками?», приведем фрагмент програм­мы. Он позволит понять различие между программированием на Прологе и алгоритмическим программированием.

На Прологе задача описывается следующим образом:

/* факт «рекс - это собака»:

собака (рекс).

/* вывод «объект является собакой, если он

/* является родителем объекта Y, являющегося

/* собакой

собака(Х) :- родитель (Х,У),собака(У).

/* факт «голди является родителем рекса»

родитель(голди.рекс).

/* факт «джок является родителем рекса»

родитель(джок,рекс).

Данная программа на Прологе определяет свойства «быть соба­кой» и «быть родителем». (После знака /* записаны комментарии.)

Теперь, если мы хотим узнать, какие объекты являются собака­ми, то должны спросить:

?- собака (Кто).

Используемый нами синтаксис Пролога подробно будет опреде­лен позже. Пока примем, что каждый элемент, записанный строчны­ми буквами, есть литерал. Он представляет объект и не может быть изменен. Каждое слово, начинающееся с прописной буквы (напри­мер, X, Y, Кто), является переменной. Во время выполнения про­граммы переменным присваиваются значения. Символ ?- означает попытку согласовать, т.е. доказать следующую за ним цель (собака(Кто) является целью).

Мы определили, что рекс - это собака. Некоторый Х является со­бакой (X называется именованной переменной) при условии, что Х является родителем Y (другой свободной именованной переменной) и Y является собакой. Мы задали также условия, что голди - это ро­дитель рекса и джок - это родитель рекса.

Запрос

?-собака (Кто). /*Кто - именованная свободная

/*переменная

выполняется следующим образом: Пролог-система просматривает программу с начала и ищет ответ на вопрос: «Какое значение должна принять свободная переменная Кто, если мы хотим доказать цель

собака (Кто) ?-".

Прослеживая программу с начала, мы видим, что если пере­менная Кто получит значение рекс, то целевое утверждение будет согласовано. Итак, переменная Кто принимает значение рекс, и цель становится доказанной. В ответ на наш вопрос будет напеча­тано:

Кто = рекс

Затем Пролог-система спросит, хотим ли мы получить другие от­веты. Допустим, мы отвечаем «да»

другие решения (да/нет)? да

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

При каком же значении переменной Кто цель будет согласована? Заметим, что переменная Кто сцеплена со свободной переменной X, стоящей в голове второго утверждения собака - собака (X). Особен­ность работы Пролога проявляется при сопоставлении объектов собака(Кто) и собака(Х): свободные переменные Х и Кто занимают один и тот же участок памяти. Поэтому, когда Х принимает некото­рое значение, одновременно и Кто принимает то же самое значение. Подробнее данный вопрос будет раскрыт позже. Пока будем просто считать, что Х и Кто - лишь различные имена для одного и того же объекта.

Теперь мы подошли к утверждению «при условии, что». «Объ­ект является собакой при условии, что он является родителем ко­го-то и этот кто-то является собакой.» На Прологе утверждение за­писывается следующим образом: за головной целью собака (X) сле­дует символ «:-», означающий «при условии, что», а за ним конъ­юнкция целей. Конъюнкция в Прологе обозначается символом «,». Так, родитель(Х,У),собака(У) есть конъюнкция (логическое И) цели родитель(Х,У) и цели собака(У). Конъюнкция - важное по­нятие в Прологе, и мы не случайно обращаем на нее внимание. В Прологе существует также дизъюнкция, обозначаемая символом «;» и означающая «цель1 или цель2». Ниже мы детально разберем введенные понятия, а сейчас рассмотрим программы на Прологе. Чтобы согласовать цель собака (X), нужно согласовать цели роди­тель(X, Y) и собака (Y).

При доказательстве цели родитель(X,Y) Пролог сопоставляет цель с первым фактом, относящимся к родителям, а именно, с родитель(голди,рекс). Переменные получают значения Х=голди и Y=peкc. Поскольку Х сцеплена с переменной Кто и Х получает значение голди, переменная Кто тоже становится равной голди.

Присваивания значения переменным еще недостаточно; мы дол­жны также согласовать цель собака(Y), которая теперь эквивалент­на собака(реке). Такое утверждение найдено, и цель родитель(Х,У) согласуется при Х=голди и У=рекс. Таким образом, цель соба­ка(Кто) повторно согласована при

Кто=голди.

Как и раньше, Пролог спрашивает, хотим ли мы получить другие решения. Ответим «да».

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

Кто=джок

И вновь на вопрос системы: «Хотите ли вы получить другие ре­шения ?», ответим «да». На этот раз все возможные варианты исчер­паны, и Пролог посылает сообщение:

Других решении нет.

Ответ означает не то, что не существует других вариантов, а то, что Пролог не может их получить исходя из введенной информации.

Напомним, что после разбора программы на Паскале были при­ведены дополнительные вопросы:

Какие собаки имеют родителей ?

Кто является родителем рекса ?

Кто является родителем ?

Для их обработки в Прологе нет необходимости вносить измене­ния в программу. Мы просто вводим запросы:

?- родитель(_, Потомок).

?- родитель(Родитель,ре噫с).

?- родитель(Родитель,_).

Пролог просматривает базу данных и ищет решения описанным выше способом.

Теперь, когда мы рассмотрели пример программы на Прологе и соответствующую программу на Паскале, надеемся, вы убедились, что для задач данного класса программирование на Прологе значи­тельно легче. Мы дали только предварительные сведения о Прологе; в последующих главах будут описаны его синтаксис и семантика.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]