Чому запис математичних доказів є більш відмовними, ніж написання комп'ютерного коду?


190

Я помітив, що мені набагато простіше записати математичні докази, не допускаючи помилок, ніж записати комп’ютерну програму без помилок.

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

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

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

Насправді, якби це не було, то математика навряд чи була б можливою, як мені здається.

Отже, це змусило мене задати питання: Що настільки відрізняється від написання бездоганних математичних доказів та написання безвідмовного комп’ютерного коду, що робить його таким, що перший є набагато більш простежуваним, ніж другий?

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

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

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

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

Це означає, що процедура перевірки помилок у математичному доведенні по суті лінійна за кількістю етапів доказування, але процедура перевірки помилок у комп'ютерному коді по суті є експоненціальною у кількості рядків коду.

Що ти думаєш?

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


3
Вам відомі докази коректності програм, як на папері, так і в механізованих доказів теореми? Обидва вони існують і суперечать вашому оновленню. Правда, це те, що програмування, як зазвичай навчають, мало стосується програмування з підтвердженням правильності.
Blaisorblade

76
Нагадує цитату Кнут, я думаю, що "Остерігайтеся наведеного вище коду! Я лише довів його правильність, я ніколи його не перевіряв"
Хаген фон Ейтцен

Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Жиль

7
Знайдіть мені рукописний доказ з математики, який становить 100 мільйонів рядків і не має "помилок", і я дам вам все, що маю.
Давор

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

Відповіді:


226

Дозвольте запропонувати одну причину та одну помилкову думку як відповідь на ваше запитання.

Основна причина , що простіше писати ( по- видимому) правильні математичні докази, що вони написані на дуже високому рівні. Припустимо, ви могли написати програму так:

function MaximumWindow(A, n, w):
    using a sliding window, calculate (in O(n)) the sums of all length-w windows
    return the maximum sum (be smart and use only O(1) memory)

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

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

Важливим хибним уявленням є те, що математичні докази часто є правильними. Насправді це, мабуть, досить оптимістично. Дуже важко писати складні докази без помилок, а документи часто містять помилки. Мабуть, найвідоміші останні випадки - це перша спроба Війла на (особливий випадок) теореми про модульність (яка передбачає останню теорему Ферма) та різні прогалини в класифікації кінцевих простих груп, включаючи близько 1000 сторінок на квазітинових групах, які були написана через 20 років після того, як класифікація була нібито закінчена.

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


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

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

3
@AlexVong Одна з проблем полягає в тому, що писати офіційну специфікацію для нетривіального коду (щоб ви могли переконатися, що код насправді відповідає специфікації) майже неможливо. Наприклад, чи можете ви уявити, наскільки складною буде формальна специфікація для браузера (включаючи всю взаємодію з користувачем, усі підтримувані формати файлів та протоколи тощо)?
svick

2
@svick Ви праві, що стосується взаємодії з користувачами, іноді навіть не зрозуміло, якою має бути правильна поведінка. Тож нам слід замість цього зосередитись на чомусь із належною формальною специфікацією (наприклад, доказ, компілятор).
Алекс Вонг

1
Справді. Це також може бути поясненням того, чому багато людей вважають, що кодування мовами нижчого рівня є набагато більш втомливим і менш веселим, ніж кодування на абстрактних мовах високого рівня. Хоча це може відрізнятися і від людини, звичайно (Деякі можуть навіть насолоджуватися побудовою апаратних / електронних мікросхем низького рівня більше, ніж писати програмне забезпечення, яке працює на них? Також код нижчого рівня все ще може бути незамінним у багатьох випадках і добре його записувати) може бути дефіцитним вмінням / подвигом, гідним самої похвали).
xji

77

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

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

Стандарт правильності та повноти, необхідний для того, щоб комп'ютерна програма взагалі працювала, на пару порядків вища, ніж стандарт математичних спільнот, що підтверджують дійсні докази. Тим не менш, великі комп'ютерні програми, навіть коли вони були дуже ретельно написані і дуже ретельно перевірені, завжди здаються помилками. [...] Математика, як ми практикуємо, набагато формально повніша і точніша, ніж інші науки, але формально набагато менш повна і точна за своїм змістом, ніж комп'ютерні програми. Різниця стосується не лише кількості зусиль: вид зусиль якісно відрізняється. У великих комп'ютерних програмах необхідно витратити величезну кількість зусиль для безлічі питань сумісності: переконання у відповідності всіх визначень, вироблення "хорошого" структури даних, які мають корисну, але не громіздку спільність, вирішуючи "правильну" загальність для функцій тощо. Частка енергії, витраченої на робочу частину великої програми, на відміну від бухгалтерської частини, напрочуд мала. Через проблеми сумісності, які майже неминуче переживають нестабільність, оскільки «правильні» визначення змінюються в міру додавання загальності та функціональності, комп'ютерні програми, як правило, потрібно переписувати часто, часто з нуля.

ПРО ДОКАЗ І ПРОГРАМ В МАТЕМАТИКІ (с. 9-10), автор WILLIAM P. THURSTON https://arxiv.org/pdf/math/9404236.pdf


3
Суть щодо "повторного використання коду" є цілком придатною. Переклад довгого доказу з російської на англійську потребує досить багато друку ; але переклад великої комп’ютерної програми з, скажімо, C ++ на Java, вимагає досить багато роздумів . Крім того, воскресити докази 3000 років у давньогрецькій мові так само просто; воскресити 30-річну програму в PL / 1 так само важко чи важче.
Квомплусон

2
Давньогрецький приклад також змусив мене зрозуміти: Програмісти використовують тонни місцевого сленгу і розмовних, таких , як (void*)1і open('/dev/null'), що не може навіть бути стерпним між різними субкультурами, НЕ кажучи вже про перекладається на мову призначення. (Читачеві щось на кшталт того, що він повинен сприймати їх приблизну семантику за допомогою багаторічного досвіду.) Я думаю, що математичні докази містять менше подібного "сленгу". Якщо доказ використовує слово, його фактичне універсальне значення читач повинен якось зрозуміти. Комп'ютерні програми навіть не мають універсального значення!
Квомплусон

