Пример, где наименьший нормальный лямбда-член не самый быстрый

12

Пусть о Л -терминов быть определены следующим образом :sizeλ

  • ,size(x)=1
  • size(λx.t)=size(t)+1 ,
  • size(ts)=size(t)+size(s)+1 .

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

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

...

Изменить для ясности

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

-- The fixed fibonacci definition
fib_rec fib n =
    if (is_zero x) 
        then 1 
        else fib (n - 1) + f (n - 2)

-- Using church numbers instead of the λ-combinator to get a normal form
fib n = n fib_rec 0 n 

Это часто рассматривается как «самое простое» определение fib, и оно очень медленное (экспоненциальное). Если мы расширим зависимости fib( обычные определения для добавления номера церкви, pred, is_zero) и нормализуем его, мы получим этот термин:

fib = (λa.(a(λbc.(c(λdef.f)(λde.d)(λde.(de))
      (λde.(b(λfg.(c(λhi.(i(hf)))(λh.g)(λh.h)))
      d(b(λfg.(c(λhi.(i(h(λjk.(k(jf))))))(λhi.g)
      (λh.h)(λh.h)))de)))))(λbc.c)a))

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

fib = (λa.(a(λb.(b(λcde.(e(λfg.(cf(dfg)))c))))
      (λb.(b(λcd.(cd))(λcd.d)))(λbc.b)))

и, что любопытно, также асимптотически превосходит наивного, вбегающего O(N). Из всех определений, которые я знаю, это и самый быстрый и самый простой . Тот же эффект происходит с сортировкой. «Наивные» определения, такие как пузырьковая сортировка и вставка, часто расширяются до огромных терминов (более 20 строк), но существует небольшое определение:

-- sorts a church list (represented as the fold) of church numbers
sort = λabc.a(λdefg.f(d(λhij.j(λkl.k(λmn.mhi)l)(h(λkl.l)i))
       (λhi.i(λjk.bd(jhk))(bd(h(λjk.j(λlm.m)k)c))))e)(λde.e)
       (λde.d(λfg.g)e)c

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

MaiaVictor
источник
3
Нет имеет сложность sqrt (n). n!=n.n1....2.1
T ....
2
Я почти уверен, что вы можете закодировать пробное деление по более короткому критерию, чем алгоритм AKS. λ
Эмиль Йержабек
2
Я согласен с @ EmilJeřábek и, на самом деле, я не вижу, как пример не получается, рассматривая алгоритмы сортировки, как вы уже сделали: разве -term не реализует пузырьковую сортировку короче, чем имплементация -term Скажем, куча сортировки? Или, я не знаю, грубый поиск, очень короткий, чтобы реализовать, но экспоненциальное время, по сравнению с умным многопоточным алгоритмом, требующим больше строк кода ...? Должно быть, я что-то упустил, боюсь, я не совсем понял вопрос. λλ
Дамиано Мазза
1
Я даже не пытался записать его, но, как эвристический принцип, относительная длина двух алгоритмов обычно не сильно зависит от выбора языка программирования, и я не вижу абсолютно никакой причины, по которой -calculus не должен быть исключением , В частности, обратите внимание, что нормализация - это красная сельдь: наиболее естественный способ выражения алгоритмов в -calculus дает нормальные условия с самого начала, и в любом случае, из моего опыта работы с Unlambda, IIRC, вы можете преобразовать любой термин в нормальный член аналогичной длины, дающий тот же результат при применении. λλ
Эмиль Йержабек
2
И да, как упоминает Дамиано, AKS был просто примером. То же самое должно иметь место в более или менее любой ситуации, когда у нас есть тривиальный неэффективный алгоритм и эффективное, но гораздо более изощренное решение той же проблемы.
Эмиль Йержабек

Ответы:

10

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

Это говорит о том, что при любой разумной мере сложности (например, оптимальное число сокращений, как в вопросе) и рекурсивной функции (например, ), мы можем найти рекурсивный предикат такой, что:Mf(x,y)2yP(x)

Для каждого алгоритма (т. Е. -term в нормальной форме здесь) вычисляющего , существует другой алгоритм для который имеет -скорость над : λgPhPfg

f(x,M(h,x))M(g,x) for all large enough inputs x,

где обозначает сложность вычисления на входе в соответствии измерения .M(g,x)gxM

Следовательно:

  • P не имеет асимптотически оптимального алгоритма в данной мере

  • в частности, кратчайший алгоритм для не асимптотически оптималенP

  • для любого алгоритма для существует асимптотически более быстрый алгоритм, нормальная форма которого длиннее (поскольку до переименования переменных существует только конечное число нормальных членов заданной длины)P

Эмиль Йержабек
источник