Аннотация: История возникновения и развития Пролога. Японский проект ЭВМ пятого поколения. Императивные и декларативные языки программирования. Области использования Пролога. Пролог — язык начального обучения программированию.
Преимущества и недостатки языка Пролог.
На протяжении многих тысячелетий человечество занимается накоплением, обработкой и передачей знаний. Для этих целей непрерывно изобретаются новые средства и совершенствуются старые: речь, письменность, почта , телеграф, телефон и т. д. Большую роль в технологии обработки знаний сыграло появление компьютеров.
В октябре 1981 года Японское министерство международной торговли и промышленности объявило о создании исследовательской организации — Института по разработке методов создания компьютеров нового поколения (Institute for New Generation Computer Technology Research Center ). Целью данного проекта было создание систем обработки информации, базирующихся на знаниях. Предполагалось, что эти системы будут обеспечивать простоту управления за счет возможности общения с пользователями при помощи естественного языка. Эти системы должны были самообучаться, использовать накапливаемые в памяти знания для решения различного рода задач, предоставлять пользователям экспертные консультации, причем от пользователя не требовалось быть специалистом в информатике. Предполагалось, что человек сможет использовать ЭВМ пятого поколения так же легко, как любые бытовые электроприборы типа телевизора, магнитофона и пылесоса. Вскоре вслед за японским стартовали американский и европейский проекты.
Пролог — попытка объяснить без программирования
Появление таких систем могло бы изменить технологии за счет использования баз знаний и экспертных систем. Основная суть качественного перехода к пятому поколению ЭВМ заключалась в переходе от обработки данных к обработке знаний. Японцы надеялись, что им удастся не подстраивать мышление человека под принципы функционирования компьютеров, а приблизить работу компьютера к тому, как мыслит человек, отойдя при этом от фон неймановской архитектуры компьютеров. В 1991 году предполагалось создать первый прототип компьютеров пятого поколения.
Теперь уже понятно, что поставленные цели в полной мере так и не были достигнуты, однако этот проект послужил импульсом к развитию нового витка исследований в области искусственного интеллекта и вызвал взрыв интереса к логическому программированию. Так как для эффективной реализации традиционная фон неймановская архитектура не подходила, были созданы специализированные компьютеры логического программирования PSI и PIM .
В качестве основной методологии разработки программных средств для проекта ЭВМ пятого поколения было избрано логическое программирование , ярким представителем которого является язык Пролог . Думается, что и в настоящее время Пролог остается наиболее популярным языком искусственного интеллекта в Японии и Европе (в США, традиционно, более распространен другой язык искусственного интеллекта —язык функционального программирования Лисп ).
Что за язык программирования Пролог такой? Душкин объяснит
Название языка «Пролог» происходит от слов ЛОГическое ПРОграммирование (PROgrammation en LOGique во французском варианте и PROgramming in LOGic — в английском).
Пролог основывается на таком разделе математической логики, как исчисление предикатов . Точнее, его базис составляет процедура доказательства теорем методом резолюции для хорновских дизъюнктов . Этой теме будет посвящена следующая лекция.
В истории возникновения и развития языка Пролог можно выделить следующие этапы.
В 1965 году в работе «A machine oriented logic based on the resolution principle», опубликованной в 12 номере журнала » Journal of the ACM «, Дж Робинсон представил метод автоматического поиска доказательства теорем в исчислении предикатов первого порядка, получивший название » принцип резолюции «. Эту работу можно прочитать в переводе: Робинсон Дж. Машинно-ориентированная логика, основанная на принципе резолюции // Кибернетический сборник. — Вып. 7 (1970). На самом деле, идея данного метода была предложена Эрбраном в 1931 году, когда еще не было компьютеров (Herbrand, «Une methode de demonstration «, These, Paris, 1931). Робинсон модифицировал этот метод так, что он стал пригоден для автоматического, компьютерного использования, и, кроме того, разработал эффективный алгоритм унификации, составляющий базис его метода.
В 1973 году » группа искусственного интеллекта» во главе с Аланом Колмероэ создала в Марсельском университете программу, предназначенную для доказательства теорем. Эта программа использовалась при построении систем обработки текстов на естественном языке. Программа доказательства теорем получила название Prolog (от Programmation en Logique). Она и послужила прообразом Пролога.
Ходят легенды, что автором этого названия была жена Алана Колмероэ. Программа была написана на Фортране и работала довольно медленно.
Большое значение для развития логического программирования имела работа Роберта Ковальского » Логика предикатов как язык программирования » (Kowalski R. Predicate Logic as Programming Language . IFIP Congress, 1974), в которой он показал, что для того чтобы добиться эффективности, нужно ограничиться использованием множества хорновских дизъюнктов . Кстати, известно, что Ковальский и Колмероэ работали вместе в течение одного лета.
В 1976 г. Ковальский вместе с его коллегой Маартеном ван Эмденом предложил два подхода к прочтению текстов логических программ: процедурный и декларативный. Об этих подходах речь пойдет в третьей лекции.
В 1977 году в Эдинбурге Уоррен и Перейра создали очень эффективный компилятор языка Пролог для ЭВМ DEC–10, который послужил прототипом для многих последующих реализаций Пролога. Что интересно, компилятор был написан на самом Прологе. Эта реализация Пролога, известная как «эдинбургская версия», фактически стала первым и единственным стандартом языка.
Алгоритм , использованный при его реализации, послужил прототипом для многих последующих реализаций языка. Как правило, если современная Пролог -система и не поддерживает эдинбургский Пролог , то в ее состав входит подсистема, переводящая прологовскую программу в «эдинбургский» вид. Имеется, конечно, стандарт ISO/IEC 13211– 1:1995, но его поддерживают далеко не все Прологсистемы.
В 1980 году Кларк и Маккейб в Великобритании разработали версию Пролога для персональных ЭВМ.
В 1981 году стартовал вышеупомянутый проект Института по разработке методов создания компьютеров нового поколения.
На сегодня существует довольно много реализаций Пролога. Наиболее известные из них следующие: BinProlog, AMZI-Prolog, Arity Prolog, CProlog, Micro Prolog, МПролог, Prolog-2, Quintus Prolog, SICTUS Prolog, Silogic Knowledge Workbench , Strawberry Prolog, SWI Prolog, UNSW Prolog и т. д.
В нашей стране были разработаны такие версии Пролога как Пролог -Д (Сергей Григорьев), Акторный Пролог (Алексей Морозов), а также Флэнг (А Манцивода, Вячеслав Петухин).
Стерлинг и Шапиро в книге «Искусство программирования на языке Пролог » пишут: «Зрелость языка означает, что он больше не является доопределяемой и уточняемой научной концепцией, а становится реальным объектом со всеми присущими ему пороками и добродетелями. Настало время признать, что хотя Пролог и не достиг высоких целей логического программирования, но, тем не менее, является мощным, продуктивным и практически пригодным формализмом программирования».
Источник: intuit.ru
«Пролог» — язык программирования или основа искусственного интеллекта
Появление «Пролога» было обусловлено развитием логики, математики и программирования. Последнее сыграло самую существенную роль. Специалисты по логике и математике предприняли попытку поставить программирование на «правильный путь», но развитие информационных технологий показало совершенно другой результат.
Прагматичное императивное программирование оказалось перспективнее. «Пролог» как язык программирования состоялся, но основой для искусственного интеллекта не стал.
Классическое программирование против логики
Человек принимает сложные решения логично и обоснованно. Практически не задумываясь, человек поступает разумно. Если не брать в расчет решения, требующие сбора информации, ее анализа и сложных расчетов, то любой результат — это быстро, точно и обоснованно.
Этот факт всегда давал призрачное основание считать создание инструмента для принятия решений простым делом. С появлением «Пролога» казалось: вопрос искусственного интеллекта — дело техники, и человек разумный придумал три закона робототехники. Однако искусственный интеллект так и остался призраком, а три закона робототехники оказались из сказки — «сделай то, не знаю что».
Программирование в классическом значении этого слова (часто используют термины «процедурное», «императивное» или «функциональное») развивалось и успешно преодолело «смутные времена» 80-90-х годов, когда языков программирования было несчетное количество.
Показательная борьба между «Паскалем» и «Си» длилась долго, была жестокой, но закончилась нейтрально и тихо. Осталась идея хорошего языка программирования и несколько удачных ее реализаций.
Нельзя сказать, что «Пролог» как язык программирования не развивался. Но он не достиг обозначенных целей. Сегодня можно не только сказать, но и обосновать: «Пролог» — это академический язык для:
- целей обучения;
- логики предикатов;
- математики;
- узкого применения.
Сомнительно, что это утверждение можно опровергнуть. Искусственный интеллект — это не только широкое применение, но и слишком серьезное событие, кардинально меняющее общественное устройство и картину мира.
Программирование на языке «Пролог» для искусственного интеллекта не состоялось: за более чем сорокалетнюю историю языка не было ни одного кардинально нового, актуального для общественного сознания события, свидетельствующего об обратном.
Объективная реальность такова: выживает не столько сильнейшее, сколько востребованное и актуальное.
«Пролог» — язык декларативного программирования
Иметь инструмент описания фактов и правил — хорошо, но какой смысл? Факты и правила прекрасно ложатся в обычную базу данных. Квалифицированный классический программист предоставляет интерактивный диалог для пользователя, и последний решает свои задачи.
При необходимости программист дорабатывает диалог, а пользователь дополняет базу данных фактов и правил. Абсолютно рабочий и проверенный десятилетиями вариант реализации массы уже решенных и решаемых задач.
Декларативное изложение фактов и правил на любой реализации языка программирования «Пролог» — это условность, попытка формализовать реальность в ее интеллектуальном состоянии. Обычное программирование не трогает интеллект. Классическое программирование устраивает позиция: описание и обработка данных. Здесь есть масса проблем, но есть множество блестящих и работающих решений.
«Пролог» как язык программирования — это факты:
- мама (Мария, Наташа); — Мария — мама Наташи;
- папа (Евгений, Марина); — Евгений — папа Марины.
Здесь сразу за бортом оказывается факт: «Мария» и «Марина» — разные имена. Ничего не мешает дописать факт:
- папа (Евгений, Мария); — Евгений — папа Марии.
Эти описания дают жизнь правилам:
Но не позволяют сделать вывод, что папа — отец Марины, а Марина — мама Марии. Эта проблема решаемая, можно дописать еще одно правило, добавить еще один факт. Но сколько таких действий следует предпринять в реальной ситуации?
Фактически «Пролог» как язык программирования — пример декларации фактов и правил, но не логика, к которой привыкло сознание классического программиста. «Пролог» позиционирует себя как язык логики предикатов, но учиться программированию на нем можно только по примерам и образцам описаний от разработчиков конкретной реализации языка.
Семейство «Прологов»
Франция считается родиной «Пролога», а 1973 год — годом рождения. Интерес к языку периодически возобновлялся, но с завидной стабильностью затихал. Девиз языка: «Логика предикатов — это элементарно! Это способ объяснить, как работает мышление» — так и остался девизом.
Любая реализация языка программирования «Пролог» строго следовала логике предикатов, но всегда включала в себя классические идеи процедурного программирования. Правильнее сказать «императивного», поскольку этот термин употребляется с большей формальностью, чем процедурное, функциональное, объектно-ориентированное или иное.
Любое программирование — это данные и их обработка. Конструкции языка должны максимально точно описывать решаемую задачу, именно поэтому все известные реализации «Пролога»: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog и другие — содержат, помимо декларативных конструкций, обычные императивные выражения.
Считается, что семейство «Прологов» развивается в академических и научно-исследовательских организациях и поэтому как об общем языке можно говорить только в концептуальном смысле. Тем не менее сам факт, что концепция «Пролога» жива и развивается, можно считать: у этого языка есть область применения, и она востребована в определенном спектре задач.
Основа искусственного интеллекта
Интерес к искусственному интеллекту никогда не ослабевал, просто о нем начинают говорить, когда появляется очередной повод, но никогда «Пролог» не ассоциировался с искусственным интеллектом больше, чем обычный классический язык программирования.
В конце 80-х годов был реальный, актуальный и востребованный интеллектуальный проект «Изобретающая машина». Была реальная попытка применить «Пролог» для формализации огромной практичной базы знаний (данных) по изобретениям, физическим, химическим и иным закономерностям.
Результат не был достигнут, слишком много фактов и правил нужно было написать на «Прологе» как языке программирования, которые носят банальный императивный характер. Между тем параллельно была реализована масса успешных программных продуктов на обычных языках.
В начале 90-х годов был успешно реализован проект реальной интеллектуальной системы, моделирующей поведение ребенка в возрасте до 3-лет на языке ассемблер ЕС ЭВМ! Вариант использования «Пролога» даже не рассматривался.
Данная интеллектуальная система не только «соображала», что такое мама, папа, и чем отличается Мария от Марины, но и без особого напряжения самостоятельно перескочила с приобретенных знаний по этим вопросам к мячикам и их отличиям от кубиков, к цветам предметов и . (!) к элементарной математике: простые арифметические операции оказались ей по силам на основании знаний, приобретенных при решении совсем других задач.
Можно не утверждать, что классическое программирование опережает «Пролог» в части освоения территории искусственного интеллекта, но оно дает реальные результаты.
Что касается интеллекта как задачи — видимо, вопрос здесь лежит не в языке, а в идее реализации. Если ассемблер 1991 года смог «стать основой» для интеллектуальной системы ситуативного интеллекта, то вопрос явно лежит не в языке реализации, а в идее.
Источник: fb.ru
TurboProlog с нуля
Добрый день, мальчики и девочки, мужчины и женщины, дамы и господа.
Если Вы в первый раз столкнулись с необходимостью написать программу на Prolog, то это статья для Вас.
Prolog– это язык логического программирования, который отличается от стандартных языков императивного программирования (Pascal, Basic, С и т.д.), но он не так сложен в понимании, как может сначала показаться.
Первым делом нужно решить, какую систему логического программирования Вы будете использовать. Самая простая, созданная еще в далеких 80х, является TurboProlog.
Она похожа, например, на TurboPascal, TurboBasic. И если Вы встречались с такими компиляторами, то особых затруднений с TurboPrologне возникнет. Есть, конечно, более современные компиляторы, которые Вы можете использовать (Visual Prolog, Amzi! Prolog, ALS Prolog).
TurboPrologне запустится на ОС 64-bit . Поэтому придется искать альтернативные варианты.
Качаем нашу программу (например здесь ) и запускаем PROLOG.EXE.
Конечно же, забываем про мышь, всё управление на клавиатуре. При нажатии «Esc» происходит переключение в меню. Сначала у нас загружается пустой файл WORK.PRO.
Выберем Files ->Writetoи тем самым создадим новый файл со своим именем, например Prog.pro.Сохраняется файл в данном случае в той же папке, где находится программа TurboProlog, иначе нужно прописывать полный путь.
Для перехода в режим редактирования в меню выбираем Edit, «Enter», и можем творить.
Разбираем основы Prolog
Основные секции программы Prolog это — PREDICATES и CLAUSES .
Так же есть директивы:
CONSTANTS — раздел описания констант;
DOMAINS — раздел описания доменов;
DATABASE — раздел описания предикатов внутренней базы данных;
GOAL — раздел описания внутренней цели.
В секции DOMAINS объявляются домены, они подобны типам данных. Используется для удобства, при описании разных объектов с одинаковыми типами. Этот раздел можно опустить.
Стандартные типы Prolog:
integer— целое число
real— действительное число
string— последовательность символов типа char, которая заключена в кавычки
symbol— последовательность букв латинского алфавита, цифр и знаков подчеркивания, которая начинается со строчной буквы или заключена в кавычки.
name = symbol count = integer price = integer
В секции PREDICATES перечисляются объявления предикатов с их типами. По сути это похоже на прототипы функций в императивных языках. Мы задаем шаблоны для последующего определения фактов (истинных утверждений) и правил, то есть процедур над переменными.
sum(integer,integer) book(name, count, price) search(name) search(price, price)
Здесь можно увидеть удобство использования ранее объявленных доменов, все параметры наглядны. Без использования доменов выглядело бы так:
book(symbol, integer, integer) search(symbol) search(integer, integer)
Предикат может быть без перечисления доменов, например:
all_info
Заметьте, никаких символов в конце инструкций нет.
В секции CLAUSES помещаются факты и правила. Каждое предложение должно заканчиваться точкой.
Сначала мы задаем известные истинные утверждение.
Например предложение “Книга «Война и мир» имеется в 3 экземплярах, стоимость одной книги 50” , исходя из того, что есть предикат book(name, count, price)
факт будет выглядеть так:
book(«War and peace», 3, 50).
После задания фактов, задаем правила определения истинности задаваемого нами предложения, или просто последовательность каких-то действий.
Например, поиск книг по имени:
search(X):- book(X,C,P), write(«`», X, «`», » count: «, C, » price: «, P), nl.
X – приходящая переменная с типом name (symbol). С, P – локальные переменные, nl – переход на следующую строку.
Как происходит работа программы?
При задании целей используется директива GOAL , или если ее нет, цели задаются в диалоговом окне при запуске программы.
Например, задавая цель: search(“War and peace”) , происходит последовательная проверка по условиям, то есть всё, что стоит после CLAUSES.
- book(«War and peace», 3, 50). – не подходит
- search(X):- book(X,C,P), write(«`», X, «`», » count: «, C, » price: «, P), nl. – подходит.
- Вызывается book(«War and peace»,C,P), и заново происходит поиск с начала.
- book(«War and peace», 3, 50). – подходит
- В С попадает 3, а в P – 50.
- Наш вывод: ‘War and peace’ count: 3, price: 5
Вернемся к TurboProlog.
Напишем такую программу.
PREDICATES bird(symbol) parent(symbol,symbol) CLAUSES % Воробей – это птица. bird(sparrow). %X – это птица, если у него есть родитель, который является птицей. bird(X):–parent(Y,X), bird(Y). % Воробей – родитель птенца. parent(sparrow,nestling).
Теперь для запуска жмем «Esc», Run. И если Вы написали без ошибок, должны увидеть диалоговое окно.
И начинаем вводить наши данные, жмем «Enter» и программа на них отвечает либо Yes, либо No, или ошибку с ее описанием.
Так же запрашиваемые предложения можно писать в коде, после директивы GOAL , тогда при запуске будет сразу выводиться ответ.
Существуют еще анонимные переменные, которые задаются в виде нижнего подчеркивания _, то есть, это может быть всё что угодно. В данной программе при попадании в bird(X):–, предикат parent(Y,X) вызывается с анонимным параметром Y например, parent(_, pigeon). Это можно увидеть при трассировке.
Для отладки программы можно использовать трассировку. («Esc», Edit) Для этого в начале нашей программы напишем trace, запустим. Вводим предложение -> «Enter» ->F10.
Попадаем в наш код и проходим по нему с помощью F10 ,в нижнем правом углу выводятся данные трассировки.
Сообщения в окне трассировки могут быть следующими:
− CALL – вывод имени предиката и значений его параметров;
− FAIL – вывод имени неудачно завершившегося предиката;
− REDO – вывод сообщения о том, произведен поиск с возвратом;
− RETURN – вывод имени удачно завершившегося предиката и значений его параметров.
Не забываем сохранять: Files ->Save.
Для правильного выхода: Files ->Quit.
Ставим лайки, подписываемся на рассылку =)
Удачи в написании своих программ!
Автор статьи: Leomana. 04.2013
Источник: alexdev.ru