1
+1, тому що, як конструктивіст , розкріпачена презумпція відмінного від довільно великого значення, приводить мене в непридатність. Це піднімається від помилковості рівня цінності до логічної помилки, коли математики починають говорити про нескінченні ряди, а потім наводять аргументи на основі цих рядів, роблячи помилку нарівні із прихованою- 0 помилковість. 00
Нат

@Nat ви можете розробити? Я не розумію.
Григорій Магаршак

@GregoryMagarshak Цього відповідь показав випадок , в якому за умови , що нескінченність , дійсних в будівництві ряду призводить до омани, яке я описував як як цей hidden- помилковості00("замаскована" версія нижче в розділі Вікіпедії). Класичний математик може сказати, що помилкою було припущення, що нескінченний ряд сходиться, хоча конструктивіст описує помилковість як некваліфіковану презумпцію нескінченності.
Нат

55

Дозвольте почати, цитуючи EW Dijkstra:

"Програмування - одна з найскладніших галузей прикладної математики; біднішим математикам краще залишатися чистими математиками". (від EWD498)

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

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

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

Отже, ви не повинні дивуватися, якщо правильні докази відносно відмовлені: це сенс усієї "вправи". (Все-таки це не означає, що помилки не існують або ледве існують. Помилка - це лише людина, - кажуть вони)

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

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

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


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


Як згадується в коментарях @wvxvw, наступні параграфи з "приміток про структуроване програмування" (EWD249, стор. 21) є дуже актуальними:

(...) Програма ніколи не є самоціллю; мета програми - викликати обчислення, а мета обчислень - встановити бажаний ефект. Хоча програма є кінцевим продуктом, виготовленим програмістом, можливі обчислення, викликані нею, "виготовлення" яких залишається машині! - справжній предмет його торгівлі. Наприклад, щоразу, коли програміст стверджує, що його програма правильна, він дійсно робить твердження про обчислення, які воно може викликати.

(...) У певному сенсі скласти програму важче, ніж створення математичної теорії: і програма, і теорія є структурованими, позачасовими об'єктами. Але хоча математична теорія має сенс, як вона є, програма має сенс лише через її виконання.


2
Я просто мирянин; на що насправді посилався Дайкстра під "програмуванням"?
Ovi

2
@ Ovi Я точно не впевнений, але головна відмінність полягає в тому, що він говорить про (нетривіальне) алгоритмічне вирішення проблем більше, ніж про «загальні» завдання програмування, тобто він, звичайно, не говорить про якусь програму CRUD, до якої потрібно підключити деякі існуючі архітектури або інші компоненти тощо. Більше про думку Діккстра про програмування можна побачити у цій відповіді
Дискретна ящірка

3
Оновлення для цитування Dijkstra, але ви вибрали неправильне місце! Він багато писав про цю проблему в перших параграфах Структурного програмування. Я не хотів би змінювати вашу відповідь, подаючи іншу цитату, але я би сподівався, що ви захочете додати більше відповіді з цього паперу до своєї відповіді!
wvxvw

@ Ові, я здогадуюсь у вашому питанні, це те, що програмування у часи Дікстри частіше означало написання асемблерного кодексу проти сучасної епохи мов високого рівня. Аналогічно, я читаю видання Mythical Man-Month у 1974 р., Концепції все ще актуальні, але технічні посилання - це асемблер на рівні системи або PL / I, що значно відрізняється від того, що більшість людей вважають програмуванням сьогодні
JimLohse

46

Лампорт дає певні підстави для розбіжностей щодо поширеності помилок у доказуванні в Як написати доказ (стор. 8-9) :

Десь двадцять років тому я вирішив написати доказ теореми Шредера-Бернштейна для вступного класу з математики. Найпростіший доказ, який я міг знайти, був у класичному тексті загальної топології Келлі. Оскільки Келлі писав для більш досконалої аудиторії, мені довелося додати багато пояснень до його доказу на півсторінках. Я написав п'ять сторінок, коли зрозумів, що докази Келлі були невірними. Нещодавно я хотів проілюструвати лекцію про свій стиль доказування переконливим неправильним доказом, тому я звернувся до Келлі. Я не міг знайти нічого поганого з його доказом; здавалося явно правильним! Читання та перечитування доказів переконувало мене, що або моя пам’ять вийшла з ладу, або я був дуже дурний двадцять років тому. Тим не менш, доказ Келлі був коротким і він послужив би приємним прикладом, тому я почав переписувати це як структурований доказ.

... Стиль вперше застосовано до доказів звичайних теорем у роботі, яку я написав з Мартіном Абаді. Він уже писав звичайні докази - докази, які були досить хорошими, щоб переконати нас і, імовірно, арбітрів. Переписуючи докази в структурованому стилі, ми виявили, що майже кожен мав серйозні помилки, хоча теореми були правильними. Будь-яка надія, що неправильні докази можуть не призвести до неправильних теорем, була знищена в нашій наступній співпраці. Раз і знову ми робимо домисел і пишемо на дошці доказний ескіз - ескіз, який легко можна було б перетворити на переконливий загальнодоказний доказ - лише щоб виявити, намагаючись написати структурований доказ, що гіпотеза була помилковою. З тих пір я ніколи не вірив результату без ретельного, структурованого доказу.


6
Цей же документ: "Анекдотичні дані свідчать про те, що аж третина всіх публікацій, опублікованих у математичних журналах, містить помилки - не просто незначні помилки, а неправильні теореми та докази". Що ж, це було в 90-х, але чи це сьогодні різне? Напевно, ті папери, які існували в ті часи, все ще існують, і все накопичується ... Отже, я не зовсім переконаний, що математичні докази, що містяться в документах, містять менше помилок.
МаркокраМ

