@haskellru

Страница 391 из 1551
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
Не про хаскель я говорю, нету undefined никакого
понял, т.е. у тебя Void это пустой тип?

даже без боттома

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
Вы a priori reductio to absurdum предполагаете, оно не во всех type theory есть
Я привык работать во фреймворке интуиционистской логики, в рамках нее и рассказываю. Где-нибудь эта paraconsistent применяется в пруф-ассистантах?

Если нет, то ее польза на уровне 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
Ок, тема интересная все равно. Какой профит дает paraconsistent logic?
Ну это логика рассуждений в противоречивых фактах

Звучит как 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
мощность этого множества будет m^n
конечно:) спасибо за поправку

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

absurd — пустое множество, валидная функция

именно это и записывается на Хаскелле как \case{}

Евгений
05.09.2017
21:33:13
если вспомнить математику, то по определению функция (одно из) — это отношение, то есть множество пар, в котором левые части уникальны
Нельзя просто так редуцировать теорию множеств в теорию типов над тьюринг-полными языками, потому что у тебя не все термы нормализируемы. Тебе нужна Scott domain theory, если ты хочешь об abdurd'е порассуждать

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

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

Andrei
06.09.2017
00:16:46
Google
Yuriy
06.09.2017
06:48:09
Это при условии, что каким-то волшебным образом определено декартово произведение.
в теории множеств оно естественным образом определено (a, b) = {{a}, {a, b}} A × B = {(a, b) | a ∈ A, b ∈ B}

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
вообще на окамле периодически вылезают интересные вещи связанные с верификацией

но почему-то мне кажется, что они вылезают из университетов где преподавание окамла сильно и половина преподавательского состава в том же направлении работает

Страница 391 из 1551