Vasiliy
но ведь в идрисе у Dec конструктор No как раз принимает функцию prop -> Void, значит, такую функцию можно сконструировать
Vladislav
Ее можно сконструировать из ложного утверждения, типа 1 = 2
Vladislav
потому что ты это ложное утверждение тоже не можешь сконструировать
Vladislav
в этом плане это функция 0 -> 0
Евгений
google paraconsistent logic
Евгений
Вы a priori reductio to absurdum предполагаете, оно не во всех type theory есть
Vasiliy
то есть, по сути, эта функция показывает, что prop тоже Void?
Vladislav
Вы a priori reductio to absurdum предполагаете, оно не во всех type theory есть
Я привык работать во фреймворке интуиционистской логики, в рамках нее и рассказываю. Где-нибудь эта paraconsistent применяется в пруф-ассистантах?
Vladislav
Если нет, то ее польза на уровне set theory для computer scientist (т.е. интересная штука и на бумажке можно порисовать, а попрограммировать нельзя)
Евгений
Нет, не применяется. Но вопрос же был теоретический, НЯП
Евгений
Но вообще говоря он скорее про system f чем про dependent types
Vladislav
Ок, тема интересная все равно. Какой профит дает paraconsistent logic?
Евгений
Потому что у тебя a параметрически полиморфная
Vladislav
Я вот не представляю как в ней что-то можно доказывать
Vladislav
Но наверное можно, раз есть, и зачем-то даже хочется
кана
Просто вот что выходит: если тип Void -> Void населен, то и not (not A)) ~ (a -> Void) -> Void населен, то есть двойное отрицание выполняется. А в интуиционисткой логике вроде как это не аксиоматичено
Евгений
Ок, тема интересная все равно. Какой профит дает paraconsistent logic?
Ну это логика рассуждений в противоречивых фактах
Евгений
Звучит как call/cc
Евгений
В paraconsistent logic можно мнлго чего интересного изучать, с множеством всех множеств работать, с полной арифметикой. Очень жаль, что нету готового пруф асистента для неё
Vladislav
> двойное отрицание выполняется Хм, я вроде соглашусь, что Void -> Void и (a -> Void) -> Void населены, но я не уверен, что ты сможешь из одного сконструировать другое
Alex
а почему двойному отрицанию не быть населенным?
Евгений
К слову, (a -> Void) -> Void очевидно насёлен
Евгений
Из A |= not not A
Alex
в интуиционизме недоказуема только его элиминация Not $ Not a -> a
Vladislav
Да, вот
Alex
https://github.com/idris-hackers/software-foundations/blob/develop/src/Logic.lidr#L1269
Ilya
я в одном своем посте представлял функцию как таблицу результатов. То есть имя тип 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
кана
мощность этого множества будет 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
мощность этого множества будет m^n
конечно:) спасибо за поправку
Cheese
если вспомнить математику, то по определению функция (одно из) — это отношение, то есть множество пар, в котором левые части уникальны
Cheese
absurd — пустое множество, валидная функция
Cheese
именно это и записывается на Хаскелле как \case{}
Евгений
если вспомнить математику, то по определению функция (одно из) — это отношение, то есть множество пар, в котором левые части уникальны
Нельзя просто так редуцировать теорию множеств в теорию типов над тьюринг-полными языками, потому что у тебя не все термы нормализируемы. Тебе нужна Scott domain theory, если ты хочешь об abdurd'е порассуждать
Дима
Void -> a начальный объект группы, a -> Void — терминальный
Anonymous
терминальный скорее будет a -> ()
Cheese
Это при условии, что каким-то волшебным образом определено декартово произведение.
в теории множеств оно естественным образом определено (a, b) = {{a}, {a, b}} A × B = {(a, b) | a ∈ A, b ∈ B}
Taras 🦀
добродень)
Taras 🦀
у меня очередной глупый вопрос, а именно - Haskell получше чем OCaml будет?))
Евгений
В каком смысле получше?
Andrey
в смысле чем окамл (С)
Taras 🦀
1) приятная разработка - быстрая 2) быстродействие на сервере
Dmitry
нет SMP
Taras 🦀
я прост на гитхабе надыбал криптовалюту на окамле 😂 задался вопросом - почему на нем написали ( tezos, если интересно )
Alexander
если ты хочешь писать на coq и пилить его, то лучше смотреть на ocaml
Alexander
если что-то другое, то наверное не стоит
Alexander
тут есть авторы кардано, которые написали на haskell
Taras 🦀
понял, спс)
Alexander
вообще на окамле периодически вылезают интересные вещи связанные с верификацией
Alexander
но почему-то мне кажется, что они вылезают из университетов где преподавание окамла сильно и половина преподавательского состава в том же направлении работает
Alexander
а у кого-нить наработались хорошие подходы к CRUD (вроде так зовется) и т.п.
Alexander
а то есть приложение с базой, хотелось бы какой-то интерфейс для админов простой, на случай быстро что-то поменять не лезя во внутрь, но тратить ресурсы на поддержку и делать красивым не охота
Vasiliy
возможно, postgrest ?
Kirill
php*admin? (phpmyadmin, phppgadmin)
Leonid 🦇
postgrest - для любителей писать plpgsql
Denis
postgrest неплох, правда было бы лучше, если б он в виде либы поставлялся, а не как монолит (например, меня тамошняя модель авторизации ну совсем не устраивает, и заменить её будет не так просто)
Alexander
phppgadmin норм, но если бы он был на haskell или другом компилируемом языке
Kirill
ну если это для админов, то вполне сносно
Alexander
не, тащить php это вообще не вариант
Евгений
ну если это для админов, то вполне сносно
Для админов не нужно, ибо любой нормальный админ знает SQL. Это ж скорее для кодеров сделано, которые не могут себе позволить ни DBA, ни даже тупо администратора.
Kirill
тогда можно в idea запросы писать
Alexander
вообще это скорее для саппорта, которым не охота давать доступ к данным, но можно к подмножеству запросов, и не хотелось бы тратить на это время
Alexander
доступ рабочей к базе idea разработчика, это интересно
Kirill
есть ещё heidisql, но это опять таки полноценный SQL клиент где можно всё
Alexander
кажется на reddit была шумная история как одно увололи за то, что он в первый день production базу грохнул
Kirill
таких историй вагон)
Alexander
поэтому разраб имеет доступ к своей версии, где он может менять что угодно, как угодно
Евгений
Это не всегда возможно
Alexander
не спорю, но можно пример?
Евгений
Несложно организовать такой доступ, если схема БД предполагает собой 3'юю (а то и выше) нормальную форму. Но как известно никто не придумал СУБД, в которой за нормализацию не требовалось бы платить скоростью работы. Если база сильно денормализованная и обширная, с большим количеством реляций, то и создать искусственную версию, да ещё и поддерживать её в актуальном состоянии, очень сложно
Евгений
Кстати я тут стал задумываться в последнее время — можно ли на уровне Type Theory гарантировать третью, четвёртую, пятую нормальные формы?
Alexander
ну это к вопросу наполнения данными, он открытый особенно если от данных много что зависи
Alexander
но вроде как не жесткое ограничение
AV_N
если в этой Type Theory выражается идея функциональной зависимости (которая идёт от 2-НФ), и сначала описываются все возможные функциональные зависимости — то можно
AV_N
(и, возможно, даже можно будет синтезировать по этим функциональным зависимостям классы нормальных форм для той или иной предметной области)
AV_N
параллельная тема про Type Theory в РСУБД (если вдруг не видели): https://arxiv.org/abs/1607.04822 — парни на HoTT опиывают семантику SQL до такой степени, что говорят о классах эквивалентности запросов (с потенциальным выхлопом для оптимизации)