Почему мы можем предположить, что алгоритм может быть представлен как битовая строка?


17

Я начинаю читать книгу о вычислительной сложности и машинах Тьюринга. Вот цитата:

Алгоритм (т. Е. Машина) может быть представлен в виде битовой строки, как только мы определимся с каноническим кодированием.

Это утверждение представлено как простой факт, но я не могу его понять.

Например, если у меня есть алгоритм, который принимает качестве входных данных и вычисляет или:( х + 1 ) 2Икс(Икс+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Как это можно представить в виде строки, используя алфавит ?{0,1}*


38
Вы не знаете абсолютного минимума, необходимого для понимания того, как кодируется текст. Сегодня великий день, чтобы учиться! joelonsoftware.com/2003/10/08/…
Эрик Липперт

1
Я думаю, что OP может прийти к этому с другой точки зрения, основанной на неоднозначности в цитируемом тексте. Я полагаю, что OP означает «как можно построить всю машину и алгоритм в виде битовой строки», а не как ввод самой машины Тьюринга. Текст в кавычках подразумевает, что весь алгоритм может быть выполнен самостоятельно, но бит языка c, закодированный в utf, ничего не говорит о том, как машина на самом деле будет воздействовать на эту строку.
Сентин

3
... Я думаю, что все здесь неправильно понимают источник и зашли слишком далеко, за счет неопытности Ромы. Большинство этих комментариев и ответов говорят о кодировании текста для произвольной передачи, в то время как цитата говорит о кодировании алгоритма потребления машиной Тьюринга. (В настоящее время) принятый ответ, по крайней мере, затрагивает его во втором предложении.
Изката

2
@Izkata Я не уверен, знаете ли вы, что из-за универсальности эти два утверждения эквивалентны.
Конрад Рудольф

15
Самое смешное, что для того, чтобы я мог прочитать ваш закодированный алгоритм, его обязательно нужно было превратить в последовательность бит, как только вы его напечатали. Он никогда не был представлен по-другому - от вашей клавиатуры до моего монитора. У него было недвоичное представление только в наших умах; и на физиологическом уровне, когда вы смотрите на синапсы, даже это спорно.
Питер - Восстановить Монику

Ответы:


45

Самый наивный и простой ответ на ваш вопрос заключается в том, что предоставленный код (и скомпилированный машинный код) фактически представлены в виде синтаксических строк {0,1} *. Кроме того, поскольку вы говорите о машинах Тьюринга, программы, которые они запускают, представляют собой линейный список операций / инструкций, нет никаких причин, по которым они не могут быть представлены в битах / байтах.


Как именно вы представляете машину Тьюринга в виде списка инструкций? Обычное определение примерно так .
свик

@svick Как упомянуто в моем ответе ниже, вы используете универсальную TM, которая принимает описание TM в качестве входных данных (закодировано подходящим образом)
dseuss

@svick Язык программирования с простыми инструкциями для перемещения указателя по ленте? Я считаю, что примером такого может быть эзотерический язык программирования Brainfuck . Пример кода
LukStorms

@LukStorms Я не думаю, что вы можете больше называть это «машиной Тьюринга».
svick

52

У вас уже есть представление этой функции в виде текста. Преобразуйте каждый символ в однобайтовое значение, используя кодировку ASCII. Тогда результатом является последовательность байтов, т. Е. Последовательность битов, т. Е. Строка над алфавитом . Это один из примеров кодирования.{0,1}*


Точно. И, как я сказал выше, это произошло, когда Рома написал это. Даже символы, которые я вижу на своем мониторе, представляют собой черно-белые пиксели, то есть двоичную информацию, передаваемую по соединению двоичных данных из двоичной памяти, подключенной к двоичной сети через двоичные контроллеры. Это можно представить каждый алгоритм в виде битовой строки? Более того: это неизбежно, если вы не ограничиваетесь аналоговыми средствами массовой информации и личным общением.
Питер - восстановить Монику

@ PeterA.Schneider Использование аналоговых носителей или лицом к лицу не обязательно означает, что нет встроенного дискретного кодирования. Использование естественного языка не так уж далеко от использования дискретного кодирования, не так ли?
Жан-Батист Юнес

32

Я не могу устоять ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(Точки выше представляют собой единицы, пробелы нули).


5
Забавно (+1), но оно служит для того, чтобы подчеркнуть принципиально произвольную природу кодирования.
Джон Коулман


Напоминает мне о stackoverflow.com/questions/5508110/…
MSalters

1
@ Barmar Звучит как вызов для codegolf.stackexchange.com
IMSoP

1
@RomaKarageorgievich вот функция, которая выполняет рендеринг для символов Брайля. Вот простая оболочка, которая позволяет вызывать ее из командной строки.
Оставлено около

13

Ваш компьютер хранит все как последовательности 0и 1, включая вопрос, который вы ввели, чтобы спросить, как он это делает. Например, каждая буква и символ представлены 8-разрядными (я говорю о том, как все было раньше, сейчас это 16-разрядные и более сложные). Вы можете увидеть их здесь . Ну, они показывают не биты, а шестнадцатеричные и восьмеричные коды. Знаете ли вы, как преобразовать число в цифровое представление?


6
Это 16 байт только в Windows и в некоторых библиотеках, таких как Qt или ICU, которые используют UTF-16. И даже не все буквы занимают одну единицу кода в целом, даже в UTF-32, поэтому они могут быть длиннее. Поэтому я думаю, что лучше придерживаться ASCII в этой дискуссии, поэтому использование Unicode приведет к довольно сложным последствиям.
Руслан

8

Основополагающей гипотезой этой концепции является тезис Черча-Тьюринга . Может быть трудно понять, что любой алгоритм может быть представлен в виде цепочки битов, потому что термин «алгоритм» можно рассматривать в очень неформальных терминах. В тезисе Черча-Тьюринга они используют очень строго определенную концепцию того, что такое алгоритм (и даже тогда было несколько вопросов о словах). Однако их терминология стала настолько влиятельной, что иногда утверждают, что эти определения для слов типа «алгоритм» настолько эффективны, что мы просто принимаем их в качестве определения.

Черч-Тьюринг утверждает, что каждый алгоритм может быть реализован в виде вычисления на машине Тьюринга. Учитывая, что описание машины Тьюринга представляет собой конечный набор значений, тривиально увидеть, как отобразить это описание в последовательность чисел, а затем в последовательность из 0 и 1.

Как уже упоминалось в других ответах, представить свой пример алгоритма тривиально, используя кодировку ASCII или другие кодировки.

Я думаю, что причина, по которой ваша книга приводит это утверждение как факт, связана с тем фактом, что многие просто используют тезис Черча-Тьюринга в качестве основы для определения алгоритма. Если вы используете такое определение, оно так же очевидно из факта, как «5 - это число», потому что вы в основном определили его как таковое.


9
Тезис Черча-Тьюринга не является теоремой и не содержит никакого определения понятия алгоритма, которое является неформальным. Я также не вижу необходимости использовать для этого тезис Черча-Тьюринга. «Глубокая» причина, по которой некоторые объекты могут быть представлены в виде конечных строк, а некоторые нет, состоит в том, что некоторые наборы счетны, а некоторые нет.
Быстрая сортировка

Я вижу, что «алгоритм может быть закодирован как строка, если мы укажем внедрение между компонентами спецификации машины и набором строк в языке». OP делает это в своем примере, беря машину, представленную как « $ (x + 1) ^ 2 $ », и повторно представляет ее как строку на языке правильно сформированных функций C (или BCPL, C ++ и др.). ,
Эрик Тауэрс

1
@EricTowers Что требует тезиса Черча-Тьюринга. В противном случае нельзя быть уверенным, что существует машинная спецификация алгоритма для всех алгоритмов.
Cort Ammon - Восстановить Монику

1
Я утверждаю, что «алгоритм [который] требует бесконечно бесконечного числа символов для выражения» не может быть выражен. Такое выражение должно использовать неисчислимое количество символов, в противном случае оно может быть выражено в меньшем подъязыке. Кроме того, любое (не глупое) выражение в бесконечном алфавите имеет бесконечное количество энтропии почти во всех своих символах, поэтому не поддается выражению (то есть фактически не может общаться с получателем). Все финитные логики отказываются работать с такими бесконечными строками, и мне неизвестна бесконечная логика, которая позволит работать с неисчислимыми строками.
Эрик Тауэрс

1
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
DW

4

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


1
@Discretelizard, я не слежу за тобой. Любой алгоритм выражается как вход в универсальную ТМ. Языки могут быть вычислимыми или не вычислимыми; Я не знаком ни с каким стандартным понятием вычислимости для алгоритмов, поэтому я не уверен, к чему вы клоните. Что бы это значило иметь неисчислимый алгоритм? Возможно, вы думаете об алгоритмах, которые не обязательно заканчиваются? Но универсальная ТМ все еще может запускать такие алгоритмы.
DW

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

@DavidRicherby Правда, фактическое определение алгоритма, я полагаю, более строгое. Но этот вопрос касается того, почему мы налагаем гораздо более мягкое ограничение, и говорить, что есть еще более сильное ограничение, на мой взгляд, не очень поучительно.
Дискретная ящерица

4

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

Позвольте мне напечатать такой алгоритм для вас ... Ах, но если я сделаю это, я смогу представить этот алгоритм с кодировкой моего напечатанного текста.

Как насчет представления моего алгоритма, используя некоторые «аналоговые средства», скажем, положением нескольких монет на моем столе. Хотя положение этих монет можно смоделировать с помощью некоторых действительных чисел (которые в некоторых кодировках невозможно представить окончательно), все это описание снова можно считать представлением моего алгоритма и снова можно закодировать в битовую строку!

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

Итак, почему мы должны рассматривать существование чего-то, о чем мы не можем говорить? Возможно, интересно для философии, но не для науки. Следовательно, мы определяем понятие алгоритма так , чтобы оно могло быть представлено битовой строкой, поскольку тогда мы, по крайней мере, знаем, что мы можем говорить обо всех алгоритмах.


Хотя приведенный выше ответ на заданный вопрос, я думаю, что путаница в приведенном примере в основном связана с тем фактом, что представление должно только однозначно представлять некоторый алгоритм. Способ представления не должен включать фактические вычисления, вызываемые алгоритмом! Это очень полезно, так как это означает, что мы также можем представлять неисчислимые алгоритмы!


рAр

1
Aрр


р

@ Рафаэль Да, а? Неудивительно, что записать несчетное количество алгоритмов невозможно. И снова вы заявляете, что «выражаете» некоторые алгоритмы, которые нельзя записать. Я не понимаю, что вы подразумеваете под «экспресс», но, по крайней мере, это подразумевает репрезентацию. Поскольку мое утверждение начинается с предположения, что алгоритм не представлен, я не вижу, как это противоречит моему утверждению.
Дискретная ящерица

2

Еще один способ увидеть это через теорию информации. Все кодировки значимой / полезной информации / вопросов могут быть преобразованы в двоичные «последовательности».

Большая часть поля посвящена вопросу: «Как задать наименьшее среднее количество вопросов для передачи значимой части информации?» На практике это то же самое, что «каков оптимальный подход к наименьшему количеству вопросов« да / нет », чтобы понять, что было сообщено или сказано?»

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