Приклад алгоритму, якому бракує доказів коректності


18

У нас є логіка Хоара. Чому все ще можливо, що алгоритм правильний, але немає доказів його правильності? Припустимо, алгоритм виражений у С. Тоді ми можемо поетапно стверджувати, що він робить те, що повинен робити.

Отже, моє запитання:

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

EDIT: Я думаю, що невеликий фон може допомогти уточнити, куди я йду. Дозвольте мені процитувати Скотта Аронсона:

Починаючи з 1970-х років, існує припущення, що P NP може бути незалежним (тобто не підданим і не спростованим) від стандартних математичних систем аксіом, таких як теорія множин Зермело-Френкеля. Щоб було зрозуміло, це означало б і те

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

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

Я маю на увазі другу можливість. Оскільки Ааронсон може так впевнено перерахувати це як можливість, я думаю, що повинен бути існуючий приклад типу 2. Тому я задаю це питання. Але, схоже, швидкої і зрозумілої відповіді не видно.


17
Що означає сказати, що алгоритм правильний, якщо у нас немає доказів правильності?
Девід Річербі

14
Ви маєте на увазі "доказ правильності неможливий" чи "ніхто не довів, що це правильно"?
gnasher729

12
Алгоритми не повинні бути правильними ... припустимо, у вас це: (1) вранці покладіть порожнє відро на підвіконня. (2) зняти його ввечері. (3) виміряти об'єм води у відрі. (4) повторити наступного ранку. Це опис алгоритму, але він не описує нічого, що може бути без розтягнення, званим "правильним". Цікаво, що більшість програмних програм у світі написані саме таким чином: він просто не стосується правильності того, що він взагалі робить.
wvxvw

@wvxvw Мене тоді бентежить, що означає алгоритм "правильний" тоді? Якщо він робить те, що мав робити, чи не означає це, що це правильно? Якби метою вашого сценарію було знайти середню кількість води, зібраної у відро під час опадів, на кожен день, чи не був би алгоритм у цьому випадку правильним?
Абдул

8
@chi ви не розумієте ... це не те, що програмісти не піклуються про правильність свого коду, це те, що для деяких алгоритмів поняття "правильність" не застосовується. Візьміть якусь програму .NET WindowsForms, яка щось говорить про це: "покладіть цю кнопку з цією міткою на цю позицію, потім поставте цю іншу кнопку в цю іншу позицію і так далі ..." - може бути певна інтерпретація того, що це Програма робить, згідно з якою те, що вона робиться, може бути оцінене як (не) правильне (наприклад, графічний дизайнер каже, що "виглядає некрасиво"), але це настільки, наскільки це йде.
wvxvw

Відповіді:


50

Ось алгоритм функції ідентичності:

  • Вхід: n
  • Перевірте, чи й двійковий рядок кодує доказ 0 > 1 в ZFC, і якщо так, виведіть n + 1n0>1н+1
  • В іншому випадку виведіть н

Більшість людей підозрює, що цей алгоритм обчислює функцію ідентичності, але ми не знаємо, і ми не можемо довести це у загальновизнаній для математики рамках ZFC .


2
Ви впевнені Перевірте, чи й двійковий рядок кодує доказ 0 > 1 в ZFCн0>1 - алгоритм?
Дмитро Григор'єв

23
Ні, але перевірка, безумовно, може бути реалізована алгоритмічно (тобто машиною Тьюрінга). Насправді, це одна з вимог, що пред'являються до систем доказів, - це достовірність доказування алгоритмічно перевіряти.
Yuval Filmus

6
@Puppy ZFC доводить . Але це також може довести 0 > 1, якщо (f) воно суперечить. Звичайно, майже всі вважають, що ZFC є послідовним, але через теореми про незавершеність ми не можемо це знати точно. ¬(0>1)0>1
чі

1
@Nathaniel Зовсім не. Ви можете легко довести правильність кожного алгоритму підручника, наприклад. Цей алгоритм відрізняється тим, що він спирається на послідовність ZFC, що саме ZFC не може довести.
Yuval Filmus

1
@Nathaniel: Якщо вам подобається, давайте продовжимо цю дискусію у чаті .
користувач21820

9

Більшість алгоритмів не було доведено правильним в логіці Хоара. Основна причина полягає в тому, що такі докази коректності є надзвичайно дорогими з січня 2017 року, ймовірно, на кілька порядків порівняно з «простим» програмуванням. Проводиться велика робота над зменшенням цієї вартості за рахунок автоматизації, але це суттєва боротьба.

Іншою причиною, чому алгоритм може не мати коректності, і той, який є більш актуальним на практиці, ніж явища незавершеності, про які згадували Юваль та Чі, - це те, що ми можемо не знати, що це за специфікація. Ця проблема має два виміри.

  • Клієнти не знають, чого хочуть. Це відома проблема в інженерії програмного забезпечення, і інженери програмного забезпечення розробили багато підходів для вирішення цього питання.

  • Специфікація складна. Хороший приклад - правильність криптографічних алгоритмів. Лише нещодавно Micali & Goldwasser отримали нагороди Тьюрінга за уточнення того, що означає криптографічна безпека. Однак зауважте, що це визначення є (наскільки мені відомо) для "теоретичної криптографії", де у вас є параметр безпеки nпочинаючи від натуральних чисел, а супротивники - це поліноміальні часові машини Тюрінга. Наскільки мені відомо (будь ласка, виправте мене, якщо я помиляюся) існує невідповідність між теорією та практикою, а конкретні алгоритми, такі як AES та SHA256, не зовсім підпадають під ці теоретичні умови. Я не думаю, що існує повна специфікація для таких алгоритмів, отже, ми не можемо в принципі перевірити їх у сенсі, наприклад, логіки Хоара.н


