Мені дуже подобається це питання. Я не знаю багато, але маю кілька речей (за допомогою статті Вікіпедії , яка має кілька охайних таблиць тощо):
Я думаю, що типи сум / типи об’єднань ( наприклад data Either a b = Left a | Right b
) еквівалентні інклюзивній диз’юнкції. І, хоча я не дуже добре знайомий з Каррі-Говардом, я думаю, це свідчить про це. Розглянемо таку функцію:
andImpliesOr :: (a,b) -> Either a b
andImpliesOr (a,_) = Left a
Якщо я правильно розумію речі, тип говорить, що ( a ∧ b ) → ( a ★ b ), а визначення говорить, що це правда, де ★ включає або виключає, або, залежно від того, що Either
представляє. Ви Either
представляєте ексклюзивний або, ⊕; однак, ( a ∧ b ) ↛ ( a ⊕ b ). Наприклад, ⊤ ∧ ⊤ ≡ ⊤, але ⊤ ⊕ ⊥ ≡ ⊥ та ⊤ ↛ ⊥. Іншими словами, якщо і a, і b відповідають дійсності, то гіпотеза відповідає дійсності, але висновок хибний, і тому цей підтекст повинен бути хибним. Однак, зрозуміло, ( a ∧ b ) → ( a ∨ b), оскільки якщо і a, і b є істинними, то принаймні одне є істинним. Отже, якщо дискриміновані спілки є якоюсь формою роз'єднання, вони повинні бути різноманітним різновидом. Я думаю, що це є доказом, але не соромтеся дезобюювати мене з цього поняття.
Подібним чином, ваші визначення тавтології та абсурду як функції ідентичності та функцій, що не припиняються, трохи не відповідають. Істинна формула представлена типом одиниці , тобто типом, який має лише один елемент ( data ⊤ = ⊤
; часто пишеться ()
та / або Unit
мовами функціонального програмування). Це має сенс: оскільки цей тип гарантовано заселений, а оскільки можливий мешканець лише один, це має бути правдою. Функція ідентичності просто представляє конкретну тавтологію, що a → a .
Ваш коментар щодо функцій, що не припиняються, залежить від того, що саме ви мали на увазі. Каррі-Говард функціонує в системі типів, але припинення там не кодується. Згідно з Вікіпедією , вирішення проблеми припинення є проблемою, оскільки її додавання створює суперечливі логіки ( наприклад , я можу визначити wrong :: a -> b
за wrong x = wrong x
, і, таким чином, “довести”, що a → b для будь-яких a та b ). Якщо це те, що ви мали на увазі під «абсурдом», то ви точно маєте рацію. Якщо замість цього ви мали на увазі помилкове твердження, то замість цього ви хочете будь-який нежилий тип, наприклад, щось, що визначаєтьсяdata ⊥
- тобто тип даних без будь-якого способу його побудови. Це гарантує, що він взагалі не має значень, і тому він повинен бути безлюдним, що еквівалентно false. Я думаю, ви, мабуть, могли б також використовувати a -> b
, оскільки, якщо ми забороняємо функції, що не припиняються, це також не заселено, але я не впевнений на 100%.
У Вікіпедії сказано, що аксіоми кодуються двома різними способами, залежно від того, як ви інтерпретуєте Каррі-Говарда: або в комбінаторах, або в змінних. Я думаю, що комбінаторний вигляд означає, що примітивні функції, які ми отримали, кодують те, що ми можемо сказати за замовчуванням (подібно до того, як modus ponens є аксіомою, оскільки застосування функції є примітивним). І я думаю, що перегляд змінних насправді може означати одне і те ж - комбінатори, зрештою, є лише глобальними змінними, які є певними функціями. Що стосується примітивних типів: якщо я думаю над цим правильно, то я думаю, що примітивні типи - це сутності - примітивні об’єкти, про які ми намагаємось довести речі.
Відповідно до мого класу логіки та семантики, той факт, що ( a ∧ b ) → c ≡ a → ( b → c ) (а також те, що b → ( a → c )), називається законом еквівалентності експорту, принаймні за природним вирахуванням докази. Тоді я не помічав, що це просто каррі - хоч би і мав, бо це круто!
Хоча зараз у нас є спосіб представити інклюзивну диз’юнкцію, ми не маємо можливості представити ексклюзивний різновид. Ми повинні мати можливість використовувати визначення ексклюзивної диз’юнкції для її представлення: a ⊕ b ≡ ( a ∨ b ) ∧ ¬ ( a ∧ b ). Я не знаю, як писати заперечення, але знаю, що ¬ p ≡ p → ⊥, і натяк, і неправда легкі. Таким чином, ми повинні мати можливість представляти ексклюзивне роз'єднання шляхом:
data ⊥
data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
Це визначає ⊥
порожній тип без значень, що відповідає хибності; Xor
Потім визначається , щоб утримувати і ( і ) Either
в A або б ( або ) і функцію ( Мається на увазі ) з (а, б) ( а ) до нижнього типу ( помилкової ). Однак я не уявляю, що це означає . ( Редагування 1: Тепер я це бачу, див. Наступний абзац!) Оскільки немає значень типу(a,b) -> ⊥
(чи є?), Я не можу зрозуміти, що це означає в програмі. Хтось знає кращий спосіб подумати про це чи інше визначення? ( Редагування 1: Так, камкканн .)
Редагування 1: Завдяки відповіді camccann (зокрема, коментарям, які він залишив до неї, щоб допомогти мені), я думаю, я бачу, що тут відбувається. Щоб побудувати значення типу Xor a b
, потрібно надати дві речі. По-перше, свідок існування елемента будь-якого a
або b
як перший аргумент; тобто a Left a
або a Right b
. І по-друге, доказ того, що немає елементів обох типів, a
і b
- іншими словами, доказ, який (a,b)
не заселений - як другий аргумент. Оскільки ви зможете написати функцію лише з того, (a,b) -> ⊥
якщо (a,b)
вона не заселена, що це означає для цього? Це означало б, що якась частина об’єкта типу(a,b)
не може бути побудована; іншими словами, що , щонайменше , один, і , можливо , обидва, a
і b
незаселені , як добре! У цьому випадку, якщо ми думаємо про узгодження зразків, ви не могли б збігати зразки на такому кортежі: якщо припустити, що b
це нежитло, що ми можемо написати, що може відповідати другій частині цього набору? Таким чином, ми не можемо збігатися з ним, що може допомогти вам зрозуміти, чому це робить його нежилим. Тепер єдиним способом мати функцію total, яка не приймає аргументів (оскільки ця обов’язкова, оскільки (a,b)
є нежилою), є також результат нежитлового типу - якщо ми думаємо про це з точки зору відповідності шаблону, це означає, що навіть незважаючи на те, що у функції немає регістрів, немає можливого тіла він міг мати і те, і так все ОК.
Багато з цього - це я думаю вголос / довожу (сподіваюся) речі на льоту, але, сподіваюся, це корисно. Я дуже рекомендую статтю Вікіпедії ; Я не читав його докладно, але його таблиці - справді приємне резюме, і воно дуже ретельне.