Может ли существовать какой-то способ проверить, является ли данное арифметическое утверждение доказуемым или не доказуемым.
Может ли существовать такой алгоритм, который примет на вход другой алгоритм и скажет, нормальный этот принятый алгоритм или кривой?
Существует ли способ понять, может ли этот входящий алгоритм выдать в итоге ответ или он зависнет?
Например, чтобы понять, что смогут сделать ЭВМ, а чего не могут.
                
                И еще Пост.
Не существует алгоритма, определяющего является ли данное арифметическое утверждение доказуемым или не доказуемым.
| Чёрч | Тьюринг | λ-исчисление | Машина Тьюринга | 
|---|
Формальный аппарат, придуманный для анализа вычислимости. Основа — анонимная функция от одного аргумента.
x2 + 5x + 7 — выражение. Но что здесь x?
f(x) = x2 + 5x + 7 — общепринятое обозначение того, что вместо x можно что-то подставлять.
                f(4) = 42 + 5×4 + 7
А как представить выражение с переменной, которое сразу же принимает ее значение?
Например, так:
 [x2 + 5x + 7](4)
А для нескольких переменных так:
                    [x2 + 5x + 7y](4, 5)
                
Изначальный вариант Чёрча
                ^x[x2 + 5x + 7](4)
^x^y[x2 + 5x + 7y](4, 5)
Потом крышки стали лямбдами
                    (вроде как писать на машинке было проще и символ красивый)
                λx[x2 + 5x + 7](4)
λxλy[x2 + 5x + 7y](4, 5)
Чёрч писал без скобок, но с подсветкой
                    (любил разноцветные чернила)
                λx.x2 + 5x + 7 4
λx.λy.x2 + 5x + 7y 4 5
На самом деле одного аргумента хватит для всех возможных вычислений.
F(x,y) эквивалентно (f(x))(y)
λx[λy[x2 + 5x + 7y]](4)(5)
Было: функция от двух аргументов
(function (x, y) {
    return x**2 + 5*x + 7*y
})(4, 5); // 71
Стало: две функции от одного аргумента
(function (x) {
    return function (y) {
        return x**2 + 5*x + 7*y
    }
})(4)(5); // 71
Современный синтаксис
(x => y => x**2 + 5*x + 7*y)(4)(5); // 71
            Лямбда-функция связывает переменную.
Привет, окружение и замыкание.
Функции эквивалентны значениям. Их можно передавать как аргументы и возвращать как результат вычислений.
λx[x2 + 5x + 7](λz[z+1])(3)
    [-1, 0, -3, 2, 3].filter(n => n > 0)
            Возможно, у этой системы найдутся приложения не только в роли логического исчисления.
— Алонзо Чёрч, 1932
Машину Тьюринга можно собрать руками, лямбда-исчисление — абстрактный аппарат.
Императивность для компьютеров естественнее, чем декларативность.
Такое пишется чаще:
    let sum = 0;
    for (let i = 0; i <= 100; i++) {
        sum += i;
    }
чем такое:
    (function sum(n, acc) {
        return (n == 0) ? acc : sum(n - 1, acc + n);
    })(100, 0)

λx.λy.x2 + 5x + 7y 4 5
    ((λ (x y)
        (+ (expt x 2) (* 5 x) (* 7 y))) 4 5) ; 71
            
The strength of JavaScript is that you can do anything.
The weakness is that you will.— Reg Braithwaite
Имеем λ-исчисление + императивность
    const checker = n => n > 0
    [-1, 0, -3, 2, 3].filter(checker)
    // Функциональное выражение (Function Expression)
    const checker = n => n > 0
    // Объявление функции (Function Declaration)
    function checker (n) { return n > 0 }
    // Функция высшего порядка (Higher-Order Function)
    [-1, 0, -3, 2, 3].filter(checker)
            Собакам и китайцам вход запрещен
В отличие от сущностей первого класса.
First Class Entities or First Class Objects
Higher-Order Function
    [-1, 0, -3, 2, 3].filter(n => n > 0)
Удобно для рекурсии
    const sumOf = function fn (acc) {
      return acc == 0 ? acc : acc + fn(acc - 1)
    }
    sumOf(10) // 55
            Immediately Invoked Function Expression, IIFE
    var Module = (function (window, undefined) {
        const private = 'secret'
        const public = 'It is not a ' + private
        // Отдаем наружу только то, что нужно
        return { public: public }
    })(window, undefined);
    console.info(Module.public)
    console.info(Module.private) // undefined
            Self-executing function (не путать с IIFE)
    const sum = function fn (acc) {
      return acc == 0 ? acc : acc + fn(acc - 1)
    }
    sum(10) // 55
            Все сразу
    (function fn (acc) {
      return acc == 0 ? acc : acc + fn(acc - 1)
    })(10)
            λ-исчисление и машина Тьюринга породили два подхода к созданию языков программирования: декларативный (функциональный) и императивный.
λ-исчисление → Lisp → Scheme → JS.
В JS много всего можно делать с функциями.
Из ответа на вопрос «Почему функциональное программирование считают противоположностью ООП, а не дополнением?»ООП и функциональное программирование могут быть полностью совместимыми (и должны быть!).
Нам лишь нужно понять, что «компьютеры — это симуляторы» и разобраться, что же симулировать.
— Алан Кей, создатель ООП
Спасибо за внимание
amiskov@ya.ru, andreymiskov.ru