Захоплюючий анекдот, але я не бачу, що він безпосередньо відповідає або займається питанням. Чи хотіли б ви відредагувати свою відповідь, щоб більш безпосередньо відповісти на поставлене питання? Ви стверджуєте, що математичні докази так само несправні, як і написання комп'ютерного коду? Чи є у вас додаткові докази для цього, які ви можете надати? Анекдот чи два насправді цього не демонструють, чи не так?
DW

@DW Я надсилаю електронне повідомлення Леслі, якщо він може дати додаткові свідчення щодо претензії.
MarkokraM

3
@DW Леслі в своїй щирій відповіді розповів, що його колега провів розслідування з 51 доказом, опублікованим в Math Reviews на той час. На його думку, це є більш ніж анекдотичним, але не підходить для вагомих доказів через декілька фактів. Справа була складнішою, тому що деякі помилки у доказуванні траплялися через те, що вони використовували помилкові докази, випускні раніше опубліковані статті тощо. Як перевірити математичні докази програмно, все ще залишається величезним питанням. Програми, створені для інтерактивного доказування, знаходяться на дуже ранній стадії. Принаймні інтерфейс їх.
MarkokraM

@DW Анекдот або два демонструє, як математичний доказ може здаватися "правильним", але насправді бути невірним. Кожному, хто написав складний комп’ютерний алгоритм і зробив математичний доказ, і намагався написати комп'ютерний алгоритм, як математичний доказ, а потім виявити, як "алгоритм" високого рівня видається багатьма, багатьма помилками в деталях, результат зовсім не дивно.
Якк

39

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

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

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


14
+1 за ваш останній абзац. Хоча математичні докази в принципі будуються один на одного, зазвичай основи добре зрозумілі, аналог комп'ютерних бібліотек (хоча вони також мають помилки ...), а фактичне підтвердження не надто довге. На відміну від цього, споживче програмне забезпечення є довгим і складним, і тому є набагато більше можливостей вийти з ладу.
Юваль Фільм

6
На практиці, інша проблема споживчого програмного забезпечення полягає в тому, що «правильна» поведінка часто погано визначається вперед, і те, що раніше було правильним, стає неправильним. Було б як спробувати написати доказ лише для того, щоб з’ясувати, що люди вирішили змінити аксіоми. Ви можете це виправити в нотації, правда?
Дан Брайант

2
@DanBryant Така ситуація трапляється в математиці. Зокрема, визначення термінів змінюються з часом і часто є неоднозначними навіть правильно, оскільки вони використовуються. "Докази та спростування" Імре Лакатоса описує це терміном "багатокутник". Схожа річ трапилася і з "функцією", і меншою мірою "інтегралом". Навіть сьогодні "категорія" не є однозначною, і докази та теореми можуть вийти з ладу залежно від того, що саме ви маєте на увазі.
Дерек Елкінс

25

Вони кажуть, що проблема з комп’ютерами полягає в тому, що вони роблять саме те , що ви їм скажете.

Я думаю, це може бути однією з багатьох причин.

Зауважте, що з комп'ютерною програмою автор (ви) розумний, але читач (процесор) німий.
Але з математичним доказом письменник (ви) розумний, а читач (рецензент) також розумний.

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

Наприклад, скажімо, що це крок у доказ:

x2+4x+3x+3=(x+1)(x+3)x+3=x+1

x2+4x+3x+3x=3


3
Чудова відповідь! за винятком того, що як комп’ютер я заперечую проти використання вами слова "без потреби". ;) [Припустимо, це був лише один крок у більшій доказці, яка мала на меті довести, що -xце складене. Той факт, що цей крок є неправильним, коли він -x = 3має велике значення для правильності
складеного

@Quuxplusone: = P
Мехрдад

Комп'ютери також можуть використовувати символічні математичні та недетерміновані правила переписування. Це лише те, що мови, якими ми користуємось, як C ++, дуже дуже низький і засновані на стародавній технології (наприклад, у C менше функцій, ніж у Algol 60). Виняток становлять лише мови для перевірки / перевірки, такі як Idris / Agda, Lisp із символічними рішеннями та Mathematica. ja.wolframalpha.com/input/…
aoeu256

23

Одне питання, яке, на мою думку, не було вирішене у відповіді Юваля, - це те, що, здається, ви порівнюєте різних тварин.

nn!

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

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


18

Що так відрізняється від написання бездоганних математичних доказів та написання безвідмовного комп’ютерного коду, що робить його таким, що перший є набагато більш простежуваним, ніж другий?

Я вважаю, що основними причинами є ідемпотенція (дає однакові результати для тих же входів) та незмінність (не змінюється).

Що робити, якщо математичний доказ може дати різні результати, якщо він був прочитаний у вівторок або коли рік поступив до 2000 року з 1999 року? Що робити, якщо частиною математичного доказу було повернутись на кілька сторінок, переписати кілька рядків і знову почати з цього пункту?

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

Я бачу й інші вторинні фактори:

  1. Математики, як правило, набагато освіченіші, перш ніж намагатися написати вагомий / оприлюднений доказ. 1/4 однойменних професійних розробників почали кодувати менше 6 років тому (див. Опитування SO 2017 ), але я припускаю, що більшість математиків мають понад десятиліття формальної математичної освіти.
  2. Математичні докази рідко тримаються на такому ж рівні уваги, як і комп'ютерний код. Один друкарський помилок може / порушить програму, але десятків помилок помилок може бути недостатньо, щоб знищити цінність доказу (лише його читабельність).
  3. Чорт у деталях, а комп'ютерний код не може пропустити деталі. Докази можуть пропускати кроки, які вважаються простими / звичайними. Є кілька приємних синтаксичних цукрів, доступних у сучасних мовах, але вони жорстко кодовані та досить обмежені порівняно.
  4. Математика старша і має більш міцну основу / ядро. Звичайно, в математиці є безліч нових і блискучих підполів, але більшість основних принципів використовуються десятиліттями. Це призводить до стабільності. З іншого боку, програмісти все ще не згодні з базовою методологією кодування (просто запитайте про розробку Agile та швидкість її прийняття).

Можливо, варто згадати, що еквівалент програмування «невластивості» - це функціональна чистота , яка визнається та підтримується в деяких мовах, таких як Haskell.
Фарап

12

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

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

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

Ще одна причина полягає в тому, що правильність програми залежить від багатьох інших систем, написаних іншими, які знову ж таки не мають чіткої семантики. Існує закон Hyrum, який по суті говорить, якщо ваша бібліотека / служба має спостережувану поведінку (не є частиною її договору), хтось з часом залежатиме від неї. Це по суті означає, що ідея розробки програмного забезпечення в модульній формі з чіткими контрактами, такими як леми в математиці, не працює на практиці. Погіршується мова, якою використовується рефлексія. Навіть якщо програма сьогодні правильна, вона може зламатись завтра, коли хтось зробить якийсь тривіальний рефакторинг в одній із її залежностей.

На практиці зазвичай трапляється тест. Тести діють як те, що очікується від програми. Кожен раз, коли знайдена нова помилка, вони додають тести, щоб її усунути. Це працює певною мірою, але це не є доказом правильності.

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

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

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


Я фактично не впевнений, хто гірше між програмістами та математиками, формально (тобто машинно перевіреним способом) формулюючи специфікації правильності та доводячи код правильним для, скажімо, програми 10KLOC або більшої кількості. З одного боку, ви абсолютно праві, що більшість програмістів не мають добре розвинених навичок доведення теорем. З іншого боку, великі формальні докази схожі на великі програми і вимагають, по суті, навичок програмного забезпечення для управління. Я повністю впевнений, що будь-яке неофіційне підтвердження правильності такої програми не сподівається на те, що воно буде правильним.
Дерек Елкінс

Може бути. У будь-якому випадку та просто для уточнення, я не берусь за формальні докази у своїй відповіді, а лише неформальні докази на рівні, про який ми бачимо в документах з алгоритмів.
Каве

11

Вже є багато хороших відповідей, але причин математика та програмування є ще однакові.

1 Математичні докази, як правило, набагато простіші, ніж комп'ютерні програми. Розглянемо перші кроки гіпотетичного доказу:

Нехай ціле число

Нехай b - ціле число

Нехай c = a + b

Поки доказ чудовий. Давайте перетворимо це на перші кроки подібної програми:

Нехай a = вхід ();

Нехай b = вхід ();

Нехай c = a + b;

У нас вже безліч проблем. Припускаючи, що користувач дійсно ввів ціле число, ми повинні перевірити межі. Є чи більше , ніж -32768 (або що - то мінімальне ІНТ на вашій системі)? Є менш ніж 32767? Тепер ми повинні перевірити те саме, що і для b . І тому, що ми додали a і b, програма не є правильною, якщо не є bбільше -32768 і менше 32767. Це 5 окремих умов, що програміст повинен турбуватися з приводу того, що математик може ігнорувати. Мало того, що програміст повинен переживати за них, він повинен зрозуміти, що робити, коли одна з цих умов не виконаний, і написати код, щоб зробити той, хто вирішив, це спосіб вирішити ці умови. Математика проста. Програмування важко.

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

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


10

Мені подобається відповідь Юваля, але я хотіла трохи відірватися від неї. Однією з причин, вам може бути легше писати докази математики, може бути зведення до платонічної онтології математики. Щоб побачити, що я маю на увазі, врахуйте наступне:

  • Функції в Math чисті (весь результат виклику функції повністю інкапсульований у зворотному значенні, яке детерміновано та обчислюється повністю із вхідного значення).
  • У математиці немає мутації чи переназначення (коли потрібно моделювати такі речі, використовуються функції та послідовності).
  • Математика є референтно прозорою (наприклад, немає вказівників, не існує поняття "за назвою" ("call-by-name vs call-by-value"). Математичні об'єкти мають семантику розширення рівності (якщо "дві" речі однакові у кожному спостережуваному способі, то вони є насправді Те ж саме).

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


7

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

Люди змінюватимуть свої бажання, потреби та вимоги щодо того, що можливо щодня в царині комп'ютерних програм.

Що так відрізняється від написання бездоганних математичних доказів та написання безвідмовного комп’ютерного коду, що робить його таким, що перший є набагато більш простежуваним, ніж другий?

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

Існують проблеми з пам’яттю, продуктивністю та обладнанням, якими можна керувати. Я хотів би, щоб ми не могли думати про тих, коли писали алгоритми, щоб ми могли використовувати чисті та функціональні конструкції для управління цим, але комп'ютерні програми живуть у "реальному" світі апаратних засобів, тоді як математичне доказ лежить у "теорії".


Або, щоб бути більш лаконічним :

введіть тут опис зображення


4

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

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

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

Для вашого "щоденного" програміста та / або бізнесу набагато вигідніше прийняти певний рівень точності в основному правильному коді та продати корисний продукт, а розробники можуть заднім числом виправляти помилки, коли вони виявляються під час його використання.


3
У вас, здається, є вузький погляд на те, що таке математика, і занадто розширений погляд на те, що означає "доведення" комп'ютерної програми. Вам не потрібно доводити всю систему правильною, щоб довести програму правильною, потрібно лише довести, що це правильно, якщо інші компоненти відповідають їх характеристикам. Якщо вони цього не роблять, це не вина вашої програми. З іншого боку, якщо ваша програма виходить з ладу, тому що вона залежить від деталей, які не входять до специфікації цих компонентів, наприклад, варіантів реалізації IEEE754, то це ваша вина.
Дерек Елкінс

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

4

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

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

Я з таким настроєм хотів би звернути увагу читача на той факт, що "ясність" має яскраво виражені кількісні аспекти, що багато математиків, як ні цікаво, здається, не знають. Теорема, що вказує на обґрунтованість висновку, коли виконано десять сторінок, що переповнені умовами, навряд чи є зручним інструментом, оскільки всі умови повинні бути перевірені, коли теорема звертається до неї. В евклідовій геометрії теорема Піфагора дотримується для будь-яких трьох точок A, B і C таким чином, що через A і C пряму можна провести ортогональною до прямої через B і C. Скільки математиків оцінюють, що теорема залишається застосовною, коли деяка або всі точки A, B і C збігаються? але це здається значною мірою відповідальним за зручність використання теореми Піфагора.

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

Це трохи відредаговані останні три абзаци з першої глави Структурного програмування Дійкстри.

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


Що ви маєте на увазі під "довгими математичними доказами"? Доведення теореми другорядних графів досить довге, але насправді ніхто не оспорює. Теорема Фейта-Томпсона має досить тривалий доказ, але ніколи насправді не була в кінцівці. Як ви порівнюєте тривалість доказів та програм? Кількість слів? Чи справді немає помітних відмінностей між доказами та програмами, коли ви порівнюєте докази та програми подібної складності (довжини)?
Yuval Filmus

@YuvalFilmus так само, як у цитаті: десять сторінок тверджень людині довго. Як судити про тривалість програми? Що ж, Дікстра запропонував метрику: довжину її тексту. Я думаю, що це може бути занадто спрощеним, але все-таки хорошим евристичним. Є й інші, більш цікаві показники, як, наприклад,
циклічна

3

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

Аналогічна ситуація була б, якби математик використовував існуючі докази та леми, не повністю розуміючи їх; їхні власні докази, ймовірно, будуть хибними. Хоча це може запропонувати рішення - ідеально вивчити кожну бібліотеку, якою користується; це практично забирає багато часу і може зажадати знань про домен у програміста (я знаю дуже мало послідовності ДНК / синтезу білка; але я можу працювати з цими концепціями за допомогою бібліотек).

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


3
Зачекайте, що змушує вас думати, що математики "повністю розуміють" докази та леми, які вони використовують? Я не впевнений, яку різницю між математиками та програмістами ви намагаєтесь продемонструвати тут.
Дерек Елкінс

3

Я спробую бути оригінальним після всіх чудових відповідей.

Програми - докази

Ізоморфізм Каррі-Говарда говорить нам, типи в програмі є теореми і фактичний код є їх доказ.

Справді, це дуже абстрактний погляд на високому рівні. Ви, мабуть, маєте на увазі те, що писати типовий код важче, оскільки він стає занадто низьким. У більшості випадків вам потрібно "сказати машині, що робити". Або поглянути на це з іншого боку: математики справді добре абстрагуються.

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


Я зовсім не бачу, чи це стосується цього питання. В ОП не було жодних вказівок, що вони говорять про мови програмування з потужними системами типу, і я думаю, що вони мають на увазі більш загальні системи типу. Тож Каррі-Говард у цьому випадку є щось тривіальне.
6005

Я знаю, що це трохи надумано для C або подібних речей. Але моя думка: математика ближче, ніж може подумати типовий початківець CS!
Олег Лобачев

1
Здається, ви "необережний спостерігач" ізоморфізму Крірі-Говарда, на який я посилався у своїй відповіді. Навіть якщо ми маємо ізоморфізм між програмами та доказами, то не випливає, що акт написання програм та написання доказів зовсім подібний. Насправді, може бути навіть так, що всі "цікаві" або "типові" програми не відповідають типовому доказуванню і навпаки.
Дискретна ящірка

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

3

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

π


2
"Математичні докази діють на уявних обчислювальних системах, які мають нескінченну пам'ять і нескінченну обчислювальну потужність". Більшість математичних доказів "діють" на формальних алгебраїчних системах, наприклад, на реальні числа (де ми маємо "нескінченну точність"). Це можна зробити і в програмах: існують так звані комп'ютерні алгебри (CAS), які роблять саме це! Крім того, цілі області математики пов'язані з тим, що ми не можемо представити всі дійсні числа точно як кінцеві числа з плаваючою точкою. Я думаю, ви робите різницю між математикою та програмуванням там, де її немає.
Дискретна ящірка

1
@Discretelizard, так, спеціальні пакети існують з довільною точністю, але навіть тоді наявна пам'ять обмежить фактичну досяжну точність. Також це спеціальні пакети. Лише невелика частка програмування виконується з такими пакетами, і переважно в академічній обстановці.
кробар

π

@Discretelizard, я думаю, моя думка все ще стоїть, більшість програмістів не використовують такі системи CAS. Вони занадто повільні для програмування в реальному світі. Більшість програмувань принципово включає операції з обмеженою кількістю точності. Найпопулярнішими мовами є C, C ++, Python, Java тощо. Жодна версія не використовує представлення стилів CAS за замовчуванням (хоча пакети для цього можуть бути створені в них). Ваш контрприклад - це крихітна ніша підмножини комп'ютерних мов / систем.
кробар

2
@crobar Проблема з вашою відповіддю полягає в тому, що переважна більшість виявлених помилок не пов’язані з помилками з плаваючою комою або цілими переповненнями (хоча вони дійсно приносять пристойну кількість, і ці аспекти, безумовно, роблять повну коректність програми набагато малоймовірною). Однак ви можете зробити більш загальне твердження, що математикам бракує багатьох проблем программістів, таких як продуктивність, час виходу на ринок, ремонтопридатність та обмежена здатність змінювати вимоги, якщо вони виявляться занадто складними.
Дерек Елкінс

3

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

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

І справді, математика може отримати BSOD! Це було б не перший раз!

введіть тут опис зображення

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

Ось зворотний бік. Подивіться, ми вже отримали фінансування, затвердили бізнес-концепцію, всі документи тут вам доступні для читання. Ми просто потрібні вам для виконання, і це впевнена річ!

Не будемо занадто шкодувати і Гільберта , він знав, в що потрапляє. Це просто бізнес.

Якщо ви хочете бути справді впевненими, візьміть все в кожному конкретному випадку і зробіть власні висновки!


3

Я бачу дві важливі причини, чому програми більше схильні до помилок, ніж математичні докази:

1: Програми містять змінні або динамічні об'єкти, що змінюються з плином часу, тоді як математичні об'єкти в доказах зазвичай є статичними. Таким чином, позначення з математики можна використовувати як пряму підтримку міркувань (і якщо a = b, це залишається у випадку), коли це не працює в програмах. Крім того, ця проблема стає набагато гіршою, коли програми паралельні або мають декілька потоків.

2: Математика часто передбачає відносно акуратно визначені об'єкти (графіки, колектори, кільця, групи тощо), тоді як програмування стосується дуже брудних та досить нерегулярних об'єктів: арифметики з обмеженою точністю, кінцевих стеків, перетворення символів на цілі числа, покажчики, сміття, яке потребує збору тощо. Тому колекцію умов, що стосуються правильності, дуже важко пам'ятати.


3

Вам слід розрізняти дві різні "категорії":

  • псевдодокази (або псевдокоди) - ось що ви бачите в книгах. Він написаний природною мовою (наприклад, англійською). Саме це і слід використовувати для вивчення математики (або алгоритмів).
  • формальні докази (або формальний код) - ви пишете їх, коли вам потрібно, щоб ваш доказ (або код) був механічно перевірений (або виконаний). Таке представництво не потребує ніякого «людського інтелекту». Це можна перевірити (або виконати) механічно, дотримуючись деяких заздалегідь визначених кроків (зазвичай це робиться на комп’ютерах сьогодні).

Ми використовуємо псевдо-код вже тисячі років (наприклад, алгоритм Евкліда). Написання формального коду (на формальних мовах, таких як C або Java) стало надзвичайно популярним і корисним після винаходу комп'ютерів. Але, на жаль, формальні докази (у формальних мовах, таких як Principia Mathematica або Metamath) не дуже популярні. І оскільки сьогодні всі псевдокази пишуть, люди часто сперечаються про нові докази. Помилки в них можна виявити через роки, десятиліття чи навіть століття після фактичного «доведення».


3

Я не можу знайти посилання, але я думаю, що Тоні Хоар одного разу сказав щось наступним чином: Відмінність перевірки програми та перевірки доказу полягає в тому, що доказ можна перевіряти два рядки одночасно.

Одним словом: місцевість.

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

Розглянемо цю програму, де x - лише для читання

    assume x >= 0
    p := 0 ;
    var pp := 0 ;
    while( x >= pp + 2*p + 1 ) 
    {
        var q := 1 ;
        var qq := q ;
        var pq := p ;
        while(  pp + 4*pq + 4*qq <= x )
        {
            q, pq, qq := 2*q, 2*pq, 4*qq ;
        }
        p, pp := p + q, pp + 2*pq + qq ;
    }
    assert  p*p <= x < (p+1)*(p+1)

Це легко виконати, але важко перевірити.

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

    assume x >= 0
    p := 0 ;
    var pp := 0 ; 
    while( x >= pp + 2*p + 1 ) 
        invariant p*p <= x 
        invariant pp == p*p
        decreases x-p*p 
    {
        var q := 1 ;
        var qq := q ; 
        var pq := p ; 
        while(  pp + 4*pq + 4*qq <= x )
            invariant (p+q)*(p+q) <= x
            invariant q > 0 
            invariant qq == q*q 
            invariant pq == p*q 
            decreases x-(p+q)*(p+q)
        {
            q, pq, qq := 2*q, 2*pq, 4*qq ;
        }
        assert (p+q)*(p+q) <= x and pp==p*p and pq==p*q and qq==q*q and q>0
        p, pp := p + q, pp + 2*pq + qq ;
    }
    assert  p*p <= x < (p+1)*(p+1)

Повертаючись до початкового запитання: Чому записування математичних доказів є більш відмовними, ніж написання комп'ютерного коду? Оскільки докази призначені для того, щоб їх читачі легко перевірили, їх автори легко перевіряють, і таким чином попереджають авторів, як правило, не допускають (або принаймні зберігають) логічних помилок у своїх доказах. Програмуючи, ми часто не можемо записати причину правильності нашого коду; результат полягає в тому, що і читачам, і автору програми важко перевірити код; результат полягає в тому, що автори роблять (а потім зберігають) помилки.

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


2

Ми могли б запитати, чи складніше на практиці чи в принципі писати докази чи писати код.

На практиці довести набагато важче, ніж кодування. Дуже мало людей, які пройшли два роки математики на рівні коледжу, можуть написати докази, навіть тривіальні. Серед людей, які пройшли два роки навчання на рівні коледжу, мабуть, принаймні 30% можуть вирішити FizzBuzz .

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


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

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

@DW: Ви припускаєте, що (1) бажану поведінку можна повністю вказати у всіх випадках, (2) існує необхідний доказ (тобто проблема не може бути визнана), і (3) якщо доказ існує, тоді ми можемо його знайти. Я думаю, що всі три цих припущення принаймні в деяких випадках помилкові (напевно, майже у всіх випадках). 3 зауважте, що хоча деякі докази можуть бути простими, багато доказів знайти дуже важко.
Бен Кроуелл

@DerekElkins: Моє твердження, що дуже мало студентів коледжу можуть написати навіть тривіальні докази, ґрунтується на моєму власному досвіді з моїми студентами. Це в коледжі громади, тому YMMV. Той факт, що деякі класи геометрії середньої школи включають велику дозу написання доказів, не означає, що всі студенти коледжу можуть писати докази. Вони також повинні знати, як робити базову алгебру, але в моїй школі приблизно половина учнів першокурсників не може - що допомагає пояснити, чому стільки не вдається.
Бен Кроуелл

Це було б гарним поясненням, щоб додати відповідь, щоб пояснити, чому ви не можете скористатися таким же підходом, щоб перевірити правильність програми. Взагалі (2) і (3) рідко є проблемою, ні на практиці, ні в принципі (якщо ви не можете довести програму правильною, пишіть по-іншому, поки не зможете довести її правильність). Однак ваш (1) є важливим моментом, і я думаю, що це посилить відповідь, щоб пояснити, чому це ускладнює те ж саме для програм, що і ми для доказів.
DW

2

Лише невелика частина математичних тверджень, які є правдивими, може бути практично доведена. Більш суттєво неможливо побудувати нетривіальну (*) множину математичних аксіом, яка дозволила б довести всі справжні твердження. Якщо потрібно лише написати програми, щоб зробити невелику частину речей, які можна було б зробити з комп’ютерами, можна було б написати програмно-коректно програмне забезпечення, але комп'ютери часто закликають робити речі, що виходять за рамки того, що доказово правильно програмне забезпечення може виконати.

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


1
"Практично можна довести лише невелику частину математичних тверджень, які є правдивими". - Як ви вимірюєте «порцію»? Це під деяким розподілом вірогідності? Чи є у вас докази на підтвердження цієї заяви?
DW

"Комп'ютери часто закликають робити речі, що виходять за рамки того, що можна довести в правильному програмному забезпеченні." - У вас є докази на це? У вас є приклад? Ви стверджуєте, що "поза тим, що в принципі може бути доведено правильним" або "поза тим, що ми можемо уявити, що доведено на практиці"?
DW

@DW: Якщо X і Y є ортогональними твердженнями, які є істинними, але не доказуються, то для кожного доказуючого твердження P, принаймні два ортогональні твердження (P і X) і (P і Y) є істинними, але не -доказний. Маючи справу з нескінченними множинами, така логіка не обов'язково нічого доводить, оскільки можна використовувати подібну логіку, щоб показати, що вдвічі більше парних цілих чисел, ніж непарних цілих чисел, оскільки для кожного непарного цілого числа можна виділити два парні цілі числа (4x) і (4x + 2), які не пов'язані з будь-якими іншими непарними цілими числами, але, звичайно, парні і непарні цілі числа мають рівну кардинальність.
supercat

@DW: Фраза "мала частина" може, таким чином, мати справжнє значення лише в описі частки правдивих тверджень, які можна практично довести, але я вважаю, що корисно розуміти, що неможливість довести всі правдиві твердження не є "недоліком". Що стосується комп'ютерів, то багато полів звичайно використовують алгоритми, які мають надзвичайно малу, але ненульову, ймовірність виходу з ладу, а потім налаштовують їх так, щоб ймовірність була прийнятно низькою (наприклад, нижче, ніж обладнання, яке вдарило метеором). У багатьох випадках різні режими відмов не є незалежними, тому це може бути по суті неможливим ...
supercat

... визначити ймовірність різних комбінацій відмов. Якщо оцінити ймовірність відмови під час довільного однохвилинного періоду на рівні 10 ^ -500, його можна вимкнути на сотні порядків і все-таки мати надійну систему, але якщо вимкнено на 494 порядків система вийде з ладу приблизно раз на пару років.
supercat

2
  1. Комп'ютерні програми тестуються в реальному світі. Хитра технічна помилка в довгому математичному доказі, яку може зрозуміти лише обмежена кількість людей, має всі шанси залишитися не виявленими. Така ж помилка в програмному продукті, ймовірно, спричинить дивну поведінку, яку помічають звичайні користувачі. Тож приміщення може бути невірним.

  2. Комп'ютерні програми виконують корисні функції реального світу. Вони не повинні бути на 100% правильними, щоб зробити це, а високі норми коректності досить дорогі. Докази корисні лише в тому випадку, якщо вони насправді щось доводять, тому пропуск частини «100% правильної» не є можливим для математиків.

  3. Математичні докази чітко визначені. Якщо доказ хибний, автор допустив помилку. Багато помилок у комп’ютерних програмах виникають через те, що вимоги не надто належним чином передані, або виникає проблема сумісності з тим, про що програміст ніколи не чув.

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


2

Велика частина математики як людської діяльності займається розробкою доменних мов, на яких людині легко перевірити докази.

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

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

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

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

Ще один спосіб сформулювати точку, яку я хочу зробити, - це те, що і мови програмування, і математика в кінці робочого дня розроблені таким чином, що комп'ютерні програми та докази відповідно можливо скласти. Просто компіляція комп’ютерної програми робиться на комп’ютері і забезпечує синтаксичну коректність, яка, як правило, мало стосується правильності самої програми, в той час як "компілювання" доказів робиться людиною і забезпечує синтаксичну коректність, що є тим же самим, що і правильність доказу.


1

Ви тут чесно порівнюєте яблука та апельсини. Несправність і помилка - це не одне і те ж.

Якщо програма порівнює числа, 2і 3це говорить про це 2 is greater than 3, то це може бути через помилку реалізації:

# Buggy implementation
function is_a_greater_than_b(a,b):
  return b > a

Програма все ще залишається без помилок. Якщо порівнювати два числа aі b, він завжди зможе сказати вам, чи bє більший за a. Це просто не те, що ви (програміст) повинні були попросити комп’ютер зробити.


2
Яке тоді ваше визначення "вини" у програмі?
user56834

0

а) Через те, що комп'ютерні програми більше, ніж математичні докази

a.1) Я вважаю, що під час написання складної комп’ютерної програми використовується більше людей, ніж під час написання математичного підтвердження. Це означає, що маржа помилок вище.

b) Оскільки керівники / акціонери більше піклуються про гроші, ніж виправлення невеликих помилок , тим часом ви (як розробник) повинні виконувати свої завдання, щоб відповідати деяким вимогам / термінам / демонстраціям

в) Оскільки ви можете бути програмістом без "глибоких" знань у галузі comp sci, тим часом це важко буде робити в математиці (я вважаю)

Додатково:

НАСА:

Це програмне забезпечення без помилок. Це ідеально, так само досконало, як досягли люди. Розглянемо цю статистику: в останніх трьох версіях програми - кожна 420 000 рядків - мала лише одна помилка. В останніх 11 версіях цього програмного забезпечення було загалом 17 помилок.

Оновіть програмне забезпечення, щоб шаттл мав змогу орієнтуватися на супутники Global Positioning Satelites, що змінює лише 1,5% програми або 6,366 рядків коду. Технічні умови для однієї зміни містять 2500 сторінок, об'єм товщі, ніж телефонна книга. Технічні умови для поточної програми заповнюють 30 томів та містять 40 000 сторінок.

https://www.fastcompany.com/28121/they-write-right-stuff


"Комп'ютерні програми є більшими, ніж математичні докази". Це залежить від програми та доказів. І багато чого з цього видається дуже спекулятивним.
Девід Річербі

@DavidRicherby Добре, що я мав на увазі такі речі, як теорема останнього Ферма та Apollo github.com/chrislgarry/Apollo-11 math.wisc.edu/~boston/869.pdf, і ми навіть не говорили про операційні системи тощо.
Exeus

0

Основні рівні:

Давайте розглянемо речі на найпростішому та найосновнішому рівні.

Для математики маємо:
2 + 3 = 5

Я дізнався про це, коли був дуже-дуже молодим. Я можу переглянути найосновніші елементи: два об’єкти та три об’єкти. Чудово.

Для комп'ютерного програмування більшість людей, як правило, використовують мову високого рівня. Деякі мови високого рівня можуть навіть "скластись" в одну з нижчих мов високого рівня, наприклад C. C потім може бути переведена на мову складання. Мова збірки потім перетворюється в машинний код. Багато людей думають, що на цьому складність закінчується, але це не так: Сучасні процесори приймають машинний код як інструкцію, а потім виконують "мікрокод", щоб фактично виконати ці інструкції.

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

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

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

Модернізація:

Ви запускаєте код, призначений для 286? Або ви запускаєте 64-бітний код?

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

Стандарти використовуваних інструментів:

Мене навчили (товариш, який пройшов більш офіційне навчання комп'ютерному програмуванню, ніж я), що немає такого поняття, як компілятор C, що не потребує помилок, який би відповідав специфікаціям C. Це тому, що мова С в основному передбачає можливість використання нескінченної пам'яті для цілей стека. Очевидно, від такої неможливої ​​вимоги довелося відхилитися від того, коли люди намагалися зробити корисні компілятори, які працювали з фактичними машинами, які мають трохи більш обмежений характер.

На практиці я виявив, що за допомогою JScript у Windows Script Host я зміг досягти багато хорошого, використовуючи об’єкти. (Мені подобається середовище, тому що набір інструментів, необхідний для випробування нового коду, вбудований у сучасні версії Microsoft Windows.) Під час використання цього середовища я виявив, що іноді немає легкодоступної документації про те, як працює об’єкт. Однак використання об’єкта настільки вигідно, що я так чи інакше роблю. Тож, що я б робив, це написати код, який може бути баггі як гніздо шершнів, і робити це в чудово пісочне середовищі, де я можу побачити ефекти та дізнатися про поведінку об'єкта під час взаємодії з ним.

В інших випадках, іноді лише після того, як я з'ясував, як поводиться об'єкт, я виявив, що об'єкт (в комплекті з операційною системою) є помилковим, і що це відома проблема, яку Microsoft навмисно вирішив, що не буде виправлена .

У таких сценаріях я покладаюся на OpenBSD, створений майстерними програмістами, які регулярно (двічі на рік) створюють нові випуски за розкладом, із відомим записом безпеки "лише два віддалені дірки" за 10+ років? (Навіть у них виправлені помилки для менш важких питань.) Ні, ні в якому разі. Я не покладаюся на такий продукт з такою вищою якістю, тому що я працюю в бізнесі, який підтримує бізнес, який постачає людей машинами, які використовують Microsoft Windows, тому над цим повинен працювати мій код.

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

Підсумок

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

Я, нагадаю, здивувався тому, наскільки короткими були дуже корисні та популярні функції, коли я побачив якийсь вихідний код для strlen та strcpy. Наприклад, strlen, можливо, був на кшталт "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"

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

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

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

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

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


1
Хоча ви робите гарний випадок щодо складності програмування, ви ледве не розглядаєте математику! Насправді ви, здається, недооцінюєте складність, пов’язану з формальною математикою: "Коли ви розбиваєте речі з математики, ви потрапляєте на окремі частини, які діти можуть зрозуміти", справді ? Крім того, те саме можна сказати і про достатньо "високого рівня" програмування (наприклад, Scratch призначений для дітей). Також зауважте, що хоча повна специфікація C не реалізується, компілятор, що підтримує важливу підмножину, був показаний формально правильним з використанням комп'ютерних підтверджень.
Дискретна ящірка

2+3=5

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

Дискретна ящірка - це SE Computer Computer. Крім того, прочитавши інші відповіді, перш ніж я публікував, я відчув, що вони торкаються математики набагато більше, ніж комп'ютери. Я відчув, що моя відповідь була кращою, не довшаючи просто додавати слова, які б значною мірою були зайвими з тим, що було написано в іншому місці. /// Що стосується Scratch, високий рівень є складнішим, а не простішим (якщо дивитися на перспективу повного розуміння всіх рухомих частин). У цій перспективі, про яку я писав, збірка простіша, ніж Scratch поверх інших шарів (електронні ворота NAND ще простіші)
TOOGAM

0

Математичні докази описують "що" знання та програми описують "як" знання ".

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

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

У доказі не змінюється стан. Визначено визначення та об'єкти обговорення. Доведення вимагає загальної думки про проблему та розгляду багатьох випадків, але ці випадки фіксуються визначеннями.


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

@Discretelizard Це корисний коментар. Я думаю, що лінія між "що" і "як робити", безумовно, нечітка. Доведення алгоритму робить те, що ви думаєте, що це робить, насправді не описує "як" в моїй свідомості, а просто гарантує, що певні властивості зберігаються. З філософського погляду, я думаю, що "як" знання вимагає листування зі світом. Програми завжди роблять те, що ви їм скажете. Коли у вас є помилка, те, що ви їй сказали, не відповідає світові (що ви моделюєте). Математика, незалежна від програми (як фізичні проблеми), здається, все залежить від узгодженості.
Джастін Майнерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.