Як перевірити, чи два алгоритми повертають однаковий результат для будь-якого введення?


18

Як ви перевіряєте, чи два алгоритми (скажімо, сортування злиття та сортування Naive) повертають однаковий результат для будь-якого вводу, коли безліч безлічі входів?

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


5
як сказав Юваль, не існує жодної процедури, яка б визначила це для будь-яких двох програм. але в спеціальному випадку, як ваш приклад, ви можете це довести: наприклад, якщо ви докажете, що обидва ваші алгоритми повертають відсортовану послідовність і стабільні, ви будете виконані.
Сашо Ніколов

1
Ви хочете автоматичну техніку / алгоритм чи набір ручних прийомів?
Дейв Кларк

@SashoNikolov, якщо продуктивність вважається частиною результату, вам також доведеться показати, що вони працюють в одній і тій же складності часу та простору.
edA-qa mort-ora-y

1
Ви маєте на увазі "перевірити" чи довести? Ви маєте на увазі "будь-який вхід" або всі входи? Яка мотивація та контекст для питання?
Каве

2
@AndresRiorio: Методи доказування відрізняються від алгоритмів, які вирішують загальну проблему. Наприклад, проблема зупинки не може бути вирішена, але, безумовно, можна довести припинення багатьох програм (вручну або автоматизованою евристикою).
Рафаель

Відповіді:


16

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

  • Бісумуляція - це один підхід. Дивіться, наприклад, статтю Гордона про коіндукцію та функціональне програмування .

  • Інший підхід полягає у використанні операційних теорій еквівалентності програми, таких як робота Пітса .

  • Третій підхід - перевірити , чи відповідають обидві програми однаковій функціональній специфікації. Про такий підхід існує тисячі робіт.

  • Четвертий підхід - показати, що одну програму можна переписати на іншу, використовуючи звукові перетворення програми .

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


heu · ris · tic . [Гр. εὑρίσκω "виявити"] n. 1. Методика, розроблена для вирішення проблеми, яка ігнорує, чи може бути доведено, що рішення є правильним, але яке зазвичай дає гарне рішення або вирішує більш просту задачу, яка містить або перетинається з рішенням більш складної проблеми. 2. ( Теор. ) Алгоритм, який не працює.
JeffE

1
Барт Сімпсон: "Неможливо перемогти. Не намагайся".
Дейв Кларк

9
@JeffE: Якщо ви хочете перевірити, чи два алгоритми повертають один і той же результат, ви зробите доказ. Існує маса хороших методик для цього. Звичайно, всі методи неповні, але кого це хвилює? Теорема про незавершеність Геделя - це не привід здавати математику!
Ніл Крішнасвамі

3
@JeffE Просто тому , що не існує обчислювана функції для визначення повернення чи два довільних алгоритмів той же результат не означає , що ви не можете відповісти на запитання , для яких - або двох конкретних алгоритмів, особливо в процесі пошуку докази НЕ обчислюваності функція . Так само є безліч паперів, які підтверджують гарантоване припинення для конкретних алгоритмів, незалежно від того, що неможливо механічно визначити, чи завжди довільний алгоритм припиняється.
Бен

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

10

Щоб трохи детальніше зупинитися на твердженнях "неможливо", ось простий ескіз доказу.

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

Тепер припустимо, що у мене є алгоритм P для визначення того, чи мають дві такі ТМ однаковий вихід на кожен вхід. Тоді, даючи TM A і вхід X , я можу побудувати нову TM B, яка працює так:

  1. Перевірте, чи точно вхід X
  2. Якщо так, то введіть нескінченну петлю
  3. Якщо ні, то запустіть A на вході

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

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


П

@Raphael Так, аргумент, який я накреслив, нічого не говорить про такий обмежений P , лише про те, що повністю загальний не може існувати. Мій інстинкт полягає в тому, що проблема зупинки залишається невирішеною, навіть якщо ви обмежуєте її "алгоритмами сортування", а не загальними алгоритмами, і в цьому випадку доказ неможливості все-таки є, хоча я ніколи не чув такого твердження.
Бен

2
Загалом, теорема Райса стверджує, що не існує обчислюваного способу довести щось про алгоритм, як тільки є хоча б один алгоритм, який має властивість, яку ви намагаєтесь довести, і принаймні той, який цього не робить. Наприклад, з урахуванням алгоритму A не існує обчислювальної функції, яка приймає алгоритм B як вхідний і перевіряє, чи B еквівалентний A.
Жил 'SO-перестань бути злим'

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

2

Загалом це неможливо, але багато обмежень можуть зробити це можливим. Наприклад, ви можете перевірити еквівалентність двох прямолінійних програм з використанням коду BDD. Символічне виконання може впоратися з багатьма іншими справами.


1

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


Існує багато методик, хоча жодна не є повністю автоматичною.
Дейв Кларк

Я не знаю, це можливо чи ні. Ваша відповідь - це лише коментар. не відповідь.

@SaeedAmiri: Я трохи підготувався до контексту відповіді; Я думаю, що це достатньо повно, якщо, можливо, не особливо добре.
Рафаель

@Raphael, Скорочення, яке є на увазі Юваля, очевидно, і я не думаю, що ОП цього не знає, але важка проблема ІМО - це знайти шлях для особливих випадків, тож це очевидне зменшення може стати коментарем, щоб просто нагадати про ОП для загального випадку.

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