В конце Теория категорий 8.2 Бартош Милевски показывает несколько примеров соответствия. между логикой, теорией категорий и системами типов.

Я бродил, что соответствует логическому оператору xor. я знаю это

a xor b == (a ∨ b) ∧ ¬(a ∧ b) == (a ∨ b) ∧ (¬a ∨ ¬b)

Поэтому я решил только часть проблемы: a xor b соответствует (Either a b, Either ? ?). Но каких двух типов недостает?

Кажется, что написание xor на самом деле сводится к тому, как писать not.

Так что такое ¬a? Насколько я понимаю, a логически верно, если существует элемент (по крайней мере, один) типа a. Итак, чтобы not a было истинным, a должно быть ложным, т.е. должно быть Void. Поэтому мне кажется, что есть две возможности:

(Either a Void, Either Void b) -- here I renamed "not b" to "b"
(Either Void b, Either a Void) -- here I renamed "not a" to "a"

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

14
Enlico 16 Окт 2020 в 00:44

2 ответа

Лучший ответ

Стандартный трюк для отрицания - использовать -> Void, поэтому:

type Not a = a -> Void

Мы можем построить полного обитателя этого типа именно тогда, когда a сам является доказуемо необитаемым типом; если есть жители a, мы не можем построить общего жителя этого типа. Для меня это звучит отрицанием!

Это означает, что ваше определение xor выглядит следующим образом:

type Xor a b = (Either a b, (a, b) -> Void) -- (a ∨ b) ∧ ¬(a ∧ b)
type Xor a b = (Either a b, Either (a -> Void) (b -> Void)) -- (a ∨ b) ∧ (¬a ∨ ¬b)
8
Daniel Wagner 16 Окт 2020 в 00:31

Я думаю, что XOR представлен просто Either, и это These, представляющий ИЛИ.

XOR B - это либо A, либо B, но не оба сразу, и это то, что есть Either.

data Either a b = Left a | Right b

OR B - это либо A, либо B, либо оба A и B, и это то, что есть These.

data These a b = This a | That b | These a b
1
Will Ness 16 Окт 2020 в 10:14