
Index
05.09.2017
19:18:32
Количество функций считается как степень
0^0 = 1
как и любое x^0 = 1
поэтому функций Void -> a всегда 1 для любого a, и это absurd

Google

Index
05.09.2017
19:19:45
а в случае Void -> Void просто absurd = id

Ilya
05.09.2017
19:40:11

kana
05.09.2017
19:41:39
Не про хаскель я говорю, нету undefined никакого

Index
05.09.2017
19:41:49
Да, речь-то не про Haskell
иначе везде +1 надо делать в алгебре, чтобы боттом учитывать

Ilya
05.09.2017
19:42:41
даже без боттома

Index
05.09.2017
19:42:47
Точнее, речь про идеализированный Haskell без боттомов (как и в любых рассуждениях такого уровня)
Void и задуман как пустой тип

Ilya
05.09.2017
19:47:46
@ind_index тогда поясни ещё раз, пожалуйста, почему функций Void -> Void одна штука
аргумент со степенью мне кажется формальным
точнее, лучше так вопрос поставлю
в противоречие с какими аксиомами я войду, если скажу, что функций с типом "пустой тип -> пустой тип" ноль штук, а не одна штука?

Google

kana
05.09.2017
19:50:21
а, хм, я понял, почему

Ilya
05.09.2017
19:50:34
давай

kana
05.09.2017
19:53:32
я в одном своем посте представлял функцию как таблицу результатов.
То есть имя тип data ABC = A | B | Cи функию
isA : ABC -> Bool
isA A = True
isA _ = Falseможно составить таблицу (кортеж Bool ^ n, где n = |ABC|)
-- A B C
(True, False, False)
То есть каждому i-ому значению типа ABC соответствует i-ый элемент этого кортежа.
Для типа 0 -> 0 это пустой кортеж (), ведь каждому значению Void соответствует некоторое значение Void.
это () это и есть единичный тип

Index
05.09.2017
19:57:11
А я могу доказать ее противоречивость предоставив функцию id
я имею id :: forall a. a -> a, что мне мешает взять a = Void?
Я объясню вам сейчас интуитивно, что такое Void

kana
05.09.2017
19:59:29
функция действительно для каждого элемента Void отдает элемент Void


Index
05.09.2017
20:00:01
функция a -> Void написана быть не может, потому что она должна вернуть результат, которого не может быть (по определению Void)
а если уж вам удалось в текущем контексте получить Void, то это значит, что текущий кусок кода в рантайме не выполнится никогда!
потому что нет ни одного способа ему этот Void предоставить
а оттого функция Void -> a как бы говорит "вызови меня если сможешь, я тебе дам взамен что угодно, любое a"
Да только вызвать ты ее не сможешь, а потому функция может ничего и не делать
любую функцию можно определить переобором конструкторов, например, если на вход (), то
f () = ...
если на вход Bool, то
f True = ...
f False = ...
если на вход Maybe a, то
f Nothing = ...
f (Just a) = ...
а если на вход Void, то
f
что записывается как f = \case{} в Haskell и как f () вместо f = ... в Agda
Например, если я имею Either Void (), то я могу сконструировать только Right (), но никогда никакого Left ... не будет в жизни, не сконструирую никак
а потом функция, которая хочет принять Either Void (), может писать
f (Left e) = absurd e
и в рантайме этого codepath и не будет никогда
потому что это абсурд, будто кто-то нам Void передал


Евгений
05.09.2017
20:05:00
Я не очень понимаю про что вы говорите, вы про какой-то фиксированный type theory, про инлайн логику топоса или про тьюринг-полные языки?

Google

Index
05.09.2017
20:05:18
Про любой total functional language с inductive type definitions

Vasiliy
05.09.2017
20:05:24
но ведь в идрисе у Dec конструктор No как раз принимает функцию prop -> Void, значит, такую функцию можно сконструировать

Index
05.09.2017
20:05:48
Ее можно сконструировать из ложного утверждения, типа 1 = 2
потому что ты это ложное утверждение тоже не можешь сконструировать
в этом плане это функция 0 -> 0

