Які найцікавіші еквіваленти випливають із ізоморфізму Каррі-Говарда?


97

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

program/definition        | proof
type/declaration          | proposition
inhabited type            | theorem/lemma
function                  | implication
function argument         | hypothesis/antecedent
function result           | conclusion/consequent
function application      | modus ponens
recursion                 | induction
identity function         | tautology
non-terminating function  | absurdity/contradiction
tuple                     | conjunction (and)
disjoint union            | disjunction (or)          -- corrected by Antal S-Z
parametric polymorphism   | universal quantification

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

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

currying                  | "((a & b) => c) iff (a => (b => c))"
scope                     | "known theory + hypotheses"

І ось кілька логічних концепцій, які я не зовсім закріпив у термінах програмування:

primitive type?           | axiom
set of valid programs?    | theory

Редагувати:

Ось ще кілька рівнозначностей, зібраних із відповідей:

function composition      | syllogism                -- from Apocalisp
continuation-passing      | double negation          -- from camccann

закриття ~ = набір аксіом
Апокалісп

+1 Це запитання та всі якісні відповіді та коментарі навчили мене більше про CHI, ніж те, що я міг дізнатись через Інтернет.
Олександр К.

24
@ Пол Натан:goto | jumping to conclusions
Joey Adams

Я думаю, що набір усіх дійсних програм був би зразком
Даніїл

1
fst / snd | усунення сполучників, ліворуч / праворуч | вступ до диз’юнкції
Тоні Морріс

Відповіді:


33

Оскільки ви прямо просили про найцікавіші та незрозумілі:

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

evaluation             | proof normalisation/cut-elimination
variable               | assumption
S K combinators        | axiomatic formulation of logic   
pattern matching       | left-sequent rules 
subtyping              | implicit entailment (not reflected in expressions)
intersection types     | implicit conjunction
union types            | implicit disjunction
open code              | temporal next
closed code            | necessity
effects                | possibility
reachable state        | possible world
monadic metalanguage   | lax logic
non-termination        | truth in an unobservable possible world
distributed programs   | modal logic S5/Hybrid logic
meta variables         | modal assumptions
explicit substitutions | contextual modal necessity
pi-calculus            | linear logic

EDIT: Посилання, яке я рекомендую всім, хто бажає дізнатись більше про розширення CH:

"Вирішальна реконструкція модальної логіки" http://www.cs.cmu.edu/~fp/papers/mscs00.pdf - це чудове місце для початку, оскільки воно починається з перших принципів, і більша частина з них спрямована на те, щоб доступний для нелогіків / теоретиків мови. (Хоча я другий автор, тому я упереджений).


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

2
Я можу вказати на опубліковані статті для кожного з них, тому вони точно визначені. Модальна логіка багато вивчається (ще від Арістотеля) і пов’язує різні режими істини - „А обов’язково є істинним” означає „у кожному можливому світі А є істинним”, тоді як „А, можливо, істинне” означає „А є істинним в одному можливому світі” . Ви можете довести такі речі, як "(обов'язково (A -> B) і можливо A) -> можливо B". Правила модального висновку безпосередньо дають конструкції виразів, правила набору тексту та скорочення, як зазвичай у СН. Див .: en.wikipedia.org/wiki/Modal_logic та cs.cmu.edu/~fp/papers/mscs00.pdf
RD1

2
@pelotom: Можливо, ви захочете трохи прочитати про інші види логіки . Проста класична логіка часто не корисна в цьому контексті - у своїй відповіді я згадав інтуїціоністичну логіку, але модальну та лінійна логіка навіть "дивніша", але також справді чудова.
CA McCann

1
Дякую за вказівки, здається, мені потрібно трохи почитати!
Tom Crockett,

