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


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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.