Язык программирования пролог реферат

Обновлено: 30.06.2024

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

В октябре 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", Дж Робинсон представил метод автоматического поиска доказательства теорем в исчислении предикатов первого порядка, получивший название "принцип резолюции". На самом деле, идея данного метода была предложена Эрбраном в 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 и т. д.

В нашей стране были разработаны такие версии Пролога как Пролог-Д (Сергей Григорьев), Акторный Пролог (Алексей Морозов), а также Флэнг (А. Манцивода, Вячеслав Петухин).

Стерлинг и Шапиро в книге "Искусство программирования на языке Пролог" пишут: "Зрелость языка означает, что он больше не является доопределяемой и уточняемой научной концепцией, а становится реальным объектом со всеми присущими ему пороками и добродетелями. Настало время признать, что хотя Пролог и не достиг высоких целей логического программирования, но, тем не менее, является мощным, продуктивным и практически пригодным формализмом программирования".

Раздел: Информатика, программирование
Количество знаков с пробелами: 44446
Количество таблиц: 1
Количество изображений: 1

История создания и основные этапы развития языка программирования Пролог. Источники создания программы: логика предикатов 1-го порядка, теория рекурсивных функций, методы логического вывода. Сущность констант и переменных. Отличия от Visual Prolog.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 29.10.2013
Размер файла 26,3 K

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Краткая характеристика языка Пролог

Язык программирования (ЯП) Пролог (PROgramming in LOGic) был реализован в начале 70-х годов Колмероэ в Марселе (Франция) на основе теоретической разработок, выполненных в Эдинбургском университете (Шотландия) Ковальским. Однако, широкое внимание к себе он привлек только после того как в 1977 году появилась его очень удачная версия для ЭВМ DEC-10, а затем Япония выбрала Пролог в качестве базового ЯП для своего проекта ЭВМ 5-го поколения, ориентированного на принципиально новую технологию использования компьютеров для работы со знаниями.

В традиционных ЯВУ описание задачи неотделимо от описания процесса ее решения. Все функции и отношения определяются указанием конкретного способа их вычисления. Принципиальная особенность Пролога заключается в том, что программа представляется как множество объектов и множество отношений между ними (т.е. пара ), что традиционно для математического стиля описания задач.

Поэтому вполне естественно, что источниками создания Пролога послужили логика предикатов 1-го порядка, теория рекурсивных функций, методы логического вывода (конкретно метод резолюций), языки программирования Плэнер и Лисп.

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

обработка текстов естественного языка;

контроль заданных спецификаций посредством реализации действующих макетов;

поиск решения среди многих вариантов;

создание небольших баз данных.

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

Необходимо подчеркнуть, что влияние, которое Пролог оказал на информатику (в частности, в связи с проектом ЭВМ 5-го поколения) гораздо существеннее, чем можно было бы предположить, оценивая число написанных на нем программ.

Рассмотрим основные понятия Пролога:

В качестве простых объектов данных в Прологе используются константы и переменные.

Константы представляются как числа, символы и атомы.

Числа и символы понимаются в традиционном смысле.

Примеры констант: -67, 5, `s', `/', 3.14

Для констант могут быть введены символические имена, которые будут использоваться в тексте программы вместо самой константы. Например, pi = 3.14 или zero=0. Для этого служит специальная секция CONSTANTS.

Атом - это строка символов, которая начинается со строчной буквы и обозначает некоторый неделимый абстрактный объект.

Если строка атома начинается с прописной буквы или содержит специальные символы типа дефис, знак доллара и т.п., то она заключается в двойные кавычки.

Примеры атомов: машина, иван, “ кто-то ”, “Иван”, “иван”.

Здесь иван и “иван” - это один и тот же атом, но “Иван” и “иван” - разные

Переменная - это строка символов, которая начинается с прописной буквы или ее первый символ подчеркнут.

Примеры переменных: Иван, Студент, Z34, xyz, _test.

Переменная может находиться в свободном(free) или связанном (bound) состоянии. Причем переменные не предназначены для хранения значений, т.е. им нельзя явно присвоить какое-либо значение. А связанными они становятся в процессе проверки утверждений Пролога.