2
@ RD1: Ти вважаєш, що це погано, я витратив стільки часу на роздуми в Haskell, що мені доводиться подумки переводити формули логіки предикатів у підписи типу, перш ніж вони мають сенс. :( Не кажучи вже про те, що закон виключеного середнього та подібного починає здаватися дійсно заплутаним і, можливо, підозрілим.
К. А. Макканн

26

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

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

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

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

Однак у цьому є цікавий поворот! У мові з параметричним поліморфізмом змінні типу варіюються по всіх можливих типах, включаючи нежилі, тому повністю поліморфний тип, такий як∀a. a , який у певному сенсі майже хибний. То що, якщо ми пишемо подвійне майже заперечення, використовуючи поліморфізм? Ми отримуємо тип , який виглядає наступним чином : ∀a. (P -> a) -> a. Це еквівалентно чомусь типу P? Це справді так , просто застосуйте його до функції ідентичності.

Але який сенс? Навіщо писати такий тип? Це що- небудь означає з точки зору програмування? Ну, ви можете сприймати це як функцію, яка вже має щось на зразок типу , а насправді тип, який я навів вище, - це саме продовження монади в Haskell.P десь , і вам потрібно, щоб ви надали їй функцію, яка приймає Pяк аргумент, причому все це є поліморфним у кінцевому типі результату. У певному сенсі це являє собою призупинене обчислення , яке чекає, поки буде надано решту. У цьому сенсі ці призупинені обчислення можна складати разом, передавати, викликати, що завгодно. Це має почати здаватися звичним для шанувальників деяких мов, таких як Scheme чи Ruby - адже це означає, що подвійне заперечення відповідає стилю передачі продовження


Дякую за виправлення, я видалив "хибність" як синонім невизначеності. +1 для подвійного заперечення <=> CPS!
Tom Crockett

Я не зовсім розумію, як представляти ¬p як P -> Falsity. Я розумію, чому це працює (¬p ≡ p → ⊥), але я не отримую версію коду. P -> ⊥слід населяти саме тоді, коли Pні, правда? Але чи не слід завжди використовувати цю функцію? Або можливо ніколи, насправді, оскільки ви не можете повернути екземпляр ? Я не зовсім бачу обумовленості цього. Яка тут інтуїція?
Antal Spector-Zabusky

1
@Antal SZ: Звичайно, інтуїція - це інтуїціоністична логіка! Але так, насправді написати таку функцію складно. Я бачу у вашому профілі, що ви знаєте Хаскелла, тож, можливо, ви думаєте про алгебраїчні типи даних та узгодження зразків? Враховуйте, що нежилий тип не повинен мати конструкторів і, отже, нічого, до чого можна збігатися. Вам доведеться написати "функцію" без жодного тіла, що не є законним Haskell. Насправді, наскільки мені відомо, в Haskell неможливо написати термін запереченого типу без використання винятків під час виконання або не припинення.
CA McCann

1
@Antal SZ: З іншого боку, якщо еквівалентна логіка узгоджена, усі функції повинні бути загальними, наприклад, усі збіги шаблонів повинні бути вичерпними. Отже, для того, щоб написати функцію без шаблонів, тип параметра не повинен мати конструкторів, наприклад, бути незаселеним. Отже, така функція була б законною - і, отже, її власним типом, заселеною - точно і лише тоді, коли її аргумент не заселений. Отже, функція P -> Falsityеквівалентна Pхибності.
CA McCann

Ага, думаю, я зрозумів. Версія, якою я розважав, була щось на зразок такої f x = x, що могла б бути невідступною, якщо б вона не була P = ⊥, але це явно було недостатньо загальним. Отже, ідея полягає в тому, що для повернення безцінного типу вам не потрібне тіло; але для того, щоб функція була визначеною і повною, вам не потрібні випадки , а отже, якщо Pвона не заселена, все виходить? Це трохи хитро, але я думаю, я це бачу. Здається, це досить дивно взаємодіє з моїм визначенням Xorтипу ... Мені доведеться подумати про це. Дякую!
Antal Spector-Zabusky

15

Ваша діаграма не зовсім правильна; у багатьох випадках ви плутали типи з термінами.

function type              implication
function                   proof of implication
function argument          proof of hypothesis
function result            proof of conclusion
function application RULE  modus ponens
recursion                  n/a [1]
structural induction       fold (foldr for lists)
mathematical induction     fold for naturals (data N = Z | S N)
identity function          proof of A -> A, for all A
non-terminating function   n/a [2]
tuple                      normal proof of conjunction
sum                        disjunction
n/a [3]                    first-order universal quantification
parametric polymorphism    second-order universal quantification
currying                   (A,B) -> C -||- A -> (B -> C), for all A,B,C
primitive type             axiom
types of typeable terms    theory
function composition       syllogism
substitution               cut rule
value                      normal proof

[1] Логіка повної функціональної мови Тьюрінга несумісна. Рекурсія не відповідає відповідним теоріям. У суперечливій теорії логіки / необгрунтованості ви можете назвати це правилом, яке спричиняє невідповідність / незгідність.

[2] Знову ж таки, це наслідок повноти. Це було б доказом антитеореми, якби логіка була послідовною - отже, вона не може існувати.

[3] Не існує у функціональних мовах, оскільки вони видаляють логічні особливості першого порядку: усі квантифікація та параметризація здійснюються за формулами. Якщо ви мали функції першого порядку, не було б свого роду винятком *, * -> *і т.д.; тип елементів домену дискурсу. Наприклад, in Father(X,Y) :- Parent(X,Y), Male(X), Xand Yrange over the domain of дискурс (назвіть це Dom), і Male :: Dom -> *.


[1] - так, я повинен був бути більш конкретним. Я мав на увазі "структурну рекурсію", а не необмежену рекурсію, яка, на мою думку, є таким самим, як "складка". [3] - він існує в мовах, що вводяться залежно від типу
Том Крокетт,

[1] Справа в тому, що якщо виклик функції рекурсії (modus ponens) не призводить до того, що програма не припиняється, параметри (гіпотези), надані виклику або середовищу, ПОВИННІ відрізнятися між цими викликами. Отже, рекурсія - це просто застосування однієї і тієї ж теореми кілька разів. Якщо є щось особливе, це, як правило, збільшення / зменшення чисел (індуктивний крок) та перевірка за наявним випадком (базовий випадок), що відповідає - Математична індукція в логіці.
Earth Engine

Мені дуже подобається ця діаграма, але я б не сказав "не застосовується", оскільки послідовна логіка - не єдиний вид логіки, як і завершення програм - не єдиний вид програм. Функція, що не закінчується, відповідала б "круговому аргументу" і є чудовою ілюстрацією ізоморфізму Каррі-Говарда: "слідування" за циркулярним аргументом ставить вас у нескінченний цикл.
Joey Adams


13

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

  1. Я думаю, що типи сум / типи об’єднань ( наприклад 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 є істинними, то принаймні одне є істинним. Отже, якщо дискриміновані спілки є якоюсь формою роз'єднання, вони повинні бути різноманітним різновидом. Я думаю, що це є доказом, але не соромтеся дезобюювати мене з цього поняття.

  2. Подібним чином, ваші визначення тавтології та абсурду як функції ідентичності та функцій, що не припиняються, трохи не відповідають. Істинна формула представлена типом одиниці , тобто типом, який має лише один елемент ( data ⊤ = ⊤; часто пишеться ()та / або Unitмовами функціонального програмування). Це має сенс: оскільки цей тип гарантовано заселений, а оскільки можливий мешканець лише один, це має бути правдою. Функція ідентичності просто представляє конкретну тавтологію, що a  →  a .

    Ваш коментар щодо функцій, що не припиняються, залежить від того, що саме ви мали на увазі. Каррі-Говард функціонує в системі типів, але припинення там не кодується. Згідно з Вікіпедією , вирішення проблеми припинення є проблемою, оскільки її додавання створює суперечливі логіки ( наприклад , я можу визначити wrong :: a -> bза wrong x = wrong x, і, таким чином, “довести”, що a  →  b для будь-яких a та b ). Якщо це те, що ви мали на увазі під «абсурдом», то ви точно маєте рацію. Якщо замість цього ви мали на увазі помилкове твердження, то замість цього ви хочете будь-який нежилий тип, наприклад, щось, що визначаєтьсяdata ⊥- тобто тип даних без будь-якого способу його побудови. Це гарантує, що він взагалі не має значень, і тому він повинен бути безлюдним, що еквівалентно false. Я думаю, ви, мабуть, могли б також використовувати a -> b, оскільки, якщо ми забороняємо функції, що не припиняються, це також не заселено, але я не впевнений на 100%.

  3. У Вікіпедії сказано, що аксіоми кодуються двома різними способами, залежно від того, як ви інтерпретуєте Каррі-Говарда: або в комбінаторах, або в змінних. Я думаю, що комбінаторний вигляд означає, що примітивні функції, які ми отримали, кодують те, що ми можемо сказати за замовчуванням (подібно до того, як modus ponens є аксіомою, оскільки застосування функції є примітивним). І я думаю, що перегляд змінних насправді може означати одне і те ж - комбінатори, зрештою, є лише глобальними змінними, які є певними функціями. Що стосується примітивних типів: якщо я думаю над цим правильно, то я думаю, що примітивні типи - це сутності - примітивні об’єкти, про які ми намагаємось довести речі.

  4. Відповідно до мого класу логіки та семантики, той факт, що ( a  ∧  b ) →  c  ≡  a  → ( b  →  c ) (а також те, що b  → ( a  →  c )), називається законом еквівалентності експорту, принаймні за природним вирахуванням докази. Тоді я не помічав, що це просто каррі - хоч би і мав, бо це круто!

  5. Хоча зараз у нас є спосіб представити інклюзивну диз’юнкцію, ми не маємо можливості представити ексклюзивний різновид. Ми повинні мати можливість використовувати визначення ексклюзивної диз’юнкції для її представлення: 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)є нежилою), є також результат нежитлового типу - якщо ми думаємо про це з точки зору відповідності шаблону, це означає, що навіть незважаючи на те, що у функції немає регістрів, немає можливого тіла він міг мати і те, і так все ОК.

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


