Чому можна припустити, що алгоритм може бути представлений у вигляді бітового рядка?


17

Я починаю читати книгу про обчислювальну складність та машини Тюрінга. Ось цитата:

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

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

Наприклад, якщо у мене є алгоритм, який приймає як вхід, і обчислює ( x + 1 ) 2 або:x(x+1)2

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

Як це можна представити як рядок, використовуючи алфавіт ?{0,1}


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

1
Я думаю, що ОП може прийти до цього з іншої точки зору, виходячи з неоднозначності в цитованому тексті. Я думаю, що OP означає «як можна створити всю машину та алгоритм як біт-рядок», а не вхід до самої машини Тьюрінга. Цитований текст означає, що весь алгоритм можна виконати самостійно, але кодований utf біт мови c не говорить нічого про те, як машина насправді діятиме на цей рядок.
Sentinel

3
... Я думаю, що всі тут нерозуміють джерело і занадто далеко переносять жарт за рахунок недосвідченості ромів. Більшість цих коментарів та відповідей говорять про кодування тексту для довільної передачі, тоді як цитата - про кодування алгоритму споживання машиною Тьюрінга. Відповідна (наразі) прийнята відповідь принаймні стосується її у другому реченні.
Ізката

2
@Izkata Я не впевнений, чи знаєте ви, що завдяки універсальності ці два твердження рівноцінні.
Конрад Рудольф

15
Найсмішніше, що для того, щоб я міг прочитати ваш кодований алгоритм, його обов'язково потрібно було перетворити на послідовність бітів, як тільки ви його набрали. Він ніколи не був представлений по-різному - аж від вашої клавіатури до мого монітора. Воно мало не бінарне представлення лише в нашому розумі; і на фізіологічному рівні, коли ви дивитеся на синапси, навіть це є дискусійним.
Пітер - Відновити Моніку

Відповіді:


45

Найбільш наївна і проста відповідь на ваше запитання полягає в тому, що наданий код (і компільований машинний код) насправді представлений у вигляді синтаксичних рядків {0,1} *. Крім того, оскільки ви говорите про машини turing, що програми, які вони виконують, є лінійним переліком операцій / інструкцій, немає жодної причини, яку вони не можуть бути представлені як біти / байти.


Як саме ви представляєте машину Тьюрінга як список інструкцій? Звичайне визначення - це щось подібне .
svick

@svick Як було сказано у моїй відповіді нижче, ви використовуєте універсальну TM, яка приймає опис TM як вхідний (закодований відповідним чином)
dseuss

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

@LukStorms Я не думаю, що ти вже можеш називати це "машиною Тюрінга".
svick

52

Ви вже представляєте цю функцію як текст. Перетворіть кожен символ в однобайтове значення за допомогою кодування ASCII. Тоді результат - це послідовність байтів, тобто послідовність бітів, тобто рядок над алфавітом . Ось один приклад кодування.{0,1}


Саме так. І як я вже говорив вище, це сталося, поки Рома писав це. Навіть гліфи, які я бачу на моєму моніторі, - це пікселі, тобто двійкові дані, що надсилаються по двійковій передачі даних з бінарної пам'яті, підключеної до двійкової мережі через двійкові контролери. Чи можливо представити кожен алгоритм як бітовий рядок? Більше того: це неминуче, якщо ви не обмежуєте себе аналоговими засобами масової інформації та спілкуванням віч-на-віч.
Пітер - Відновлення Моніки

@ PeterA.Schneider Використання аналогових носіїв чи віч-на-віч не обов'язково означає, що немає вбудованого дискретного кодування. Використання природної мови не далеко від використання дискретного кодування, чи не так?
Жан-Батист Юньєс

32

Я не можу чинити опір ...

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

⢱⠀
⢸⠁
⠊

(Точки вище позначають ці нулі, пробіли нулі).


5
Забавно (+1), але це підкреслює по суті довільний характер кодування.
Джон Коулман

4
Приємно писати компілятор для цього :)
Barmar


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
Теза Церкви-Тьюрінга не є теоремою, і вона не передбачає жодного визначення поняття алгоритму, яке є неофіційним. Я також не бачу необхідності посилатися на тезу Церкви Тьюрінга. "Глибока" причина, чому деякі об'єкти можуть бути представлені у вигляді кінцевих рядків, а деякі не можуть, полягає в тому, що деякі набори є підрахунковими, а деякі - ні.
quicksort

Я бачу, що "алгоритм може бути закодований як рядок, якщо ми вкажемо ін'єкцію між компонентами машинної специфікації та набором рядків мовою". OP робить це у своєму прикладі, беручи машину, представлену " $ (x + 1) ^ 2 $ ", і повторно представляючи її як рядок мовою добре сформованих функцій C (або BCPL, C ++ та ін.) .
Ерік Тауерс

1
@EricTowers Що вимагає тези Церкви Тьюрінга. В іншому випадку не можна бути впевненим, що існує машинна специфікація алгоритму для всіх алгоритмів.
Корт Аммон - Відновіть Моніку