Евгений
05.09.2017
20:06:05
google paraconsistent logic
Вы a priori reductio to absurdum предполагаете, оно не во всех type theory есть

Vasiliy
05.09.2017
20:07:12
то есть, по сути, эта функция показывает, что prop тоже Void?

Index
05.09.2017
20:07:28
Если нет, то ее польза на уровне set theory для computer scientist (т.е. интересная штука и на бумажке можно порисовать, а попрограммировать нельзя)

Евгений
05.09.2017
20:09:28
Нет, не применяется. Но вопрос же был теоретический, НЯП
Но вообще говоря он скорее про system f чем про dependent types

Index
05.09.2017
20:10:11
Ок, тема интересная все равно. Какой профит дает paraconsistent logic?

Евгений
05.09.2017
20:10:30
Потому что у тебя a параметрически полиморфная

Index
05.09.2017
20:11:29
Я вот не представляю как в ней что-то можно доказывать
Но наверное можно, раз есть, и зачем-то даже хочется

kana
05.09.2017
20:12:00
Просто вот что выходит: если тип Void -> Void населен, то и not (not A)) ~ (a -> Void) -> Void населен, то есть двойное отрицание выполняется. А в интуиционисткой логике вроде как это не аксиоматичено

Евгений
05.09.2017
20:12:27
Звучит как call/cc

Google

Евгений
05.09.2017
20:14:17
В paraconsistent logic можно мнлго чего интересного изучать, с множеством всех множеств работать, с полной арифметикой.
Очень жаль, что нету готового пруф асистента для неё

Index
05.09.2017
20:15:36
> двойное отрицание выполняется
Хм, я вроде соглашусь, что Void -> Void и (a -> Void) -> Void населены, но я не уверен, что ты сможешь из одного сконструировать другое

Alex
05.09.2017
20:16:59
а почему двойному отрицанию не быть населенным?

Евгений
05.09.2017
20:17:11
К слову, (a -> Void) -> Void очевидно насёлен
Из A |= not not A

Alex
05.09.2017
20:17:36
в интуиционизме недоказуема только его элиминация Not $ Not a -> a

Index
05.09.2017
20:17:55
Да, вот

Alex
05.09.2017
20:20:44
https://github.com/idris-hackers/software-foundations/blob/develop/src/Logic.lidr#L1269

Ilya
05.09.2017
20:22:07
я в одном своем посте представлял функцию как таблицу результатов.
То есть имя тип data ABC = A | B | Cи функию
isA : ABC -> Bool
isA A = True
isA _ = Falseможно составить таблицу (кортеж Bool ^ n, где n = |ABC|)
-- A B C
(True, False, False)
То есть каждому i-ому значению типа ABC соответствует i-ый элемент этого кортежа.
Для типа 0 -> 0 это пустой кортеж (), ведь каждому значению Void соответствует некоторое значение Void.
в приниципе понятно
я это для себя так объяснил
множество
A = {a1, a2, a3, ..., an}, |A| = n
множество
B = {b1, b2, b3, ..., bm}, |B| = m
тогда множество функций A->B это множество различных наборов пар (всего n^m наборов)
A->B = {{(a1, b1), (a2, b1), ..., (an, b1)}, .. {(a1, bm), (a2, bm), ..., (an, bm)}}
и мощность этого множества
|A->B| = n^m
Тогда если
A = ∅, B = ∅
то
A -> B = {∅}, |{∅}| = 1


