Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЕК. Алгоритмізація. Конспект лекцій.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.89 Mб
Скачать
    1. Основи лямбда-числення та функціонального програмування

Лямбда-числення – розділ дискретної математики, який вивчає обчислення як математичний процес. Лямбда-числення було винайдене на початку 1930-х років Алонзо Черчем.

В основу лямбда-числення покладено дві фундаментальні операції: аплікація та абстракція.

Аплікація – використання чи виклик функції по відношенню до певного значення. Позначається як f.a, де f – функція, а – деяке значення. Відповідає загально прийнятому у математиці запису f(a).

Абстракція – побудова функції по заданим виразам, за її допомогою можна конструювати нові функції.

Лямбда-числення послужило основою для функціонального програмування – парадигми програмування, яка розглядає програму як обчислення математичних функцій та уникає стани та змінні дані. Функціональне програмування наголошує на застосуванні функцій, на відміну від імперативного програмування, яке наголошує на змінах в стані та виконанні послідовностей команд.

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

Основну увагу функціональним мовам програмування, особливо, «чисто функціональним», приділи академічні дослідники. Однак, до відомих функціональних мов програмування, які використовуються в промисловості та комерційному програмуванні належить Erlang (паралельні програми), R (статистика), Mathematica (символьні обчислення)), J та K (фінансовий аналіз), та спеціалізовані мови програмування на кшталт XSLT. Істотний вплив на функціональне програмування здійснило лямбда числення, мова програмування APL, мова програмування Lisp та, новіша мова програмування Haskell.

В цілому функціональне програмування має декілька важливих переваг по відношенню до імперативного, зокрема:

  • відсутність змінних означає, що стан програми зберігається в стеку викликів функцій та їх аргументах, завдяки чому помилки завжди локальні – зовнішні фактори на них не впливають;

  • програми просто розпаралелювати у автоматичному режимі;

  • для програм можна математично строго доводити їх правильність.

    1. Теза Черча-т’юринга про алгоритмічну розв’язність задачі

Теза Чорча-Тьюринга – фундаментальне твердження для багатьох областей науки, пов’язаних з інформатикою та програмуванням.

Теза Чорча-Тьюринга говорить наступне:

машина Тьюринга визначає те, що в математиці розуміють під алгоритмічною (механічною) процедурою. Таким чином, будь-який математичний алгоритм може бути реалізований за її допомогою.

    1. Проблема розв’язності (зависання)

В теорії обчислювальності існує проблема зависання (обчислювальності): дано опис алгоритму та початкові вхідні дані, необхідно визначити, чи може алгоритм з цими вхідними даними завершитися коли-небудь. Альтернативою зупинки є ситуація, коли робота алгоритму не припиняється (він зависає).

Машина Т’юринга не може бути використана для вирішення проблеми зависання будь-якого алгоритму.

Тому подібна задача відноситься до алгоритмічно нерозв’язних задач

    1. Алгоритмічно нерозв’язні задачі

Алгоритмічна нерозв’язність – важлива властивість деяких класів коректно поставлених задач, які допускають використання алгоритмів, яка полягає в тому, що задачі кожного із цих класів в принципі не мають якого-небудь загального універсального алгоритму вирішення, що об’єднує весь клас.

Незважаючи на повну однотипність умов та вимог для подібних задач не існує єдиного алгоритму вирішення.

Однак це не означає, що подібні задачі не можуть бути вирішені в принципі, просто для їх вирішення необхідно використовувати різні підходи, нерідко творчі і нетрадиційні.

Приклад алгоритмічно нерозв’язної задачі: виявлення «мертвого коду».