Почему люди могут решить некоторые «неразрешимые» проблемы?

46

Сопоставление паттернов высокого порядка - неразрешимая проблема. Это означает, что не существует алгоритма, который, учитывая уравнение a => b, где aи bявляются открытыми слагаемыми в простом типе лямбда-исчисления, находит замену так S, что aS => bS, где =>означает «имеет такую ​​же Bn нормальную форму». Тем не менее, люди могут эффективно решить эту проблему. Например, с учетом следующей проблемы:

a = (λt . t 
    (F (λ f x . (f (f (f x))))) 
    (F (λ f x . (f (f x)))))
b = (λ t . t
    (λ f x . (f (f (f (f (f (f x)))))))
    (λ f x . (f (f (f (f x))))))

Любой человек, обладающий достаточными знаниями в области лямбда-исчисления, сможет заметить, Fчто это «двойная» функция для церковных чисел, быстро пришедшая с решением, которое

 F = (λ a b c . (a b (a b c)))

Мой вопрос: если эта проблема неразрешима, как люди могут быстро и без усилий решить ее?

MaiaVictor
источник
25
«люди могут решить эту проблему эффективно» - цитирование необходимо. Каковы ваши доказательства этого? Показ одного примера, где вы можете решить это эффективно, не означает, что вы можете решить это эффективно для всех случаев проблемы. Вы не можете доказать «X истинно для всех X», показав один пример X, где X истинно.
DW
34
Проблема неразрешима означает, что не существует алгоритма, который правильно отвечает «да» или «нет» для каждого случая проблемы. Это не означает, что можно найти алгоритм, который решает некоторые (или многие) случаи проблемы. [Хех. Как DW ответил, пока я составлял это замечание.]
Рик Декер,
24
Решите эту проблему? Я даже не понимаю эту проблему.
MikeTheLiar
2
Я понял это так: это решение является специальным. У каждого случая проблемы есть один - в большинстве случаев это не так легко мотивировать, как в вашем примере, но вы всегда можете сказать «если вы получите экземпляр X, выведите Y», поскольку алгоритм может быть оценен только на основе правильности - но жесткое кодирование всех таких решений таким способом не приводит к конечной процедуре (которая является единственным разумным видом и, следовательно, тем, что обычно подразумевается). В качестве альтернативы указано, что для того, чтобы проблема была разрешимой, вам не разрешается видеть, какой экземпляр дан перед выбором стратегии алгоритма.
Вандермонде
Кроме того, именно поэтому обычно рассматриваются или называются таковыми только проблемы с бесконечным числом экземпляров, поскольку в противном случае вы могли бы просто перечислить все решения, как указано выше.
Вандермонде

Ответы:

82

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

Неразрешимый означает, что «не существует алгоритма, который может решить все случаи и который всегда завершается». Может существовать алгоритм, который может решить некоторые случаи , даже для неразрешимой проблемы.

Так что нет никакого противоречия.

DW
источник
23
@ srvm, да, это действительно так. Например, вот глупый пример компьютерного алгоритма: «если входные данные в точности соответствуют приведенному в вашем вопросе, выведите F = (λ a b c . (a b (a b c)))и остановите». Это компьютерный алгоритм, который решает проблему для некоторых случаев (в частности, для ровно одного случая). Да, все в порядке - задавать новый вопрос подобным образом, кажется правильным. Как обычно, пожалуйста, сообщите нам, какое исследование вы провели в этом вопросе (вы должны сделать некоторые, прежде чем спрашивать).
DW
10
Где действительно трудные проблемы Есть утверждения, что даже в NP завершенные проблемы большинство случаев могут быть легко решены. Это соответствует моему опыту. Обычно есть признаки проблемы, которые делают (по крайней мере, часть) решение очевидным. В трудных из них тщательно сбалансированы между успехом и неудачей, но не многие из них.
Росс Милликен,
3
@srvm, если подумать, то решение сложных проблем, подобных этим, в особых случаях - это именно то, что должен делать оптимизатор.
Cort Ammon
2
@srvm: отличным примером неразрешимой проблемы, которую мы заставляем компьютеры решать почти каждый день, является проблема остановки. Мы знаем, что проблема остановки неразрешима, но мы все еще настаиваем на написании линтеров, статических анализаторов и компиляторов, которые пытаются обнаружить нежелательные бесконечные циклы. Как мы это делаем - это «эмпирическое правило». То есть мы знаем из человеческого опыта (не алгоритма), что определенные виды кода входят в бесконечный цикл. Поэтому мы просим компьютер найти случаи, которые мы знаем. Мы знаем, что такие программы никогда не будут ловить все ошибки. Но это лучше, чем ничего.
Slebetman
3
для потомков, новая ссылка на: Где действительно трудные проблемы
Алекс Мур-Ниеми
3

Как отмечается в одном из комментариев, следует помнить, что на практике есть несколько довольно хороших алгоритмов для решения шаблонов высшего порядка (как показывает быстрый поиск в Google ).

Я не знаю ни одного, который решал бы эту конкретную проблему, но эта проблема «удвоения» чувствует себя ближе к области синтеза программ . Я верю, что существуют системы синтеза программ, которые могут решить эту проблему.

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

Коди
источник
1

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


источник
8
Разве это не просто перефразировка существующего ответа? Я знаю, что критиковал большинство ваших ответов, поэтому следующие могут показаться неискренними, но это не так. Это действительно здорово, что вы хотите внести свой вклад в сайт. Было бы здорово, если бы вы могли помочь нам ответить на некоторые из наших 2500 оставшихся без ответа вопросов , а не на вопросы, на которые у нас уже есть ответ, в котором говорится все, что вы хотите сказать. Благодарность!
Дэвид Ричерби