kana
05.09.2017
20:31:04
мощность этого множества будет m^n
Стрелочный тип - тип функции, отображения из значений одного типа в значения другого типа. Записываются как a → b, где a - входный тип, тип аргумента, а b - выходной тип, тип результата.
Функция называется тотальной, если для каждого входного элемента может вернуть результат за конечое число шагов.
Каждую функцию (конечно, если считать, что они все тотальные, в хаскеле это не так) a → b можно записать как таблицу значений - карту между a и b. Можно проиндексировать каждый элемент a и представить тип функции как тип кортеж из |a| элементов типа b, где i-ому элементу кортежа соответствует выходное значение функции при входном aᵢ.
Приведем пример:
data ABC = A | B | C
isA :: ABC -> Bool
isA A = True
isA _ = False
isA', isB', isC' :: (Bool, Bool, Bool)
-- A B C
isA' = (True, False, False)
isB' = (False, True, False)
isC' = (False, False, True )
isA - предикат, который возвращает True только для A, для всех остальных значений False. isA' - пример таблицы для этой функции. Если как-то упорядочить множество ABC и дать элементам индекс (`ABC₁ = A`, ABC₂ = B, ABC₃ = C ), то каждому i-ому элементу кортежа соответствует ABCᵢ.
Нетрудно заметить, что результатирующий тип можно представить как умножение типа b на самого себя |a| раз, то есть bᵃ.
Еще раз - каждую тотальную функцию вида a → b можно записать как bᵃ.
Для примера выше, ABC → Bool можно записать как Bool^ABC, и действительно,
Bool = 1 + 1 = 2
ABC = 1 + 1 + 1 = 3
Bool^ABC = 2^3 = 8
А именно 8 элементов есть у типа ABC → Bool, то есть ровно 8 функций мы можем составить:
isNotABC, isA, isB, isC, isAorB, isAorC, isBorC, isAny :: ABC -> Bool
isNotABC _ = False -- 1
isA A = True -- 2
isA _ = False
isB B = True -- 3
isB _ = False
isC C = True -- 4
isC _ = False
isAorB x = isA x || isB x -- 5
isAorC x = isA x || isC x -- 6
isBorC x = isB x || isC x -- 7
isAny _ = True -- 8
Это все функции, которые мы можем составить с такой сигнатурой, все остальные функции будут лишь переименованиями этих (в хаскеле конечно все сложнее, но давайте забудем про пороки хаскеля).
Если же взять каррированную функцию от двух аргументов a → b → c, то это аналог (c^b)^a = c^ba, а ba это пара из b и a, отсюда становится абсолютно ясно, что функции (a, b) → c и a → b → c изоморфны.
Умножение функций работает так же, как и ожидается: cᵃ * cᵇ = cᵃ⁺ᵇ, то есть (a -> c, b -> c) ~= Either a b → c.


Ilya
05.09.2017
20:32:22

Yuriy
05.09.2017
21:23:19
если вспомнить математику, то по определению функция (одно из) — это отношение, то есть множество пар, в котором левые части уникальны
absurd — пустое множество, валидная функция
именно это и записывается на Хаскелле как \case{}

Евгений
05.09.2017
21:33:13

Дмитрий
05.09.2017
23:46:33
Void -> a начальный объект группы, a -> Void — терминальный

Даня
05.09.2017
23:48:17
терминальный скорее будет a -> ()

Andrei
06.09.2017
00:16:46

Yuriy
06.09.2017
06:43:45

Google

Yuriy
06.09.2017
06:48:09

Taras ?
06.09.2017
09:11:26
добродень)
у меня очередной глупый вопрос, а именно -
Haskell получше чем OCaml будет?))

Евгений
06.09.2017
09:12:37
В каком смысле получше?

Андрей
06.09.2017
09:13:23
в смысле чем окамл (С)

Taras ?
06.09.2017
09:13:55
1) приятная разработка - быстрая
2) быстродействие на сервере

Dmitry
06.09.2017
09:14:21
нет SMP

Taras ?
06.09.2017
09:15:05
я прост на гитхабе надыбал криптовалюту на окамле ?
задался вопросом - почему на нем написали ( tezos, если интересно )

Alexander
06.09.2017
09:15:05
если ты хочешь писать на coq и пилить его, то лучше смотреть на ocaml
если что-то другое, то наверное не стоит
тут есть авторы кардано, которые написали на haskell

Taras ?
06.09.2017
09:17:37
понял, спс)

Alexander
06.09.2017
09:18:20
вообще на окамле периодически вылезают интересные вещи связанные с верификацией
но почему-то мне кажется, что они вылезают из университетов где преподавание окамла сильно и половина преподавательского состава в том же направлении работает