Примечание: Visual Prolog использует понятие “тип данных - domain”. К стандартным (встроенным) доменам относятся целые типы: integer- unsigned, long - ulong, short - ushort, sbyte - byte; real (аналогичен типу double в С); char (байт без знака - символ в одинарных кавычках - 'a'); string; symbol; binary; ref (для добавления термов в базу данных Пролога). Разница между типами string и symbol заключается только в их внутреннем представлении. Тип string аналогичен строкам в С.. Тип symbol реализуется как ссылка на внутреннюю symbol-таблицу, хранящую все строки, используемые в программе на Прологе. По умолчанию атомы, заданные в виде строк, окаймленных двойными кавычками, обрабатываются по типу string. А атомы, определенные в виде строк, начинающихся со строчной буквы, - по типу symbol.

К сложным (составным) объектам данных в Прологе относятся структуры и списки.

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

Регистр символов в имени структуры не имеет значения, но рекомендуется не использовать прописные символы. Спецсимволы '$', `-`, `?' и другие, за исключением символа подчеркивания нельзя использовать в именах структур.

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

студент( иванов, иван, возраст)

наша_семья (дедка, бабка, внучка, собака(жучка), кошка (мурка), Мышка)

Если внимательно посмотреть на приведенные примеры, то видно, что синтаксически они записаны одинаково, но имеют несколько разный характер.

Граф состоит из вершин a,b,c,d,u,v,x .

Наша семья состоит из … и перечисляется состав.

Иван имеет машину.

Дерево описывается свойством "цвет" и значение у этого свойства - зеленый .

Таким образом, примеры 1 и 5 определяют новые объекты через другие объекты, пример 2 - как комбинацию свойств. Пример 3 определяет отношение между Иваном и машиной. А пример 4 выделяет одно из свойств объекта. Эти примеры подчеркивают, что синтаксически одинаковая запись в Прологе может быть использована как для представления сложного объекта - структуры, так и для представления отношения между объектами или описания свойств объектов (т.е. унарных отношений).

Отношения в Visual Prolog называются предикатами и записываются они так же как структуры. Для того, чтобы Пролог мог отличить где объект данных, а где - отношение, необходимо их явно описать.

Соответственно, все структуры должны быть описаны в секции DOMAINS вместе с пользовательскими типами данных. А все используемые в программе предикаты (кроме встроенных) - в секции PREDICATES.

Примечание: Visual Prolog в отличие от стандартного ПРОЛОГА реализован в виде типизированного компилятора, и, в частности,. требует обязательного описания типов аргументов для всех структур и предикатов. Это позволяет обеспечить высокую скорость исполнения программ на Visual Prolog, сравнимую с С и Паскалем.

Кроме того при описании предикатов могут быть заданы такие их свойства как

неоднозначность результата - nondeterm, determ;

схема использования аргументов - вход(i), выход(o).

обучает(профессор, студент, дисциплина)

Примеры описания предикатов:

nondeterm получил(студент, оценка)

determ получил_оценку_по_дисциплине(студент, оценка, дисциплина)

обучает(профессор, студент, дисциплина)

Здесь студент может иметь несколько оценок по разным предметам, поэтому предикат неоднозначен. Но оценка по каждой дисциплине может быть только одна.

В Прологе существует множество встроенных специальных предикатов. Например,

предикаты free(Var) и bound(Var) проверяют является ли переменная Var, соответственно, свободной или связанной;

Другим сложным объектом данных Пролога является список.

Cписок - это объединение произвольного количества объектов, разделенных запятыми и заключенных в квадратные скобки.

Список не имеет имени, а количество его элементов может меняться.

Примеры списков: [3,5,4]

[собака, кошка, хомяк, крокодил]

[петров, [ иванов, сидорова], сидоров, козлова]

Следует подчеркнуть, что атом “иван” и список [“иван”], состоящий из единственного элемента “иван” - это разные объекты данных.

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

сотрудник = преподаватель; инженер

преподаватель, инженер = symbol

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

Голова списка - элемент, а хвост - всегда список. Например, голова списка [s] - это “s”, а хвост равен [ ]. Если достаточное число раз отделить первый элемент списка, то получим в конце концов пустой список.

Для отделения головы от хвоста Пролог использует специальный выделенный символ “|”. Например, [a,b,c] эквивалентно [a | [b,c] ] и далее [a | [ b | [c ] ] ] и [a | [ b | [ c | [ ] ] ] ].

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

число сопоставляется только с равным ему числом,

атом сопоставляется только с равным ему атомом,

переменная сопоставляется с любым объектом и получает значение того, с чем сопоставляется,

структура сопоставляется с другой структурой, если число их компонент и функторы (имена) совпадают, а компоненты попарно сопоставимы.

Очевидно, что операция сопоставления может кончиться неудачно.

9 сопоставляется с 9

"иван" сопоставляется с иван

"иван" не сопоставляется с "петр"

имеет (иван, машина) не сопоставляется с имеет (иван, канарейка)

имеет (иван, машина) сопоставляется с имеет (иван, Х) X=машина

[1,2] не сопоставляется [3, X]

[X,Y,Z] сопоставляется [петя, вася, нина] X= петя, Y = вася, Z = нина

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

1.История создания и развития языка Prolog . ……………………. …. 3 стр.

2. Сферы использования ………………..……….…….……….……. …… 4 стр.

3. Среда разработки "SWI-Prolog"…………….……………….………. … 5 стр.

4. Среда разработки "Тurbo Prolog" ………………………..…. …..…. …22 стр.

5. Среда разработки " Visual Prolog " ..…………………. …….………. 28 стр.

7. Глоссарий терминов ………………………. ………………. ………….33 стр.

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

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

Первая реализация языка Prolog с использованием компилятора Никлауса Вирта "Algol-W" была закончена в 1972 году, а основы современного языка были заложены позднее, в 1973 г. Использование языка Prolog постепенно распространялось среди тех, кто занимался логическим программированием, в основном благодаря личным контактам, а не через коммерциализацию продукта. В настоящее время существует несколько различных, но довольно похожих между собой версий языка. Хотя стандарта языка Prolog не существует, однако версия, разработанная в Эдинбургском университете, стала наиболее широко используемым вариантом.

Теория логического программирования со временем совершенствовалась. Существенный вклад в ее развитие внесла работа Р. Ковальского "Логика предикатов как язык программирования". В 1976 г. Ковальский и М. ван Эмден предложили два подхода к прочтению текстов логических программ — процедурный и декларативный. Оба этих подхода стали активно использоваться при написании программ на языке Prolog.

Только в 1977 году Д. Уоррен и Ф. Перейра создают в университете Эдинбурга интерпретатор/компилятор языка Prolog для ЭВМ DEC-10, тем самым переведя методы логического программирования в практическую плоскость. Позднее в 1980 году К. Кларк и Ф. Маккейб в Великобритании разработали версию Prolog для персональных ЭВМ.

Также есть интересный факт: в октябре 1981 года мир облетела новость о японском проекте создания ЭВМ пятого поколения. В основу методологии разработки программных средств было положено логическое программирование. Целью проекта декларировалось создание систем обработки информации, базирующихся на знаниях, а главным средством реализации должен был стать именно язык Prolog. В это же время (начало 1980-х годов) появляется множество коммерческих реализаций Prolog практически для всех типов компьютеров. К наиболее известным можно отнести "Visual Prolog", "Тurbo Prolog", "SWI-Prolog". и др.

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

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

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

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

Некоторые приложения в таких областях, как экспертные системы, планирование, машинное обучение, так называемый "искусственный интеллект" игр, реализованы именно с помощью Prolog. Так что, несмотря на то, что сферы использования этого языка, хоть и не так велики и обширны, как сферы применения "традиционных" языков (C, Java и т.п.), представляют свой интерес.

Интерактивная среда разработки "SWI-Prolog" была разработана в Swedish Institute of Computer Science, отсюда происходит и название этой версии.

Открыв окно интерпретатора, вы увидите несколько строк о данном продукте, а после них и своеобразное приглашение задать вопрос Prolog-системе.

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

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

Предложения на естественном языке

Синтаксис логики предикатов

Биллу нравится машина, если машина красивая

likes(Bill, car) if fun(car)

Факты и правила

При составлении программы на языке Пролог необходимо описать объекты (objects) и отношения (relations), а затем – правила (rules), при которых эти отношения являются истинными.

Bill likes dogs.

это предложение устанавливает отношение между объектами Bill и dogs; этим отношением является likes. Правило, определяющее, когда предложение является истинным, может выглядеть так:

Bill likes dogs if the dogs are nice.

Факты помимо отношений могут выражать и свойства:

Cindy likes everything that Bill likes.

По этому правилу получается, что

Cindy likes dogs.

На Прологе синтаксис у правил будет другим:

likes(cindy, Something) :- likes(bill, Something).

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

Во втором случае второй объект – What – начинается с большой буквы, тогда как первый объект – cindy – со строчной. Это происходит потому, что cindy – фиксированный, постоянный объект, известная величина, а What – переменная.

Получив запрос о том, что любит Синди, Пролог ответит:

Запросы (цели) могут быть простыми или сложными. Сложными называются цели, состоящие из двух или более частей. А каждая часть сложной цели – подцелью. Возможно использование конъюнктивной и дизъюнктивной формы объединения подцелей. В качестве разделителей используются знаки , и ; соответственно.

Составные цели можно использовать для поиска решения, в котором:

ü обе подцели A и B истинны (конъюнкция), разделяя подцели запятой:

ü истинна либо подцель A, либо подцель B (дизъюнкция), разделяя подцели точкой с запятой.

Переменные в Прологе всегда начинаются с заглавной буквы или символа подчеркивания.

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

Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.

На этом примере удобно наблюдать как среди фактов выделяется тот, у которого второй аргумент – reading, а переменная Person первоначально связывается со значением ellen и по списку фактов ищет факт, соответствующий второй части запроса: likes(ellen,swimming). Поскольку такого факта нет, то Пролог среди фактов выделяет следующий факт у которого второй аргумент – reading, то есть likes(eric,reading) и переменная Person связывается со значением eric. Далее по списку фактов ищет факт, соответствующий второй части запроса: likes(eric,swimming). И, поскольку данный факт имеет место быть, то Пролог выдает ответ:

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

На такой запрос Пролог ответит:

Анонимные переменные могут использоваться и в фактах Пролога. Например, факты:

Могут быть выражены средствами естественного языка: У каждого есть рот. Все пьют.

Анонимные переменные сопоставляются с любыми данными.

Многострочные комментарии должны начинаться с символов /* и заканчиваться символами */. Однострочные комментарии можно начинать с символ %. В Visual Prolog можно использовать комментарии после каждого субдомена при объявлении домена:

articles = book( string Title, string Author)

likes(string Uppercase, string Lowercase)

Программы Visual Prolog

Visual Prolog – компилятор, контролирующий типы: для каждого предиката объявляются типы объектов, которые он может использовать. Это объявление типов позволяет программам быть скомпилированными непосредственно в машинные коды.

Основные разделы программ.

- раздел domains (доменов);

- раздел predicates (предикатов);

- раздел clauses (предложений);

- раздел goal (целей).

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

Раздел предикатов. Здесь перечисляются все предикаты, отличные от стандартных (встроенных в VP) и используемые в программе. Предикаты должны быть перечислены с указанием типов (доменов) их аргументов.

Объявление предиката содержит:

1) имя предиката – последовательность латинских букв, цифр и символа подчеркивания, начинающаяся с прописной буквы. Длина имени не может быть больше 250 символов. В именах запрещено использовать такие символы, как пробел, -, * и т.п.;

2) списка доменов (типов) аргументов предиката, заключенного в круглые скобки.

В отличие от предложений раздела clauses описание предиката не заканчивается точкой. Доменами (типами) аргументов могут быть либо стандартные домены, либо домены, объявленные в разделе domains.

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

Раздел доменов. Если предикат my_predikate (symbol, integer) объявлен в разделе predicates следующим образом:

my_predikate (symbol, integer)

то нет никакой необходимости объявления доменов его аргументов в разделе доменов, так как symbol и integer – стандартные домены. Но если возникнет необходимость объявления в виде:

my_predikate (name, number),

то выше надо описать в разделе доменов

Домены позволяют задавать разные имена различным видам данных.

imya, pol = symbol

person(imya, pol, vozrast)

Одно из преимуществ объявления собственных доменов – это то, что компилятор может отслеживать ошибки типов:

rovesnik(X, Y) :- person(X, Pol, Let), person(Pol, Y, Let)

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

короткое, знаковое, количественное

короткое, беззнаковое, количественное

длинное, знаковое, количественное

длинное, беззнаковое, количественное

или -32 768 .. 32 767

или -2 млрд. .. 2 млрд.

символ, заключенный в апострофы

число с плавающей десятичной точкой (эквивалентен типу double в C) в интервале:

1) последовательность символов, заключенных в кавычки

2) последовательность букв, цифр и символов подчеркивания, начинающаяся со строчной буквы








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

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

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

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

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

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

^ 1 Программирование в Логике

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

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

Предложения на естественном языке

Синтаксис логики предикатов

Биллу нравится машина, если машина красивая

likes(Bill, car) if fun(car)

^ 2 Факты и правила

При составлении программы на языке Пролог необходимо описать объекты (objects) и отношения (relations), а затем – правила (rules), при которых эти отношения являются истинными.

Bill likes dogs.

это предложение устанавливает отношение между объектами Bill и dogs; этим отношением является likes. Правило, определяющее, когда предложение является истинным, может выглядеть так:

Bill likes dogs if the dogs are nice.

Факты помимо отношений могут выражать и свойства:

Cindy likes everything that Bill likes.

По этому правилу получается, что

Cindy likes dogs.

На Прологе синтаксис у правил будет другим:

likes(cindy, Something) :- likes(bill, Something).

^ 3. Запросы (цели)

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

Во втором случае второй объект – What – начинается с большой буквы, тогда как первый объект – cindy – со строчной. Это происходит потому, что cindy – фиксированный, постоянный объект, известная величина, а What – переменная.

Получив запрос о том, что любит Синди, Пролог ответит:

Запросы (цели) могут быть простыми или сложными. Сложными называются цели, состоящие из двух или более частей. А каждая часть сложной цели – подцелью. Возможно использование конъюнктивной и дизъюнктивной формы объединения подцелей. В качестве разделителей используются знаки , и ; соответственно.

Составные цели можно использовать для поиска решения, в котором:

ü обе подцели A и B истинны (конъюнкция), разделяя подцели запятой:

ü истинна либо подцель A, либо подцель B (дизъюнкция), разделяя подцели точкой с запятой.

Переменные в Прологе всегда начинаются с заглавной буквы или символа подчеркивания.

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

Нельзя сохранить информацию, присвоив значение переменной. Переменные используются как часть процесса поиска решения, а не как хранилище информации.

На этом примере удобно наблюдать как среди фактов выделяется тот, у которого второй аргумент – reading, а переменная Person первоначально связывается со значением ellen и по списку фактов ищет факт, соответствующий второй части запроса: likes(ellen,swimming). Поскольку такого факта нет, то Пролог среди фактов выделяет следующий факт у которого второй аргумент – reading, то есть likes(eric,reading) и переменная Person связывается со значением eric. Далее по списку фактов ищет факт, соответствующий второй части запроса: likes(eric,swimming). И, поскольку данный факт имеет место быть, то Пролог выдает ответ:

^ 4. Анонимные переменные

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

На такой запрос Пролог ответит:

Анонимные переменные могут использоваться и в фактах Пролога. Например, факты:

Могут быть выражены средствами естественного языка: У каждого есть рот. Все пьют.

Анонимные переменные сопоставляются с любыми данными.

Многострочные комментарии должны начинаться с символов /* и заканчиваться символами */. Однострочные комментарии можно начинать с символ %. В Visual Prolog можно использовать комментарии после каждого субдомена при объявлении домена:

articles = book( string Title, string Author)

и в объявлении предикатов:

likes(string Uppercase, string Lowercase)

^ 5. Программы Visual Prolog

Visual Prolog – компилятор, контролирующий типы: для каждого предиката объявляются типы объектов, которые он может использовать. Это объявление типов позволяет программам быть скомпилированными непосредственно в машинные коды.

Основные разделы программ.

- раздел domains (доменов);

- раздел predicates (предикатов);

- раздел clauses (предложений);

- раздел goal (целей).

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

Раздел предикатов. Здесь перечисляются все предикаты, отличные от стандартных (встроенных в VP) и используемые в программе. Предикаты должны быть перечислены с указанием типов (доменов) их аргументов.

Объявление предиката содержит:

1) имя предиката – последовательность латинских букв, цифр и символа подчеркивания, начинающаяся с прописной буквы. Длина имени не может быть больше 250 символов. В именах запрещено использовать такие символы, как пробел, -, * и т.п.;

2) списка доменов (типов) аргументов предиката, заключенного в круглые скобки.

В отличие от предложений раздела clauses описание предиката не заканчивается точкой. Доменами (типами) аргументов могут быть либо стандартные домены, либо домены, объявленные в разделе domains.

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

Раздел доменов. Если предикат my_predikate (symbol, integer) объявлен в разделе predicates следующим образом:

my_predikate (symbol, integer)

то нет никакой необходимости объявления доменов его аргументов в разделе доменов, так как symbol и integer – стандартные домены. Но если возникнет необходимость объявления в виде:

my_predikate (name, number),

то выше надо описать в разделе доменов

Домены позволяют задавать разные имена различным видам данных.

imya, pol = symbol

person(imya, pol, vozrast)

Одно из преимуществ объявления собственных доменов – это то, что компилятор может отслеживать ошибки типов:

rovesnik(X, Y) :- person(X, Pol, Let), person(Pol, Y, Let)

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

короткое, знаковое, количественное

короткое, беззнаковое, количественное

длинное, знаковое, количественное

длинное, беззнаковое, количественное

или -32 768 .. 32 767

или -2 млрд. .. 2 млрд.

символ, заключенный в апострофы

число с плавающей десятичной точкой (эквивалентен типу double в C) в интервале:

1) последовательность символов, заключенных в кавычки

2) последовательность букв, цифр и символов подчеркивания, начинающаяся со строчной буквы

то же, что и string

Раздел целей аналогичен телу правила: это просто список подцелей.

Цель отличается от правила следующими признаками:

1) за ключевым словом GOAL не следует знак :-

2) при запуске программы VP автоматически выполняет цель.

В 50-х годах исследователи в области ИИ пытались строить разумные машины, имитируя мозг. Эти попытки оказались безуспешными по причине полной непригодности как аппаратных так и программных средств.

В 60-х годах предпринимались попытки отыскать общие методы решения широкого класса задач, моделируя сложный процесс мышления. Разработка универсальных программ оказалась слишком трудным и бесплодным делом. Чем шире класс задач, которые может решать одна программа, тем беднее оказываются ее возможности при решении конкретной проблемы.[5]

В начале 70-х годов специалисты в области ИИ сосредоточили свое внимание на разработке методов и приемов программирования, пригодных для решения более специализированных задач: методов представления (способы формулирования проблемы для решения на средствах вычислительной техники (ВТ)) и методах поиска (способы управления ходом решения так, чтобы оно не требовало слишком большого объема памяти и времени).

И только в конце 70-х годов была принята принципиально новая концепция, которая заключается в том, что для создания интеллектуальной программы ее необходимо снабдить множеством высококачественных специальных знаний о некоторой предметной области. Развитие этого направления привело к созданию экспертных систем (ЭС).[6]

Читайте также: