Чи можна обчислити, чи однакові дві функції розширення?


9

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

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

Чи варто дивитись на денотаційну семантику чи це не пов'язано?

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

Відповіді:


8

Так. Якщо ви можете переконатися, що вони однакові, то це може зробити і комп’ютер.

Ось коротка специфікація для цілого сортування в Coq:

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

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

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

У інженерно-технічному світі пошук еквівалентно функцій, відомих як «семантичне виявлення клонів».

Дейв Кларк також дав хорошу відповідь на це питання на CS StackExchange: /cs/2059/how-do-you-check-if-two-algorithms-return-the-same-result -для будь-якого вводу

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


Дякую за відповідь! Це саме те, що я шукав.
Matthijs Steen

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

5

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

Перевірка може тривати в багатьох формах, ви можете, наприклад, пояснити в теорії множин ZFC, використовуючи оперативну семантику. Однак це було б боляче. Якщо денотаційна семантика існує, їх також можна використовувати, але хороша денотаційна семантика існує лише для кількох мов. Зазвичай для використання програмної логіки, наприклад, логіки Хоара , для показу рівності розширень програм. Для того, щоб зробити це, для логіки Хоара для мов з функціями зазвичай потрібна аксіома, що це говоритьf=gxα.f(x)=g(x), припускаючи, що f і g - це функції типу αβ (деталі варіації аксіоми з деталями обраного підходу до логіки Хоара).


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

@ Matthijs Steen: Добру денотаційну семантику для мов програмування з цікавими функціями здається складною. Логіка Хоара, навпаки, процвітала в останнє десятиліття, і ми можемо побудувати їх майже для будь-якої мови програмування зараз. Рівність розширення не можна визначити, оскільки (трохи спростивши) в іншому випадку ви можете перевірити, чи є довільна програмаP контекстуально еквівалентний 0, завжди закінчується програма, яка є варіантом проблеми зупинки. Якщо ви киньте на мову достатньо обмежених умов, ви, зрештою, закінчитесь тим, що ... (продовження)
Мартін Бергер

... має рішучу контекстуальну рівність. Але зауважимо, що Р. Лодер показав, що навіть фінальний PCF має неоднозначну контекстуальну еквівалентність.
Мартін Бергер

-2

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


1
Чи не зазначається, що "... для будь-якої нетривіальної властивості часткових функцій ...", то це не було б можливим вирішити для загальних функцій?
Matthijs Steen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.