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


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=g⇔∀xα.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.