AES знаходиться в межах компетенції визначень криптографічної безпеки. (Вам потрібно використовувати конкретні визначення безпеки, а не асимптотичні визначення, але ви все одно повинні робити це, якщо ви хочете на практиці безпеки.)
DW

@DW Цікаво. Я цього не знав. Як обійти асимптотичний характер теоретичної криптографії? Чи можете ви, будь ласка, вказати мені на документ про це? Що з конкретними криптографічними хеш-функціями?
Мартін Бергер

en.wikipedia.org/wiki/Concrete_security та вказані там посилання. Функції хешу є складнішим випадком, оскільки це залежить від того, для чого ви їх використовуєте - але складності значною мірою є ортогональними для асимптотичної безпеки проти конкретної безпеки.
DW

2
Для шифрування потрібні два алгоритми: один, який шифрує, той, який розшифровує. Один з них не може бути правильним самостійно. Вони можуть бути правильними лише в парі (ви довели, що розшифровка зашифрованого вводу створює оригінал). Але для шифрування ви хочете, щоб це було невдалим, і це те, що ви не можете зловити з "правильністю".
gnasher729

1
@DW Я повинен дещо не погодитися. Хоча документи Рогауей і Белларе чудово означають, що вони в будь-який спосіб дозволяють підтвердити безпеку примітивів, вводить в оману. Обидва статті, по суті, стосуються протоколів (тобто вони припускають, що примітиви, такі як AES, SHA, RSA тощо), захищені, а потім доказують речі звідти. Залишається суттєвою проблемою доведення самих примітивів. Якщо у вас є будь-які посилання на підтвердження того, що примітиви захищені, я був би зацікавлений. Наприклад, другий документ передбачає, що RSA є важким, що є дуже відкритою проблемою.
DRF

5

Це пов'язано з незавершеністю основної логіки. Дійсно, логіка Хоара зазвичай містить правило послаблення або "до пост" де наслідки

ПП'{П'}c{Q'}Q'Q'{П}c{Q}
ПП',QQ' потрібно доводити в основі основної логіки, як правило, логіки першого порядку (FOL) з деякою теоретично заданою аксіоматизацією на зразок Zermelo-Fraenkel (ZF).

Хитра частина полягає в тому, що ми знаємо, що така логіка є неповною, що було доведено Геделем майже століття тому. Більш конкретно, існує присудок про натуральні числа для яких ми можемо довести всередині логіки P ( 0 ) , P ( 1 ) , P ( 2 ) і так далі для будь-якої заданої природної константи, але немає способу щоб довести п N . P ( n )П(н)П(0)П(1)П(2)нN. П(н) .

З боку інформатики, цю дивну поведінку можна пояснити, використовуючи теорію обчислень. Припустимо, машина Тюрінга коли робота на порожній стрічці не зупиняється на n кроків ( P ( n ) ). Тоді в ZF ми можемо довести такий факт, по суті розгадавши виконання крок за кроком у доказуванні. Однак, коли M розходиться, ми не можемо сподіватися, що зможемо довести розбіжність у ZF ( n . P ( n ) ). Дійсно, якби це було можливо для всіх заданих М , то ми могли б напіввирішити розбіжність, перерахувавши всі можливі докази для n . (МнП(н)Мн. П(н)Мн. П(н) , і зупинка, коли знайдена. Оскільки ми знаємо, що розбіжність не є RE, це неможливо.


5

Проблема: Надрукуйте "Так", якщо кожне парне число ≥ 4 ​​є сумою двох простих чисел, і "Ні", якщо є парне число ≥ 4, що не є сумою двох простих.

Алгоритм: друк "Так"

Більшість людей вважає, що алгоритм правильний. Там немає відомих доказів, і це цілком можливо , що немає ніяких доказів.


3

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

Наприклад, знайти прайм більше, ніж н, почніть рахувати з н+1перевірка, чи кожне число є простим, поки ви не знайдете його. Тепер модифікуйте його, щоб відмовитись і повернутися0 якщо ми не зможемо знайти прем'єр-міністра після цього журнал(н)2намагається. Якщо модифікований алгоритм коли-небудь повернеться0, це неправильно, але ніхто не знає, чи трапляється це колись чи ні. Навіть з такою ж кількістюн кроки, які ми не можемо довести прем’єр, завжди знайдуться.

Отже, у нас є правильний алгоритм, але у нас немає доказів того, що він працює в поліноміальний час, і алгоритм (той самий, але обмежений за часом), який працює в поліноміальний час, але у нас немає доказів того, що він правильний. І як зП=NП Проблема, для цього прикладу також правдоподібно, що таких доказів не існує.

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