1
+1 за вказівку на те, що будь-який із них включає-або. Зауважимо, що (Або aa) є теоремою (для всіх a).
Апокалісп

Питання повторно. 2 (b): яка різниця між типом функції, єдиним мешканцем якого не є закінчення, та нежитловим типом функції? Наприклад, якщо я оголосив тип B без конструкторів, то визначив функцію A-> B, наприклад: fun (a: A): B: = f (a), це перевірить тип на багатьох мовах, хоча це повернути Б неможливо. Тож функція в одному сенсі "заселена", але її "мешканець" абсурдна ... тому насправді вона взагалі не заселена. Сподіваюся, це має якийсь сенс :)
Том Крокетт

3
Днище не є доказом. "Абсурдно і неможливо припустити, що непізнаване і невизначене повинно містити і визначати". - Арістотель
Апокалісп

2
@Tom: Тільки для того, щоб проїхати додому питання про неприпинення, якщо логіка послідовна, усі програми припиняються . Не припинення трапляється лише в системах типів, що представляють суперечливі логіки, або, що еквівалентно, системах типів для мов, що повні Тьюрінга.
CA McCann

1
Апокалісп: Either a a не повинен бути цілком теоремою: Either ⊥ ⊥досі нежилий. Том: Як сказав Камканн, послідовність передбачає припинення дії. Таким чином, послідовна система типів не дозволяє вам висловлюватись f :: a -> b, і тому тип буде нежилим; несумісна система типу мала б мешканця для цього типу, але таку, яка не припинялася б. camccann: Чи існують суперечливі системи типу, які не є повною за Тьюрінгом, займаючи якусь проміжну точку в ієрархії? Або цей останній крок (додавання загальної рекурсії чи чогось іншого) точно еквівалентний непослідовності?
Antal Spector-Zabusky

