- 4. Логическое программирование
- Логические языки программирования: особенности, примеры
- Что такое логическое программирование?
- В чем различия?
- Кому полезно учить языки программирования логического типа?
- Логические языки программирования
- Заключение
- Язык логического программирования
- См. также
- Библиографические ссылки
- Ссылки
4. Логическое программирование
Методология логического программирования — подход, согласно которому программа содержит описание проблемы в терминах фактов и логических формул, а решение проблемы система выполняет с помощью механизмов логического вывода.
Логическое программирование начинает свой отсчет времени с конца 60-х годов XX века, когда Корделл Грин предложил использовать резолюцию как основу логического программирования. Алан Колмеро создал язык логического программирования Prolog в 1971 году. Логическое программирование пережило пик популярности в середине 80-х годов XX века, когда оно было положено в основу проекта разработки программного и аппаратного обеспечения вычислительных систем пятого поколения.
Важным преимуществом такого подхода является достаточно высокий уровень машинной независимости, а также возможность откатов – возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения (скажем, очередного хода при игре в шахматы), что избавляет от необходимости поиска решения путем полного перебора вариантов и увеличивает эффективность реализации.
Одним из недостатков логического подхода в концептуальном плане является специфичность класса решаемых задач.
Другой недостаток практического характера состоит в сложности эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения.
Нелинейность структуры программы является особенностью декларативного подхода и, строго говоря, представляет собой оригинальную особенность, а не объективный недостаток.
в качестве примеров языков логического программирования можно привести Prolog (название возникло от слов PROgramming in LOGic) и Mercury.
Метод единообразия заключается в одинаковом применении механизма логического доказательства ко всей программе.
Метод унификации — это механизм сопоставления с образцом для создания и декомпозиции структур данных.
Общие сведения о языке Prolog, связь с исчислением предикатов.
ПРОЛОГ является языком исчисления предикатов. Предикат – это логическая формула от одного или нескольких аргументов. Можно ска- зать, что предикат – это функция, отображающая множество произволь- ной природы в множество .
Обозначаются предикаты F(x), F(x, y), F(x, y, z) и т. д..
Одноместный предикат F(x), определенный на предметной области M, является истинным, если у объекта x есть свойство F, и ложным – если этого свойства нет.
Двухместный предикат F(x, y) является истинным, если объекты x и y находятся в отношении F.
Многоместный предикат F(x1 , x2 , x3 . xN ) задает отношение меж- ду элементами x1 , x2 , . xN и интерпретируется как обозначение высказывания: “Элементы x1 , x2, x N находятся между собой в отношении F”.
При разработке логических программ предикаты получают обычно названия, соответствующие семантике описываемой предметной области.
Предикаты, которые нельзя разбить на отдельные компоненты, на- зывают атомарными. Сложные формулы строятся путем комбинирова- ния атомарных предикатов логическими соединителями И, ИЛИ и НЕ.
Пролог (Prolog) — это программирование на языке логики.
Этот язык используется для задач, которые сводятся к объектам и отношениям между ними.
Пролог является реляционным языком.
Пользоваиель должен установить какие формальные отношения и объекты существуют в решаемой задаче и установить какие отношения справедливы для поиска решения.
Пролог — это декларативный язык. Он отличается от процедурных (императивных) языков:
- императивный — как делать
- декларативный — что делать
- семантикой языка
- новыми фактами, которые Пролог выводит из имеющихся
- отчасти той управляющей информацией, которую задает программист
- сопоставление с образцом
- поиск с возвратом
- недетерменизм
- Система реализующая логический вывод в исчислении предикатов 1-го порядка
- Хорнова модель вычислений: доказательство некоторых формул исчисления как вычисление
- «Выражение Хорна» (дизъюнкты,клаузы) + принцип резолюции (как логический вывод)
- A(t1,t2. tn) — факт
- ~A1V~A2V. ~AnVAm
- Правило преобразования дизъюнкции в конъюнкции:
- В качестве механизма логического вывода используется метод резолюции с формулами: A1VA2. VAn
- объявление фактов об объектах и отношениях
- определение правил
- формировки вопросов
Логические языки программирования: особенности, примеры
Как часто вы сталкивались с непонятным термином «логическое программирование» и не могли понять, что это? Сегодня мы окончательно определимся с тем, что такое языки программирования логического типа, и рассмотрим примеры таких языков.
Прежде чем начинать обзор языков, необходимо сначала узнать, что это такое и зачем оно нужно.
Что такое логическое программирование?
Это подход к программированию, основанный на доказательстве теорем и выводе информации на основе фактов. Вывод результата является побочным продуктом работы программы. Логическое программирование основано на теории математической логики, включает в себя раздел дискретной математики и некоторые другие.
В чем различия?
Многие объединяют логические языки программирования с функциональными, однако они обладают некоторыми различиями, о которых мы далее поговорим.
В отличие от функциональных, логические очень хорошо подходят для создания искусственного интеллекта. Также иногда очень удобно, когда в языке переменные не делятся на входные и выходные. Именно в таких языках это и происходит, что иногда упрощает работу с кодом. Опять же программы являются более быстрыми и выполняют свои задачи иногда эффективнее. Основная особенность логических языков программирования заключается в том, что программа представляет определенные отношения между элементами.
Однако существуют и минусы. Не все можно описать с помощью логики, поэтому в таких программах функции будут работать не всегда так, как нужно, или вообще не будут работать.
Кому полезно учить языки программирования логического типа?
Стоит сразу ответить на вопрос: учить данные языки полезно всем – от школьника до человека в возрасте. Ведь логические языки программирования способны буквально заставить наш мозг думать логически. Также такие языки будут очень полезны в создании искусственного интеллекта или при работе с данными.
Логические языки программирования
Таких языков не так много, и они отличаются между собой. Мы поговорим только о двух, а начнем с того, с которого началась эра логических языков, и имя ему Prolog.
Данный язык был разработан в 1972 году Аленом Колмероэ и является актуальным и свежим и на сегодняшний день. Хоть это и не самый простой язык в плане синтаксиса, но зато весьма полезен в понимании логики компьютера. Посмотрите, как выглядит код, описывающий книгу:
book( 'Название', '2009', 'Спб', authors( 'Первый автор', 'Второй автор' ) ).
Такое описание довольно просто понять и разобрать что к чему. Именно поэтому обучение подобному языку дальше не составит огромных трудностей и не потребует танцев с бубном.
Давайте дальше разберем его плюсы и минусы.
1. Код легко понять и запомнить.
Как уже упоминалось выше, код в языке Prolog пишется не так уж и сложно. Он довольно прост, в понимании обычного пользователя.
Данный язык можно использовать без каких-либо вычислений, опираясь только на выражения и факты.
Какой бы путь к реализации вашей задумки вы ни выбрали, он практически никогда не влияет на результат выполнения программы.
Из-за того, что этот язык мало поддерживают в материальном плане – он развивается довольно медленно, маленькими шажками.
2. Невозможность создания комплексных программ.
Данный язык будет невозможно использовать без связки с другим, если вы хотите создавать более сложные программы с большим функционалом.
3. Вычислительные операции.
Для вычислительных операций опять же придется использовать другие языки.
Пошедший от языка Prolog, Mercury создан, чтобы решить две проблемы, связанные с популярным языком программирования.
Логические языки программирования довольно сильно уступают в производительности императивному типу.
В языках такого типа уходит довольно много времени на отладку программы, а также производится меньше проверок на ошибки в программе, из-за чего порой происходят неприятности.
:- module hello. :- interface. :- import_module io. :- pred main(io::di, io::uo) is det. :- implementation. main(!IO) :- io.write_string("Hello, World!\n", !IO).
Синтаксис и понимание данного языка, как можно заметить, весьма отличаются от «Пролога», что немного усложняет обучение, однако некоторые его плюсы, помогающие решить проблемы «Пролога», весьма полезны.
Заключение
Языком логического программирования является язык, который обрабатывает выражения и факты, а побочным эффектом выдает результат работы данной программы. Такие языки весьма полезны в создании искусственного интеллекта и работы с данными, однако редко применяются без сторонних языков программирования.
Язык логического программирования
Логи́ческое программи́рование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций.
Самым известным языком логического программирования является Prolog.
Первым языком логического программирования был язык стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Mercury, Visual Prolog, Oz и Fril произошли уже от языка Prolog. На базе языка Шапиро [1989]).
См. также
- Искусственный интеллект
- Экспертные системы
- База знаний
- Язык Пролог
- Логика в информатике
- Функциональное программирование
- Структурное программирование
- Доказательное программирование
- Автоматное программирование
- Процедурное программирование
- Объектно-ориентированное программирование
- Прототипное программирование
- Аспектно-ориентированное программирование
Библиографические ссылки
- Иван Братко Алгоритмы искусственного интеллекта на языке PROLOG = Prolog Programming For Artificial Intelligence. — М.: «Вильямс», 2004. — С. 640. — ISBN 0-201-40375-7
- John McCarthy. Programs with common sense Symposium on Mechanization of Thought Processes. National Physical Laboratory. Teddington, England. 1958.
- Fisher Black. A deductive question answering system Harvard University. Thesis. 1964.
- James Slagle. Experiments with a Deductive Question-Answering Program CACM. December, 1965.
- Cordell Green. Application of Theorem Proving to Problem Solving IJCAI 1969.
- Carl Hewitt. Planner: A Language for Proving Theorems in Robots IJCAI 1969.
- Gerry Sussman and Terry Winograd. Micro-planner Reference Manual AI Memo No, 203, MIT Project MAC, July 1970.
- Carl Hewitt. Procedural Embedding of Knowledge In Planner IJCAI 1971.
- Terry Winograd. Procedures as a Representation for Data in a Computer Program for Understanding Natural Language MIT AI TR-235. January 1971.
- Bruce Anderson. Documentation for LIB PICO-PLANNER School of Artificial Intelligence, Edinburgh University. 1972
- Bruce Baumgart. Micro-Planner Alternate Reference Manual Stanford AI Lab Operating Note No. 67, April 1972.
- Julian Davies. Popler 1.6 Reference Manual University of Edinburgh, TPU Report No. 1, May 1973.
- Jeff Rulifson, Jan Derksen, and Richard Waldinger. QA4, A Procedural Calculus for Intuitive Reasoning SRI AI Center Technical Note 73, November 1973.
- Robert Kowalski Predicate Logic as Programming Language Memo 70, Department of Artificial Intelligence, Edinburgh University. 1973.
- Drew McDermott and Gerry Sussman. The Conniver Reference Manual MIT AI Memo 259A. January 1974.
- Earl Sacerdoti, et al.QLISP: A Language for the Interactive Development of Complex Systems AFIPS National Computer Conference. 1976.
- Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981.
- Bill Kornfeld. The Use of Parallelism to Implement a Heuristic Search IJCAI 1981.
- Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981.
- Bill Kornfeld. Combinatorially Implosive Algorithms CACM. 1982
- Carl Hewitt. The Challenge of Open Systems Byte Magazine. April 1985.
- Robert Kowalski. The limitation of logic Proceedings of the 1986 ACM fourteenth annual conference on Computer science.
- Ehud Shapiro (Editor). Concurrent Prolog MIT Press. 1987.
- Robert Kowalski. The Early Years of Logic Programming CACM. January 1988.
- Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989.
- Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo. Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
- Shunichi Uchida and Kazuhiro Fuchi Proceedings of the FGCS Project Evaluation Workshop Institute for New Generation Computer Technology (ICOT). 1992.
Ссылки
Wikimedia Foundation . 2010 .