1. Куча / Говнокод #26894

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    Definition idx_compl_r {i : Fin.t N} (j : Fin.t i) : Fin.t N.
          remember (fin_to_nat i) as i'.
          assert (Hlt : i' < N).
          { rewrite Heqi'. eapply fin_to_nat_lt. }
          assert (Heq : i' + (N - i') = N) by lia.
          set (j' := Fin.L (N - i') j).
          rewrite Heq in j'.
          exact j'.
        Defined.

    Ещё один говношедевр. Как кастовать значения типа Fin.t (число в интервале от 1 до N) друг в друга. Разворачивается в 12000 строк кода. "Тому, кто это придумал, надо в голову гвоздь забить".

    Запостил: CHayT, 27 Августа 2020

    Комментарии (58) RSS

    • SEO. Самое печальное, что тип Fin.t абсолютно излишен, и мог быть заменён типом "? < ?".
      Ответить
      • Переведи на «PHP».
        Ответить
        • +1
          Я даже не понял что я изык. «Coq»?
          Ответить
          • Он самый.
            Ответить
            • Ебать поехавший.
              Ответить
              • Coq это ещё более говнокодерский язык, чем PHP, кстати. Позволяет писать, не включая мозг совершенно, что данный говнокод и демонстрирует.
                Ответить
                • А читать?
                  Ответить
                  • P.S. Самокоррект: "Coq" -- не язык, а пакет из приблизительно пяти разных языков, предназначенных для разных целей: "Gallina", "Vernacular", "F-ing modules", "Ltac", "Ltac2". Может что ещё забыл. Большая часть говна высирается на "Ltac", читать его невозможно и бессмысленно.

                    Что такое Ltac? Представь себе парное программирование. Ты приятелю говоришь: так, пили лямду с аргументами a b c. Теперь давай кейз-анализис a. Тут возвращаем это. Тут возвращаем то. Теперь давай зови эту функцию. Ну а тут легко, сам разберёшься.

                    Ну а потом сорцы проебали, и закоммитили в репу стенограмму твоего монолога. Это Ltac.
                    Ответить
                    • >Gallina
                      этож курица
                      Ответить
                      • «Галлина Бланка», буль-буль, буль-буль!
                        «Галлина Бланка», буль-буль, буль-буль!
                        «Галлина Бланка», буль-буль, буль-буль!
                        «Галлина Бланка», буль-буль, буль-буль!

                        Ко-ко, ко-ко, ко-ко, ко-ко, «Файн фудс»!
                        Ко-ко, ко-ко, ко-ко, ко-ко, «Файн фудс»!
                        Ко-ко, ко-ко, ко-ко, ко-ко, «Файн фудс»!

                        «Кнорр», вкусен и скор!
                        Ответить
                    • Почему при программировании на Coq думать вообще не надо? Потому что в нормальных языках обычно нужно написать функцию, а то и целый модуль целиком, попытаться скомпилировать, пофиксить ошибки, повторить. В Coq компиляция интерактивная (очень грубо говоря). Можно написать пол-функции, и оставить в функции дырку (или несколько), компилятор он дойдёт до дырки, вывалит тебе текущий контекст и спросит: дальше что? А ты ему:
                      eauto with *.
                      т.е. "мне лень, сам там придумай что-нибудь своими эвристиками." И он придумывает какой-нибудь высер на 10000 строк, который проходит тайп-чек. Для математики большего и не надо, ибо для доказательств важен просто сам факт существования терма с неким типом.
                      Ответить
                      • Но мир постигнет катастрофа, когда говнокодеры поймут, что по Карри-Ховарду что одному человеку доказательство, другому — программа. И начнут использовать Ltac-подобную парадигму для, собственно, программирования.
                        Ответить
                        • А зачем эта типопитушня? Вот смотрю я на идею abstract rewriting system и задаюсь вопросом, типа нафига вся эта возня с типами, если можно всю эту питушню с доказываниями построить на каких-то правилах переписывания, типа как в http://us.metamath.org/ сделано? http://us.metamath.org/mpeuni/mmset.html#proofs
                          - там вот в примере разбирают как доказывают 2 + 2 = 4, и делается это без всяких лямбда-исчислений, типов и прочей хуйни, чисто на term rewriting, просто применяем набор каких-то правил переписывания и одну хуйню трансформируем в другую, вот и все. И при желании всю эту типопитушню можно какими-то говнотермами имитировать, т.е. всякого рода типы можно уже выражать в терминах каких-то разрешенных правил для переписывания терма на терм. Только вот нахуй эти типы нужны? Профит в чем?
                          Ответить
                          • metamath -- сообщество совершенно поехавших индивидуумов.

                            "Возня" с типами нужна во-первых для того, чтобы карманный брадобрей не снёс тебе яичко (и чтобы не наступить на другие известные парадоксы). Во-вторых, переписывание термов -- это тупо частный случай того, что можно сотворить в Coq.
                            Ответить
                            • P.S. В общем, на вопрос "зачем нужны типы" ещё Рассел ответил, когда 360-noscope'нул Фреге.
                              Ответить
                              • Это про брадобрея, который сам себя брил?

                                У вас охуенный тредик, надо почитат
                                Ответить
                            • > "Возня" с типами нужна во-первых для того, чтобы карманный брадобрей не снёс тебе яичко (и чтобы не наступить на другие известные парадоксы).

                              Так-то от теоремы Гёделя о неполноте никакие типы-хуипы не спасут, сколько ими не обмазывайся.

                              > Во-вторых, переписывание термов -- это тупо частный случай того, что можно сотворить в Coq.

                              Нет, не так. Любая хуйня, которую можно сотворить в Coq, может быть выражена некоторой питушней через переписывание термов. Так что это все по-сути равнозначная хуйня, можно и в том же metamath напитушить эмуляцию всей хуйни из Coq, если сильно упороться, и в Coq можно запилить встроенный metamath и через него доказывать хуйню. Это как рассуждать, что первично, курица или яйцо
                              Ответить
                              • > Так-то от теоремы Гёделя о неполноте никакие типы-хуипы не спасут, сколько ими не обмазывайся.

                                Она тут вообще не при чём. ТГ говорит о том, что в любой достаточно развитой формальной системе всегда найдутся утверждения, правильность или противоречивость _не удастся доказать_ в рамках этой системы (отсюда "неполнота"). От этого никому ни жарко и не холодно, кроме вымерших верунов в программу Гильберта, ибо подобные утверждения (или обратные им) можно всегда принять как аксиомы, получив тем самым две новые формальные системы, и пойти дальше. Логические же парадоксы уничтожают формальные системы, т.к. с их помощью _можно доказать_ любую фигню. Почувствуй разницу.

                                > Любая хуйня, которую можно сотворить в Coq, может быть выражена некоторой питушней через переписывание термов.

                                Это редукционизм. "И метамаф и кок компилируются в машинные коды, поэтому прувить всё надо на них."
                                Ответить
                                • > Она тут вообще не при чём. ТГ говорит о том, что в любой достаточно развитой формальной системе всегда найдутся утверждения, правильность или противоречивость _не удастся доказать_ в рамках этой системы (отсюда "неполнота").
                                  Не, нихуя. ТГ говорит что формальная система или неполна (существуют утверждения, которые нельзя ни доказать, ни опровергнуть) или противоречива (сушествуют утверждения, которые можно и доказать, и опровергнуть). И вот если говорить о хуйне с брадобреем, которую называют еще парадоксом Рассела, то это тоже к теореме Гёделя относится т.к. это про противоречивость логической системы Фреге, которая была ранней попыткой аксоиматизации Канторовской теории множеств. Так что ТГ вполне себе имеет отношение к этой всей хрени.

                                  Впрочем похуй, это всё ньюансы. У меня таки вопрос - а каким образом наличие какой-то там хитровыебаной системы типов страхует меня от противоречивой формальной системы (т.е. ситуации, когда одно и то же утверждение можно и доказать, и опровергнуть)? В Coq например были какие-то баги, когда там ложь доказывали https://github.com/clarus/falso
                                  Ответить
                                  • > ТГ говорит что формальная система или неполна или противоречива

                                    Ты то же самое сейчас сказал. Противоречивые формальные системы бессмысленны с практической точки зрения, поэтому на них не стоит заострять внимание. Про неполные системы я расписал.

                                    > У меня таки вопрос - а каким образом наличие какой-то там хитровыебаной системы типов страхует меня от противоречивой формальной системы

                                    Термы в Coq имеют (невидимый по умолчанию) universe index, и типы выражений обязаны иметь больший индекс, нежели термы, которые они описывают. Таким образом, если ты попытаешься создать тип брадобреев, которые (не)бреют себя, получишь ошибку universe inconsistency.

                                    > В Coq например были какие-то баги, когда там ложь доказывали https://github.com/clarus/falso

                                    Емнип, эта петушня coqchk не проходила. (coqchk является доверенным ядром, а coqtop/coqc — нет). Ставить древнюю версию, чтобы проверить, мне лень. Ну а так, баги бывают, и никто не гарантирует (и не может гарантировать), что в coqchk их нет. Поэтому размер доверенного ядра тайпчекера стараются держать очень маленьким и про все изменения сначала публикуют peer-reviewed статью.
                                    Ответить
                                    • > Термы в Coq имеют (невидимый по умолчанию) universe index, и типы выражений обязаны иметь больший индекс, нежели термы, которые они описывают. Таким образом, если ты попытаешься создать тип брадобреев, которые (не)бреют себя, получишь ошибку universe inconsistency.

                                      Ну как бы да, это один из возможных вариантов, можно википедию процитировать https://ru.wikipedia.org/wiki/Парадокс_Рассела#Теория_типов_Рассела :

                                      > Первым, кто предложил теорию, свободную от парадокса Рассела, был сам Рассел. Он разработал теорию типов, первая версия которой появилась в книге Рассела «Принципы математики[en]» в 1903 году[24]. В основе этой теории лежит следующая идея: простые объекты в этой теории имеют тип 0, множества простых объектов имеют тип 1, множества множеств простых объектов имеют тип 2 и так далее. Таким образом, ни одно множество не может иметь себя в качестве элемента. Ни множество всех множеств, ни расселовское множество не могут быть определены в этой теории. ....

                                      Конкретно парадокс Рассела решается и без этого, можно просто взять ZF или ZFC, где этого парадокса нет. Если же говорить в общем и целом, может ли какая-то система типов защитить от получения противоречивой формальной системы (а не только защитить от парадокса Рассела) ?
                                      Ответить
                                      • > может ли какая-то система типов защитить от получения противоречивой формальной системы

                                        Иными словами, существует ли строгое доказательство, что если мы делаем формальную систему с такой-то системой типов, то она точно будет непротиворечивой?
                                        Ответить
                                      • > Теория_типов_Рассела

                                        > на вопрос "зачем нужны типы" ещё Рассел ответил

                                        > может ли какая-то система типов защитить от получения противоречивой формальной системы

                                        Нет, программа Гильберта была направлена на это, и всем известно, чем она кончилась. inb4: ну раз системы типов не гарантируют божественной непротиворечивости, то они не нужны. А вот и нужны. Недаром ко всем динамическим недоязыкам (erlang, python, js, ...) со слезами и соплями потом пытаются сбоку привинтить систему типов.

                                        > можно просто взять ZF или ZFC, где этого парадокса нет

                                        Нахер? Конструктивистская логика тем хороша, что это по сути функциональный язык программирования. "Доказательство" на coq без аксиом можно взять и запустить, это тупо некая чистая тотальная функция. Тем он и красив.
                                        Ответить
                                        • > "Доказательство" на coq без аксиом можно взять и запустить, это тупо некая чистая тотальная функция. Тем он и красив.

                                          Ну вот допустим я на coq докажу теорему Пифагора. Что будет это доказательство делать, если его взять и запустить? И нахуя его вообще запускать?

                                          Что за хуйню обычно доказывают в этом coq, и каким образом умение "запускать" доказательства дает какой-то профит?
                                          Ответить
                                          • > что будет это доказательство делать

                                            Эм, по джвум сторонам возвращать длину третьей?
                                            Ответить
                                            • Но ведь чтоб по двум сторонам треугольника возвращать третью, доказывать ничего не надо. Я и без всяких доказательств такую программу написать могу. Мне интересно, что должно делать "запускание" доказательства
                                              Ответить
                                        • Или допустим если доказать великую теорему Ферма в Coq, что будет делать это "доказательство", если его запустить? Напишет "Великая теорема Ферма правильная, мамой клянус!" ?
                                          Ответить
                                          • «Великая Теорема Ферма правильная, Кок!».
                                            Ответить
                                          • — Ты всего лишь машина. Только имитация жизни. Робот сочинит симфонию? Робот превратит кусок холста в шедевр искусства?
                                            Ответить
                                          • Блин, давно бы взял и педивикию почитал уже.
                                            Как я уже говорил, доказательство утверждения P в coq — чистая тотальная функция, имеющая тип P.
                                            Тип тотальной чистой функции "A -> B -> C" можно интерпретировать как теорему вида "из A и B следует С". Тип "(A + B) -> C" можно интерпретировать как "из A или B следует С". Допустим, что False — тип без конструкторов. Создать значение с тиким типом нельзя. Тогда функцию типа "A -> False" можно интерпретировать как теорему вида "A неверно" (ибо из A следует какая-то хуйня) или "не A". Таким образом у тебя получается почти что нормальная логика (без исключённого третьего, правда), доказывай ей что хочешь.
                                            Ответить
                                            • Как доказать теорему Пифагора... Написать чистую функцию типа: "forall a b c, ..... -> (a*a + b*b = c*c)". Где "=" это тип с двумя параметрами и одним конструктором, "eq_refl : forall a, a = a". Соответственно, создать значение типа `=` можно только доказав каким-то образом, что оба параметра равны.
                                              Ответить
                                              • Я из твоих объяснений так нихуя и не понял. Зачем мне надо запускать доказательство какой-то хуйни как программу? Ну допустим что я запустил доказательство как программу, и эта программа мне вернет TRUE (типа вот да, доказательство верное, все норм), и что? Профит в чем?
                                                Ответить
                                                • > и эта программа мне вернет TRUE (типа вот да, доказательство верное, все норм), и что?

                                                  Нет, не так. Сам факт существования программы с неким типом — это и есть доказательство. Профит в том, что разница между "вызвать функцию" и "modus ponens", "программированием" и "логикой" стирается, а чем меньше сущностей — тем лучше.
                                                  Ответить
                                                  • Т. е. основное назначение «Coq» — доказательство существования объекта с заданными свойствами? Если «Coq» смог сгенерировать реальный пример программы, что-то делающей с объектом, значит, объект существует? А если нам нужно доказать не существование, а что-то другое, то нужно переформулировать условие так, чтобы свести его к существованию?
                                                    Ответить
                                                    • Да, примерно так. Конструктивистская логика построена по принципу "пруфпик или не было": объекты существуют, если есть способ их создать (а именно, слепить объект из его конструкторов, или написать функцию). Ключевое отличие от классической логики в том, что принцип в исключённого третьего (forall A, A || not A) здесь не верят, ибо доказав "not A" ты не демонстрируешь способ создать A. Врочем, его можно принять как аксиому.
                                                      Ответить
                                              • а можно для тупых?
                                                как Coq поймет, что не любые a b c подходят, а только те, что являются сторонами прямоугольного треугольника? (иначе ты как раз получишь ПИФОГОР СОСНУЛЕЙ Т.К. НЕ СОШЛОСЬ!)
                                                Ответить
                                                • Значит, нужно запихнуть в условия какие-то свойства треугольника, но только не саму теорему Пифагора (потому что тогда доказывать будет нечего).

                                                  Но что можно запихнуть? Угол между двумя сторонами (зная только длины трёх сторон) мы можем посчитать по теореме косинусов. Значит, придётся доказывать теорему косинусов, а она обычно доказывается через теорему Пифагора.

                                                  Отпадает. Нужно придумать, как ещё можно описать треугольник.
                                                  Ответить
                                                • > как Coq поймет, что не любые a b c подходят, а только те, что являются сторонами прямоугольного треугольника?

                                                  Верно замечено. Эту часть я опустил (см. "..... -> "), ибо описать "Евклидово пространство" и "треугольник" ещё надо суметь, за этим обращайся к этим ребятам: http://geocoq.github.io/GeoCoq/
                                                  Ответить
                                                  • «GeoCoq» звучит как очередная файка на «Говнокоде».
                                                    Ответить
                                                  • >>> https://geocoq.github.io/GeoCoq/html/GeoCoq.Axioms.euclidean_axioms.html
                                                    Class area `(Ax : euclidean_euclidean) :=
                                                    {
                                                      EF : Point → Point → Point → Point → Point → Point → Point → Point → Prop;
                                                      ET : Point → Point → Point → Point → Point → Point → Prop;
                                                      axiom_EFreflexive :
                                                       ∀ A B C D, EF A B C D A B C D;
                                                      axiom_ETreflexive :
                                                       ∀ A B C, ET A B C A B C;
                                                      axiom_congruentequal :
                                                       ∀ A B C a b c, Cong_3 A B C a b c → ET A B C a b c;
                                                      axiom_ETpermutation :
                                                       ∀ A B C a b c,
                                                        ET A B C a b c →
                                                        ET A B C b c a ∧
                                                        ET A B C a c b ∧
                                                        ET A B C b a c ∧
                                                        ET A B C c b a ∧
                                                        ET A B C c a b;
                                                      axiom_ETsymmetric :
                                                       ∀ A B C a b c, ET A B C a b c → ET a b c A B C;
                                                      axiom_EFpermutation :
                                                       ∀ A B C D a b c d,
                                                       EF A B C D a b c d →
                                                         EF A B C D b c d a ∧
                                                         EF A B C D d c b a ∧
                                                         EF A B C D c d a b ∧
                                                         EF A B C D b a d c ∧
                                                         EF A B C D d a b c ∧
                                                         EF A B C D c b a d ∧
                                                         EF A B C D a d c b;
                                                      axiom_halvesofequals :
                                                       ∀ A B C D a b c d, ET A B C B C D →
                                                                               TS A B C D → ET a b c b c d →
                                                                               TS a b c d → EF A B D C a b d c → ET A B C a b c;
                                                      axiom_EFsymmetric :
                                                       ∀ A B C D a b c d, EF A B C D a b c d →
                                                                               EF a b c d A B C D;
                                                      axiom_EFtransitive :
                                                       ∀ A B C D P Q R S a b c d,
                                                         EF A B C D a b c d → EF a b c d P Q R S →
                                                         EF A B C D P Q R S;
                                                      axiom_ETtransitive :
                                                       ∀ A B C P Q R a b c,
                                                        ET A B C a b c → ET a b c P Q R → ET A B C P Q R;
                                                      axiom_cutoff1 :
                                                       ∀ A B C D E a b c d e,
                                                        BetS A B C → BetS a b c → BetS E D C → BetS e d c →
                                                        ET B C D b c d → ET A C E a c e →
                                                        EF A B D E a b d e;
                                                      axiom_cutoff2 :
                                                       ∀ A B C D E a b c d e,
                                                        BetS B C D → BetS b c d → ET C D E c d e → EF A B D E a b d e →
                                                        EF A B C E a b c e;
                                                      axiom_paste1 :
                                                       ∀ A B C D E a b c d e,
                                                        BetS A B C → BetS a b c → BetS E D C → BetS e d c →

                                                    Какой хардкор )))
                                                    Ответить
                                                    • Класс объекта: Евклид.
                                                      Ответить
                                                    • Да вроде всё наглядно. По крайней мере я тут больше понимаю, чем в коде из топика.
                                                      Ответить
                                                      • Меня больше впечатляет количество букв.
                                                        Ответить
                                                        • Ты про A B C D a b c d? Ну видимо типы и их значения?
                                                          Ответить
                                                          • Ага, и про перестановки.
                                                            axiom_EFpermutation :
                                                               ∀ A B C D a b c d,
                                                               EF A B C D a b c d →
                                                                 EF A B C D b c d a ∧
                                                                 EF A B C D d c b a ∧
                                                                 EF A B C D c d a b ∧
                                                                 EF A B C D b a d c ∧
                                                                 EF A B C D d a b c ∧
                                                                 EF A B C D c b a d ∧
                                                                 EF A B C D a d c b;

                                                            Почему не все 24, интересно…
                                                            Ответить
                                                            • А остальные видимо из этих выводятся? Х.з.
                                                              Ответить
                                                              • Т. е. если сказать петуху, что перестановками abc могут быть acb и bac, то он применит алгоритм рекурсивно и на втором шаге получит cab и bca, на третьем шаге — cba. Так?
                                                                Ответить
                                                                • Да не должен... Но мы же не видим как это дальше используется.
                                                                  Ответить
                                                    • Дорогой, у нас в чулане снова завелись ма-те-ма-ти-ки
                                                      Ответить
                      • бля, надо добавить это в «PHP»
                        Ответить
                        • Чтоб пыхомакаки формально доказывали невозможность осуществить SQL инъекции?
                          Ответить
                          • чтобы пыхомакаки могли хуячить eauto with *. ровно в 18.00 и уходить домой
                            Ответить
    • Это какой-то шаблонизатор для математиков из рашки?
      Ответить

    Добавить комментарий