1
Я стверджую, що "алгоритм [що] вимагає незліченної нескінченної кількості символів для вираження" не може бути виражений. Такий вираз повинен використовувати незліченну кількість символів, інакше він може бути виражений меншою підмовою. Крім того, будь-який (нерозумний) вираз над нескінченним алфавітом має нескінченну кількість ентропії майже у всіх своїх символах, тому не викликає виразу (тобто фактично не може спілкуватися з одержувачем). Усі фінальні логіки відмовляються працювати на таких нескінченних рядках, і я не знаю інфінітарної логіки, яка дозволить працювати над незлічуваними рядками.
Ерік Тауерс

1
Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
DW

4

Це твердження засноване на існуванні універсальних ТМ . Це в основному програмовані ТМ, які можуть імітувати будь-яку іншу ТМ, максимум з полі-накладних витрат. Тому ваша програма є просто частиною вхідних даних, кодованих як нулі та одиниці.


1
@Discretelizard, я не йду за тобою. Будь-який алгоритм виражається як вхід до універсальної ТМ. Мови можуть бути обчислюваними або нерозбірними; Я не знайомий із будь-яким стандартним поняттям обчислюваності для алгоритмів, тому я не впевнений, до чого ви стикаєтесь. Що би означало мати незрівнянний алгоритм? Можливо, ви думаєте про алгоритми, які не обов'язково припиняються? Але універсальна ТМ все ще може запускати такі алгоритми.
DW

@Discretelizard Я також не стежу за тобою. Працювати на машині Тьюрінга - це, по суті, визначення алгоритму. Я припускаю, що ви могли б поговорити про "алгоритм" для, скажімо, машини Тьюрінга з оракулом для проблеми зупинки, але, як правило, "алгоритм" означає "те, що ви можете зробити на машині Тьюрінга".
Девід Річербі

@DavidRicherby Правда, власне визначення алгоритму є більш суворим, я думаю. Але це питання стосується того, чому ми накладаємо набагато більш м'яке обмеження і говоримо, що, на мою думку, ще сильніше обмеження не дуже повчальне.
Дискретна ящірка

4

Ну, давайте поговоримо про алгоритми, які не можуть бути представлені як кінцевий бітовий рядок для будь-якого виду кодування.

Дозвольте мені набрати такий алгоритм для вас ... Ах, але якщо я це зробити, я можу представляти цей алгоритм з кодуванням мого набраного тексту.

Як щодо представлення мого алгоритму з використанням деяких «аналогових засобів», скажімо, по позиції кількох монет на моєму столі. Хоча положення цих монет можна змоделювати за допомогою деяких реальних цифр (які можуть бути в деяких кодуваннях неможливо остаточно представити), весь цей опис знову можна вважати поданням мого алгоритму і знову можна закодувати в бітовий рядок!

Я сподіваюсь, що ці приклади дають зрозуміти, що якщо якийсь алгоритм не може бути представлений обмеженою бітовою рядком, у нас взагалі немає засобів опису цього алгоритму!

Отже, чому ми б вважали існування чогось, про що ми не можемо говорити? Можливо, цікавий для філософії, але не для науки. Отже, ми визначаємо поняття алгоритму таким чином, що воно може бути представлене бітовим рядком, оскільки тоді ми принаймні знаємо, що ми можемо говорити про всі алгоритми.


Хоча вищезазначена відповідь на поставлене запитання, я думаю, що плутанина щодо наведеного прикладу здебільшого пов’язана з тим, що представлення потребує лише унікального представлення деякого алгоритму. Спосіб подання не повинен включати фактичні обчислення, викликані алгоритмом! Це дуже корисно, оскільки це означає, що ми також можемо представляти непереборні алгоритми!


"якщо якийсь алгоритм не може бути представлений кінцевим бітовим рядком, ми взагалі не можемо описати цей алгоритм!" - Це не зовсім так. Можна сказати: "Для кожного реального числаr, розглянемо алгоритм Аrяк ... ". Тоді більшість із цих алгоритмів не можна записати, але, як-то, ми все-таки висловили їх усі.
Рафаель

1
Аr це чітке представлення цього алгоритму, і для всього алгоритму, який ви хочете представити, просто виберіть символ для відображення значення R. So, the algorithm can be represented. Note that this is only a one-way implication, the other way around need not hold.
Discrete lizard


@Discretelizard У вас не вистачить символів для rшвидко.
Рафаель

@Raphael Так, і? Не дивно, що записати незліченну кількість алгоритмів неможливо. І знову, ви стверджуєте, що ви "виражаєте" деякі алгоритми, які неможливо записати. Я не розумію, що ви маєте на увазі під «експресом», але, мабуть, це мається на увазі представництво. Оскільки моя заява починається з припущення, що алгоритм не представлений, я не бачу, як це суперечить моїй заяві.
Дискретна ящірка

2

Ще один спосіб бачити це через теорію інформації. Всі кодування змістовної / корисної інформації / питань можуть бути складені у двійкові «послідовності».

Much of the field goes to the question, "what is the way to ask the least average number of questions to communicate a meaningful piece of information?" In practice, this is the same as "what is the optimal approach to asking the least number of yes/no questions to understand what was communicated or said?"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.