Декларативное программирование функциональное и логическое программирование

Парадигмы программирования

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

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

Структурное программирование

Некоторые представители: Fortran, Pascal, C.

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

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

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

Функциональное и логическое программирование

Представители функциональных языков: List, Haskell.

Представитель логических языков: Prolog.

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

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

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

Объектно-ориентированное программирование

Представители объектно-ориентированных языков: С++, Java, Python.

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

ООП призвано решать более сложные и объемные задачи по сравнению с директивным программированием.

В основе ООП лежат такие понятия как наследование, полиморфизм и инкапсуляция.

Инкапсуляция предполагает, что малозначащие детали объекта скрыты. Объект, получая какую-либо команду, сам «знает» как ее обработать исходя из того, к какому классу он принадлежит.

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

Источник

Функциональное и логическое программирование – стили декларативного программирования

В настоящее время декларативная парадигма программирования реализуется с помощью одного из следующих стилей программирования: функционального и логического программирования.

Основной конструкцией в функциональных языках служит символьное выражение (S-выражение). К S-выражениям относятся скалярные константы, структурированные объекты, функции, тела функций и вызовы функций.

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

Функциональный язык программирования включает следующие элементы:

• классы констант, которыми могут манипулировать функции;

• набор базовых (определенных в данной системе) функций, называемых примитивами;

• правила построения новых функций на основе примитивов;

• правила формирования выражений па основе вызовов функций.

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

• вызовы функций-примитивов заменяются соответствующими значениями;

• вызовы определенных программистом функций заменяются их телами, в которых параметры замещены аргументами.

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

Логическое программирование базируется на понятии отношения (реляция). Поэтому существует другое название логического программирования – реляционное программирование. Программа представляет собой совокупность определений отношений между объектами и цели.

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

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

• строгой ориентацией на символьные вычисления;

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

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

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

Системы искусственного интеллекта – основная область приложения функционального и логического программирования

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

• проблемы естественного языка (ЕЯ-проблемы), основная цель – общение с ЭВМ на естественном для человека языке;

• экспертные системы – системы обработки данных, основанные на знаниях и экспертных оценках в некоторой области;

• распознавание образов – автоматическое наблюдение и идентификация (классификация) объектов;

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

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

Разработка естественно-языковых интерфейсов и машинный перевод. В настоящее время используется более сложная модель, включающая анализ и синтез естественно-языковых сообщений. Модель состоит из нескольких блоков: морфологический анализ – анализ слов в тексте; синтаксический анализ – анализ предложений, грамматики и связей между словами; семантический анализ – анализ смысла каждого предложения на основе некоторой предметно-ориентированной базы знаний; прагматический анализ — анализ смысла предложений в окружающем контексте на основе собственной базы знаний. Синтез включает аналогичные этапы, но несколько в другом порядке.

Источник

Читайте также:  Программирование stm32 через uart
Оцените статью