12

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

Звичайно, якщо ви не філософ, математик або нав'язливий функціональний програміст, це, мабуть, викликає ще кілька питань.

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

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

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

А що таке тимчасова логіка? Відповідно, це набір логічних правил для роботи з пропозиціями, кількісно визначеними з часом. По суті, він розширює нормальну логіку першого порядку за допомогою двох кванторів: □ та ◇. Перший означає "завжди": читати □ φ як "φ завжди має місце". Другий - "врешті-решт": ◇ φ означає, що "φ з часом утримається". Це особливий вид модальної логіки . Наступні два закони стосуються кванторів:

□φ ⇔ ¬◇¬φ
◇φ ⇔ ¬□¬φ

Отже, □ і ◇ є подвійними один одному так само, як ∀ і ∃.

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


8

Пов’язаний із взаємозв’язком між продовженнями та подвійним запереченням, тип дзвінка / куб.см - закон Пірса http://en.wikipedia.org/wiki/Call-with-current-continuation

CH, як правило, вказується як відповідність між інтуїціоністичною логікою та програмами. Однак якщо додати оператор call-with-current-continue (callCC) (тип якого відповідає закону Пірса), ми отримаємо відповідність між класичною логікою та програмами з callCC.


4

Хоча це не простий ізоморфізм, це обговорення конструктивних ЛЕМ є дуже цікавим результатом. Зокрема, у розділі висновків Олег Кисельов обговорює, як використання монад для усунення подвійного заперечення в конструктивній логіці є аналогічним розрізненню обчислювальних пропозицій (для яких ЛЕМ діє в конструктивній обстановці) від усіх пропозицій. Подання про те, що монади вловлюють обчислювальні ефекти, є давнім, але цей приклад ізоморфізму Каррі - Говарда допомагає поставити його в перспективі і допомагає зрозуміти, що насправді "означає" подвійне заперечення.


4

Першокласна підтримка продовжень дозволяє висловити $ P \ lor \ neg P $. Фокус заснований на тому, що не викликати продовження та вийти з деяким виразом еквівалентно виклику продовження з тим самим виразом.

Детальніший огляд див. На веб-сайті : http://www.cs.cmu.edu/~rwh/courses/logic/www-old/handouts/callcc.pdf


Дякую за це розуміння!
paulotorrens

4
2-continuation           | Sheffer stoke
n-continuation language  | Existential graph
Recursion                | Mathematical Induction

Важливо одне, але ще не досліджене - це взаємозв'язок 2-продовження (продовження, що приймає 2 параметри) та інсульту Шеффера . У класичній логіці штрих Шеффера може сам по собі сформувати цілісну логічну систему (плюс деякі не операторські концепції). Це означає , знайомий and, or, notможе бути реалізована з використанням тільки топити Шеффер або nand.

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

Підпис типу 2-продовження є (a,b) -> Void. За допомогою цієї реалізації ми можемо визначити 1-продовження (звичайні продовження) як (a,a)-> Недійсне, тип товару як ((a,b)->Void,(a,b)->Void)->Void, тип суми як ((a,a)->Void,(b,b)->Void)->Void. Це дає нам вражаючу силу виразності.

Якщо копати далі, ми з’ясуємо, що екзистенційний графік Piece еквівалентний мові, єдиним типом даних якої є n-продолжение, але я не побачив жодної існуючої мови у цій формі. Отже, я думаю, що винахід може бути цікавим.

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