<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://lj.rossia.org/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>Hinterland</title>
  <link>http://lj.rossia.org/users/zhd/</link>
  <description>Hinterland - LJ.Rossia.org</description>
  <managingEditor>Hinterland</managingEditor>
  <lastBuildDate>Tue, 10 Jan 2017 17:56:44 GMT</lastBuildDate>
  <generator>LiveJournal / LJ.Rossia.org</generator>
  <image>
    <url>http://lj.rossia.org/userpic/198255/62784</url>
    <title>Hinterland</title>
    <link>http://lj.rossia.org/users/zhd/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/7120.html</guid>
  <pubDate>Tue, 10 Jan 2017 17:56:44 GMT</pubDate>
  <title> Против аналогового секвенсора не попрешь, part 1: QuasiQuotation</title>
  <link>http://lj.rossia.org/users/zhd/7120.html</link>
  <description>На первоначальных этапах нам предстоит иметь дело с генерацией и преобразованиями &lt;b&gt;С&lt;/b&gt;-кода, поэтому стоит поговорить о механизме QuasiQuotation.&lt;br /&gt;&lt;br /&gt;Пусть у вас есть два языка программирования &lt;em&gt;L&lt;/em&gt; и &lt;em&gt;M&lt;/em&gt; (это может быть один и тот же язык). Вы хотите генерировать или преобразовывать программы на языке &lt;em&gt;M&lt;/em&gt; функциями языка &lt;em&gt;L&lt;/em&gt;. Пусть S&lt;em&gt;M&lt;/em&gt; -- тип, описывающий синтаксис языка &lt;em&gt;M&lt;/em&gt; в языке &lt;em&gt;L&lt;/em&gt;. На практике тип S&lt;em&gt;M&lt;/em&gt; это обычно запутанный набор взаимно-рекурсивных типов. Чтобы что-то с ним сделать вам придется изучить как он устроен и писать много довольной уродливых выражений. Гораздо удобнее иметь механизм, позволяющий вам писать куски кода на &lt;em&gt;M&lt;/em&gt;, которые автоматически преобразовываются в выражения типа S&lt;em&gt;M&lt;/em&gt;. Более того, вы можете иметь ``переменные&apos;&apos; внутри фрагментов &lt;em&gt;M&lt;/em&gt;-кода, с соответствующей операцией подстановки. Это и есть механизм QuasiQuotation. Когда возможности подстановки нет, это называется просто &lt;a href=&quot;http://stackoverflow.com/questions/10556631/what-is-the-meaning-of-quasi-in-quasiquotations&quot;&gt;Quotation&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Поясним на примере.&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;  Пусть &lt;em&gt;L&lt;/em&gt;=&lt;b&gt;Haskell&lt;/b&gt;, &lt;em&gt;M&lt;/em&gt;=&lt;b&gt;C&lt;/b&gt;. Пользуемся пакетом &lt;a href=&quot;https://hackage.haskell.org/package/language-c-quote-0.11.4.1/docs/Language-C-Quote.html&quot;&gt;language-c-quote&lt;/a&gt;. Очень, надо сказать, неудачное там определение синтаксиса &lt;b&gt;C&lt;/b&gt;. Но для примера это даже хорошо.&lt;br /&gt;&lt;br /&gt;  Напишем функцию, которая для любых двух &lt;b&gt;C&lt;/b&gt;-типов дает определение их прямого произведения, т.е. структуры с двумя полями заданных типов. Без QQ это выглядит так:&lt;br /&gt;  &lt;tt&gt;&lt;br /&gt;&amp;nbsp;    droot :: Decl          &lt;br /&gt;&amp;nbsp;    droot = DeclRoot noLoc&lt;br /&gt;&lt;br /&gt;&amp;nbsp;    ident :: String -&amp;gt; Id&lt;br /&gt;&amp;nbsp;    ident i = Id i noLoc&lt;br /&gt;&lt;br /&gt;&amp;nbsp;    ty :: TypeSpec -&amp;gt; Type&lt;br /&gt;&amp;nbsp;    ty t = Type (DeclSpec [] [] t noLoc) droot noLoc      &lt;br /&gt;          &lt;br /&gt;&amp;nbsp;    struct :: Id -&amp;gt; [FieldGroup] -&amp;gt; TypeSpec&lt;br /&gt;&amp;nbsp;    struct i [] = Tstruct (Just i) Nothing [] noLoc          &lt;br /&gt;&amp;nbsp;    struct i (x : xs) = Tstruct (Just i) (Just (x : xs)) [] noLoc&lt;br /&gt;&lt;br /&gt;&amp;nbsp;    fieldG :: TypeSpec -&amp;gt; Id -&amp;gt; FieldGroup              &lt;br /&gt;&amp;nbsp;    fieldG t x = FieldGroup (DeclSpec [] [] t noLoc) [Field (Just x) (Just droot) Nothing noLoc] noLoc&lt;br /&gt;&lt;br /&gt;&amp;nbsp;    product :: String -&amp;gt; TypeSpec -&amp;gt; TypeSpec -&amp;gt; Type&lt;br /&gt;&amp;nbsp;    product s t0 t1 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;    let&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;      name = ident s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;      proj0 = ident (s ++ &quot;_proj0&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;      proj1 = ident (s ++ &quot;_proj1&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;    in&lt;br /&gt;&amp;nbsp;      ty . struct name $ [fieldG t0 proj0, fieldG t1 proj1]&lt;br /&gt;  &lt;/tt&gt;&lt;br /&gt;Ад каннибалов, не правда ли? C QQ это выглядит так:&lt;br /&gt;  &lt;tt&gt;&lt;br /&gt;&amp;nbsp; product&apos; :: String -&amp;gt; TypeSpec -&amp;gt; TypeSpec -&amp;gt; Type&lt;br /&gt;&amp;nbsp; product&apos; s t0 t1 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;    let&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;        name = s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;        proj0 = s ++ &quot;_proj0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;        proj1 = s ++ &quot;_proj1&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;        ty0 = ty t0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;        ty1 = ty t1&lt;br /&gt;&amp;nbsp;&amp;nbsp;   in&lt;br /&gt;&amp;nbsp;      [cty| struct $id:name {$ty:ty0 $id:proj0 ; $ty:ty1 $id:proj1 ;} |]&lt;br /&gt;  &lt;/tt&gt;&lt;br /&gt;В QQ-варианте из вспомогательных функций нам понадобилась только &lt;tt&gt;ty&lt;/tt&gt;, все остальное делают идиоматические скобочки &lt;tt&gt;[cty| .. |]&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Если вызвать &lt;tt&gt;product  &quot;product&quot; int double&lt;/tt&gt;, то обе функции дают нужный результат:&lt;br /&gt;  &lt;tt&gt;&lt;br /&gt;&amp;nbsp;    struct product {&lt;br /&gt;&amp;nbsp;&amp;nbsp;    int product_proj0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;    double product_proj1;&lt;br /&gt;    }&lt;br /&gt;  &lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Такие дела. На фото я.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://combiboilersleeds.com/images/willard-van-orman-quine/willard-van-orman-quine-0.jpg&quot; scale=&quot;0.75&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/7120.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/7120&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/7120.html</comments>
  <category>generic programming</category>
  <category>haskell</category>
  <category>music making</category>
  <lj:music>Tomo Akikawabaya -- Mars</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/6745.html</guid>
  <pubDate>Mon, 09 Jan 2017 10:33:46 GMT</pubDate>
  <title>Против аналогового секвенсора не попрешь, part 0</title>
  <link>http://lj.rossia.org/users/zhd/6745.html</link>
  <description>Ах да, синтостроительный блог. Все в курсе, что пресеты убивают музыку, да? Вместо того, чтобы искать интересные новые звуки, люди просто строят композиции из уже готовых. Иногда это уместно, но когда я снова и снова слышу драм-машину TB-808, хочется ``&lt;em&gt;блевануть, прыгнуть с обрыва, броситься по автобус&lt;/em&gt;&apos;&apos;. Симфонический оркестр, панк-тройка это все виды пресетов. Кроме того, думаю ясно, что инструмент (в широком смысле) накладывает определенные ограничения на конечный результат. &lt;em&gt;Здесь должна быть релевантная цитата из Миши про кубейс, но я ее почему-то не нашел&lt;/em&gt;.&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;На самом деле, как правильно &lt;a href=&quot;https://lj.rossia.org/users/zhd/5228.html?thread=13164#t13164&quot;&gt;заметил анон&lt;/a&gt;, музыка здесь играет второстепенную роль. Я просто хочу сделать для себя playground для экспериментов в мета-программировании, предметно-ориентированных языках и высокопроизводительных вычислениях.&amp;lt;/p&amp;gt; &lt;br /&gt;&lt;p&gt;Значит нашей предметной областью будет построение (виртуальных) модульных синтезаторов. Как известно, в этой области популярны так называемые ``&lt;em&gt;визуальные языки программирования&lt;/em&gt;&apos;&apos; типа &lt;b&gt;Pure Data&lt;/b&gt;, &lt;b&gt;Max&lt;/b&gt; и &lt;b&gt;Reactor&lt;/b&gt;. Мне они не нравятся своей вопиющей двухмерностью. Мне кажется (входим в область спекуляций), что гораздо удобнее будет иметь язык для описания модулей и язык для описания их комбинаций, имеющие некоторые формы полиморфизма, возможности задания параметрических семейств и т.п. Типа если мне нужен fm-синтезатор с &lt;em&gt;n&lt;/em&gt; осцилляторами, то мне проще описать семейство, параметризованное натуральными числами, чем рисовать гребанные диаграммы для каждого конкретного &lt;em&gt;n&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Пока просматриваются два уровня. На нулевом находится язык описания базовых модулей (осцилляторы, фильтры, огибающие и т.п.). Первый уровень это язык схем т.е. базовые комбинаторы: последовательное, параллельное соединение, введение обратной связи, стягивание входов и разветвление выходов. Дальше пойдут комбинаторы высших порядков и семейства моделей. Таков план.&lt;br /&gt;&lt;br /&gt;Реализуется все в &lt;b&gt;Hasckell&lt;/b&gt;, по описанию моделей генерируется &lt;b&gt;С&lt;/b&gt; код, который затем компилируется и динамически подгружается обратно в &lt;b&gt;Hasckell&lt;/b&gt;. Промежуточные типы для взаимодействия между &lt;b&gt;С&lt;/b&gt; и &lt;b&gt;Hasckell&lt;/b&gt; генерируются автоматически (Look Mum No Hands!).&lt;br /&gt;&lt;br /&gt;Такие дела, на фото я.&lt;br /&gt;&lt;img src=&quot;http://68.media.tumblr.com/eda3f3da2a943b36bebb7908caf999ad/tumblr_nen4rkfGgq1ss467co1_1280.jpg&quot; scale=&quot;0.5&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/6745.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/6745&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/6745.html</comments>
  <category>generic programming</category>
  <category>haskell</category>
  <category>music making</category>
  <lj:music>Black Marble -- Pretender </lj:music>
  <lj:mood>calm</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/6604.html</guid>
  <pubDate>Thu, 29 Dec 2016 11:37:15 GMT</pubDate>
  <title>Fires within fires</title>
  <link>http://lj.rossia.org/users/zhd/6604.html</link>
  <description>Надо отметить, что этот мистический пожар гораздо интереснее предыдущего.&lt;br /&gt;Особенно про убитых черкассов понравилось.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/6604.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/6604&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/6604.html</comments>
  <lj:music>Сруб -- Ересь</lj:music>
  <lj:mood>amused</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/6281.html</guid>
  <pubDate>Fri, 19 Aug 2016 18:39:17 GMT</pubDate>
  <title>Amnesty (I)</title>
  <link>http://lj.rossia.org/users/zhd/6281.html</link>
  <description>Пацаны, у Crystal Castles новый альбом вышел. &lt;br /&gt;(на самом деле еще нет, но на трекерах &lt;a href=&quot;http://rutracker.org/forum/viewtopic.php?t=5269467&quot;&gt;уже есть&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://i79.fastpic.ru/big/2016/0817/b8/38041fa24bd567cbb3288dd39d7e4db8.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/6281.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/6281&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/6281.html</comments>
  <lj:music>Crystal Castles -- Chloroform</lj:music>
  <lj:mood>tired</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/5953.html</guid>
  <pubDate>Wed, 20 Jul 2016 18:36:15 GMT</pubDate>
  <title>Володя - потусторонний шофёр</title>
  <link>http://lj.rossia.org/users/zhd/5953.html</link>
  <description>&lt;a href=&quot;http://www.math.ias.edu/vladimir/files/2015_06_30_RDP.pdf&quot;&gt;Интресное&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Then I was surrounded by a group of logisticians who trusted the connection &lt;br /&gt;between type theories and set theory on faith and who tried to convince me &lt;br /&gt;and others that mathematicians should do likewise.   &lt;br /&gt;It is only less than a year ago and due to the steadfast refusal of the &lt;br /&gt;mathematical community to do so that I was able to disentangle myself from &lt;br /&gt;them and to continue the work interrupted in 2009.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Прежде, чем объединяться, и для того, чтобы объединиться, мы должны сначала решительно и определенно размежеваться:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;There is a theory that logicians developed that is based on concepts such as&lt;br /&gt;meaning explanation or strong normalization that provides consistency proofs&lt;br /&gt;for some sample type theories but it leads to the isolation of type theory from&lt;br /&gt;the rest of mathematics rather than to their integration.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Если кто не верит в сильную нормализацию, это нам кафиры, короче. &lt;br /&gt;&lt;br /&gt;На фото Владимир Воеводский переосмысливает теории Мартин-Лефа с точки зрения современной математики:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://66.media.tumblr.com/60a3c2a2dbfbb61eb9fa3b06b6768a7c/tumblr_nuza9c5aDW1slctqgo1_500.jpg&quot; width=&quot;50%&quot; height=&quot;50%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/5953.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/5953&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/5953.html</comments>
  <category>type theory</category>
  <category>univalent foundations</category>
  <lj:music>Makina Gigir -- Тихое Горе/Chagrin Muet</lj:music>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/5228.html</guid>
  <pubDate>Wed, 09 Mar 2016 18:48:18 GMT</pubDate>
  <title>Worse than random generated syntax</title>
  <link>http://lj.rossia.org/users/zhd/5228.html</link>
  <description>Пользователь &lt;span class=&apos;ljruser&apos; style=&apos;white-space: normal;&apos;&gt;&lt;a href=&apos;http://lj.rossia.org/userinfo.bml?user=ketmar&apos;&gt;&lt;img src=&apos;http://lj.rossia.org/img/userinfo.gif&apos; alt=&apos;[info]&apos; style=&apos;vertical-align: bottom; border: 0;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://lj.rossia.org/users/ketmar/&apos;&gt;&lt;b&gt;ketmar&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;http://lj.rossia.org/users/ketmar/1277012.html&quot;&gt;вновь поднимает&lt;/a&gt; важный вопрос. От себя добавлю ссылку на статью &lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1637.pdf&quot;&gt;Subtleties of the ANSI/ISO C standard&lt;/a&gt;. Краткое содержание: ``&lt;em&gt;there is no C program for which the standard can guarantee that it will not crash&lt;/em&gt;&apos;&apos;. Типа, все что нужно знать о языке С.&lt;br /&gt;&lt;br /&gt;Язык С -- не для людей, но есть области, в которых он хорош. Поэтому его можно использовать в качестве целевого языка, работая внутри другого языка. В Haskell, например, для этого можно использовать механизм &lt;a href=&quot;https://wiki.haskell.org/Quasiquotation&quot;&gt;QuasiQuotes&lt;/a&gt;. Очень удобно. Экспериментирую тут с музыкальными модульными синтами. Каждый модуль это небольшой кусочек С-кода, прописывается вручную. Есть комбинаторы для разных видов композиции модулей. Haskell-программа делает из кусочков полноценные функции. Плюс следит за совместимостью модулей, строит (когда возможно) преобразование синтаксически неэквивалентных структур и т.п. Плюс возможность иметь модули, параметризованные более-менее чем угодно. Ну и так далее. Пока я в самом начале; иншаллах, здесь будет синтостроительный блог. Называться будет ``&lt;em&gt;&lt;a href=&quot;https://lj.rossia.org/users/tiphareth/322001.html&quot;&gt;Против аналогового секвенсора не попрешь&lt;/a&gt;&lt;/em&gt;&apos;&apos;, конечно же.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tip&lt;/b&gt;: Когда вы знакомитесь с языком, смотрите как в нем реализована (если вообще) &lt;a href=&quot;https://en.wikipedia.org/wiki/Direct_sum&quot;&gt;прямая сумма&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Такие дела, на фото я.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://40.media.tumblr.com/3c8077fd90f5ed013ec01ab3471ef975/tumblr_o2ppfahDjj1su2ieno1_1280.jpg&quot; width=&quot;50%&quot; height=&quot;50%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/5228.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/5228&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/5228.html</comments>
  <lj:music>Chromatics -- Candy</lj:music>
  <lj:mood>calm</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/5003.html</guid>
  <pubDate>Sat, 21 Nov 2015 15:51:11 GMT</pubDate>
  <title>As Live As You Can Get</title>
  <link>http://lj.rossia.org/users/zhd/5003.html</link>
  <description>Lazyweb, может быть кто-нибудь встречал или может составить сам по личному опыту список полезных советов по поводу мастеринга цифрового файла для записи на кассетную пленку? Интересует все, что вы можете сообщить. Punk/post-punk split, tipa. ``Всему хутору расскажем про вашу доброту&apos;&apos; и т.д.  &lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://cs312222.vk.me/v312222187/4406/Ae9vzPxPJB0.jpg&quot; width=&quot;50%&quot; height=&quot;50%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/5003.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/5003&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/5003.html</comments>
  <lj:music>Буерак -- Электропоезд &quot;Ласточка&quot; </lj:music>
  <lj:mood>artistic</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/4625.html</guid>
  <pubDate>Fri, 13 Nov 2015 19:46:07 GMT</pubDate>
  <title>Ричард Карп писал о совсем другом</title>
  <link>http://lj.rossia.org/users/zhd/4625.html</link>
  <description>Великие CS мастера древности такие как Кнут или де Бройн были еще и матерыми комбинаторщиками. Связь между алгоритмической сложностью и комбинаторикой, думаю, ясна (вообще-то нет, тут надо бы большую врезку сделать). К сожалению, успехи микроэлектроники заметно снизили необходимость в тщательном анализе алгоритмов, в результате чего теория сложности была захвачена тварями из черной лагуны и по большей части оказалась в аду неконструктивности. Мне всегда казалось это странным, потому что речь в обоих идет о совокупности конструктивных объектов. Если сказать точнее, я был очень удивлен, что перечислительная комбинаторика в действительности не перечисляет, а только считает объекты.&lt;br /&gt;&lt;br /&gt;Обычный вопрос звучит так: сколько есть объектов типа X, обладающих свойством P. Обычный ответ дает какую-нибудь формулу подсчета и нудное доказательство в котором смешаны объяснения на естественном языке, формулы, рисунки всякие идиотские. Т.е. в доказательстве есть алгоритм построения объектов, но нет подходящего языка, чтобы формально его описать, вместе с доказательством корректности. &lt;br /&gt;&lt;br /&gt;И здесь в игру вступает теория типов.&lt;br /&gt;&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;&lt;br /&gt;Когда я познакомился с языками с зависимыми типами (кстати, знакомству с ними обязан вот &lt;a href=&quot;https://lj.rossia.org/users/tiphareth/924796.html?thread=16958588&quot;&gt;этому комменту&lt;/a&gt;, прочитал я его примерно в 2010) то дико взбодрился, потому что такие языки гораздо лучше подходят для описания и рассуждения о конструктивных объектах. Под лучше, здесь подразумевается прежде всего точность в передачи смыслов. Пример: возьмем перестановки. Перестановку n-элементов можно записать как n-натуральных чисел, где ни одно не повторяется. Обычно в языке программирования нет никакого способа статически передать это свойство ``ни одно не повторяется&apos;&apos;. Лучшее что вы можете сделать это выделить кусок памяти, защитить его, и контролировать все операции, которые с ним совершаются, так чтобы это свойство не нарушалось. Но все это происходит уже в run-time, а нас интересуют &lt;em&gt;структурные различия&lt;/em&gt; на уровне синтаксиса.&lt;br /&gt;&lt;br /&gt;Как это выглядит? Начнем с конечных множеств. Натуральные числа это вот:&lt;br /&gt;&lt;br /&gt;data Nat : Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;     nz : Nat&lt;br /&gt;&amp;nbsp;&amp;nbsp;     ns : Nat -&amp;gt; Nat&lt;br /&gt;Тут вроде бы все ясно: натуральные числа это либо ноль, либо натуральное число плюс один. Надеюсь все понимают, что это чисто синтаксическое представление, в run-time их разумеется можно представить в обычном двоичном виде, но это совсем другая история.&lt;br /&gt;&lt;br /&gt;Конечные множества это такое семейство Fin : Nat -&amp;gt; Set такое, что для каждого натурального числа n : Nat тип Fin n имеет ровно n элементов. Можно задать индуктивно:&lt;br /&gt;&lt;br /&gt;data Fin : Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;     fz : {n : Nat} -&amp;gt; Fin (ns n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;     fs : {n : Nat} -&amp;gt; Fin n -&amp;gt; Fin (ns n)&lt;br /&gt;Т.е. конечные множеста это либо новый элемент (fz), либо вложение (fs) из предыдущего уровня. Соответственен выражений типа Fin nz не бывает, потому что nz нельзя унифицировать с ns n.&lt;br /&gt;&lt;br /&gt;Оказывается, что и другие комбинаторные объекты можно задавать как индуктивные семейства. Это будут &lt;em&gt;точные описания&lt;/em&gt; в том смысле, что синтаксически различные описания будут соответствовать семантически различным объектам.&lt;br /&gt;&lt;br /&gt;Еще примеры.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Конечные инъективные функции&lt;/b&gt;: &lt;br /&gt;data Inj : Nat * Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;  []     : {m   : Nat} -&amp;gt; Inj (0 , m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  _::_   : {n m : Nat}(x : Fin (ns m))(p : Inj (n , m)) -&amp;gt; Inj ((ns n) , (ns m))&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Перестановки&lt;/b&gt;: Inj (n , n)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Сочетания&lt;/b&gt;:&lt;br /&gt;data Bin : Nat * Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;  bz : {n : Nat} -&amp;gt; Bin (n , 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  bs : {n m : Nat}(t : Bin (n , ns m)) -&amp;gt; Bin (ns n , ns m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  bc : {n m : Nat}(t : Bin (n , m)) -&amp;gt; Bin (ns n , ns m)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Разбиения&lt;/b&gt;:&lt;br /&gt;data Partition : Nat * Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;  pz : Partition (0 , 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  ps : {n m : Nat}(p : Partition (n , ns m)) -&amp;gt; Partition (ns m + n , ns m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  pc : {n m : Nat}(p : Partition (n , m)) -&amp;gt; Partition (ns n , ns m)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Числа Каталана&lt;/b&gt;:&lt;br /&gt;data Cat : Nat * Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;  cz : (m : Nat) -&amp;gt; Cat (0 , m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  cn : {n m : Nat} -&amp;gt; (Cat (n , 0) * Cat (m , 0)) -&amp;gt; Cat (n , ns m) -&amp;gt; Cat (ns n , m)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Инволюции&lt;/b&gt;:&lt;br /&gt;data Involution : Nat -&amp;gt; Set where&lt;br /&gt;&amp;nbsp;&amp;nbsp;  iz : Involution nz&lt;br /&gt;&amp;nbsp;&amp;nbsp;  is : {n : Nat}(i : Involution n) -&amp;gt; Involution (ns n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;  ic : {n : Nat}(x : Fin (ns n))(i : Involution n) -&amp;gt; Involution (ns (ns n))&lt;br /&gt;&lt;br /&gt;Собственно все определения получены автоматически из соответствующих рекуррентных соотношений (кроме чисел Каталана, там не совсем автоматически). Не со всеми рекуррентными формулами такое проходит (в смысле получаются точные описания).  &lt;br /&gt;&lt;br /&gt;Для каждого из них можно построить считающую и перечисляющую процедуру, доказать что они корректны. У каждого из этих семейств есть много интерпретаций и их также можно построить. Например, построить отображение &lt;_&gt; : {n m : Nat} -&amp;gt; Inj (n , m) -&amp;gt; Fin n -&amp;gt; Fin m и доказать, что для любой f : Inj (n , m) функция &amp;lt; f &amp;gt; является инъективной.&lt;br /&gt;&lt;br /&gt;Почему это важно? &lt;del&gt;No idea&lt;/del&gt;.&lt;br /&gt;&lt;br /&gt;0) Они индуктивны, значит можно строить структурно рекурсивные функции (что важно, когда находишься внутри тотального языка) и индукцию в доказательства.&lt;br /&gt;1) &lt;a href=&quot;http://strictlypositive.org/view.ps.gz&quot;&gt;Views&lt;/a&gt; для других типов. Скажем вот, можно записать тип перестановок как определен выше, а можно как дизъюнктивное объединение циклов. Когда речь о композиции удобнее первый вариант, а когда о действии -- второй. По идее само определение должно быть, как говорят, абстрактным, а эти два описания -- равноправными способами задавать индукцию. &lt;br /&gt;2) Combinatorial Design.&lt;br /&gt;3) Вдохновившись &lt;a href=&quot;https://en.wikipedia.org/wiki/Combinatorial_species&quot;&gt;комбинаторными видами&lt;/a&gt;, можно значительно расширить класс распознаваемых рекурсивных схем (через &lt;a href=&quot;http://www.easychair.org/publications/download/Djinn_Monotonic&quot;&gt;Memo-структуры&lt;/a&gt;).&lt;br /&gt;4) Собственно хотелось бы построить нормальную теорию сложности.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Такие дела, на фото я.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://d1o50x50snmhul.cloudfront.net/wp-content/uploads/2013/07/dn23820-1_800.jpg&quot; width=&quot;50%&quot; height=&quot;50%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/4625.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/4625&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/4625.html</comments>
  <lj:music>Ladytron -- Jet Age</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/4559.html</guid>
  <pubDate>Mon, 09 Nov 2015 11:04:55 GMT</pubDate>
  <title>Type Refinements for the Working Class</title>
  <link>http://lj.rossia.org/users/zhd/4559.html</link>
  <description>Есть два мотива: синенький и рыженький.&lt;br /&gt;&lt;br /&gt;Рыженькие определения вычислимости основаны на языке (или лучше сказать на понятиях выражения, переменной, подстановки и сокращений), а синенькие -- на  понятии машины. Рыженькие языки программирования -- это те, семантику (или большую ее часть) которых можно объяснить в терминах самого языка, а для объяснения семантики синеньких нужно вводить дополнительные сущности (типа нельзя объяснить программу на Си, не упоминая о том, что есть машина, на которой она выполняется). Рыженькие конструктивные объекты -- это корневые деревья (as in abstract syntax tree), а синенькие -- это простые неориентированные графы. В пользу последнего говорит многое. Например, наименее уродливые программы на рыженьких языках для неориентированных графов в первую очередь строят дерево его обхода, а потом уже делают рекурсию по этому дереву. &lt;br /&gt;&lt;br /&gt;Что касается комбинаторных объектов, то тут... &lt;em&gt;часть записи утеряна&lt;/em&gt;... переписать как рыженький.&lt;br /&gt;&lt;br /&gt;Иллюстрация ко всему вышесказанному:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://pp.vk.me/c625627/v625627236/3bc9e/deoGFAIitgI.jpg&quot; width=&quot;35%&quot; height=&quot;35%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/4559.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/4559&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/4559.html</comments>
  <lj:music>Legowelt -- Strada 83</lj:music>
  <lj:mood>calm</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/4319.html</guid>
  <pubDate>Thu, 02 Jul 2015 17:54:08 GMT</pubDate>
  <link>http://lj.rossia.org/users/zhd/4319.html</link>
  <description>Сrystal Сastels. &lt;a href=&quot;https://soundcloud.com/crystal-castles/deicide&quot;&gt;Новый трек&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Типа вот:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://40.media.tumblr.com/tumblr_mcteojvTFU1rk8o0xo1_1280.jpg&quot; width=&quot;50%&quot; height=&quot;50%&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/4319.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/4319&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/4319.html</comments>
  <category>music</category>
  <lj:music>Keluar -- Panguna</lj:music>
  <lj:mood>cheerful</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/3909.html</guid>
  <pubDate>Sat, 13 Jun 2015 20:31:31 GMT</pubDate>
  <title>Виталий Даркфолк рекомендует</title>
  <link>http://lj.rossia.org/users/zhd/3909.html</link>
  <description>Вся ``структурность&apos;&apos; &lt;a href=&quot;https://youtu.be/Bx4zuvh9PXA&quot;&gt;в четырехчасовом фильме&lt;/a&gt;. Много хороших людей, о которых вы вероятно никогда не слышали.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;560&quot; height=&quot;315&quot; data=&quot;https://www.youtube.com/embed/Bx4zuvh9PXA&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Среди прочего есть запись возмутительного нападения врагов свободы на группу ПКМН во время выступления.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/3909.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/3909&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/3909.html</comments>
  <category>music</category>
  <lj:mood>sleepy</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/3685.html</guid>
  <pubDate>Thu, 16 Apr 2015 19:55:51 GMT</pubDate>
  <title>Записал песню с новой вокалисткой Эдит</title>
  <link>http://lj.rossia.org/users/zhd/3685.html</link>
  <description>Между тем, Crystal Castles &lt;a href=&quot;http://volna.afisha.ru/news/4928/&quot;&gt;выпустили новый трек&lt;/a&gt;. Без няши Элис, ага. Впрочем вокал у них всегда так сильной обработан, что это почти незаметно. Вот странно, что технология вокалоидов не нашла применение в такого рода ситуациях. Если вы все равно собираетесь накладывать кучу эффектов, зачем вам возиться с живым человеком? Очень неудобно. Опять же захотелось текст поменять, это ж снова сессию организовывать, вызванивать там всех... бр... Музыка это слишком важная область, чтобы доверять ее людям. Впрочем, вокалоиды как они сейчас есть тоже неудовлетворительны, поскольку основаны на большой библиотеке семплов. Честный подход, на мой взягляд, это articulatory synthesis. Было бы здорово еще к тему иметь технологию калибровки, типа по записям оценивать необходимые параметры модели речевого тракта. Seems feasible.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/3685.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/3685&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/3685.html</comments>
  <category>music making</category>
  <lj:music>Crystal Castles -- Frail</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/3451.html</guid>
  <pubDate>Wed, 11 Mar 2015 17:29:25 GMT</pubDate>
  <title>Пять высоченных девушек-моделей</title>
  <link>http://lj.rossia.org/users/zhd/3451.html</link>
  <description>&lt;em&gt;Министерство финансов США &lt;a href=&quot;http://lenta.ru/news/2015/03/11/sanctions/&quot;&gt;ввело санкции&lt;/a&gt; против Евразийского союза молодежи&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Поздравляем отцов и мать основательницу! &lt;br /&gt;&lt;br /&gt;&lt;em&gt;Будущее создается тобой, но не для тебя&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Впрочем, все это уже не имеет значения.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/3451.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/3451&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/3451.html</comments>
  <lj:music>Keluar -- Coralline</lj:music>
  <lj:mood>tired</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/3075.html</guid>
  <pubDate>Mon, 02 Mar 2015 18:04:12 GMT</pubDate>
  <title>Кто воюет за унивалентность, тот нам кафир, короче</title>
  <link>http://lj.rossia.org/users/zhd/3075.html</link>
  <description>Зашел посмотреть как дела в унивалентном джамаате. А там уже &lt;a href=&quot;https://github.com/HoTT/book/pull/773&quot;&gt;фитна&lt;/a&gt;, конечно:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;I don’t know who your sources are, but they are not accurate. Michael Warren was my student and we were working together. This was always presented as joint work, and anyone who was present at the early talks will confim this. Perhaps someone will volunteer a confirmation on this list, but I don’t really think it is appropriate to have this sort of discussion here. I only reply now because I cannot allow you to continue to spread such falsehoods in public without any rebuttal. My contributions are a fact beyond doubt, known to many people who were involved in the early development, and I think that your attempts to dispute them are a dishonest and unethical abuse of your influence which should not be tolerated.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Мессадж адресован Воеводскому. Вот так, дорогой Стивен, русня всегда остается русней, не дели с ней хлеб, не зови ее в дом. &lt;br /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.beladusham.com/images/536.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/3075.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/3075&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/3075.html</comments>
  <category>univalence</category>
  <lj:music>Monte Cazazza -- A is for Atom</lj:music>
  <lj:mood>cheerful</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/2898.html</guid>
  <pubDate>Fri, 23 Jan 2015 19:57:06 GMT</pubDate>
  <title>Булева слепота</title>
  <link>http://lj.rossia.org/users/zhd/2898.html</link>
  <description>Юзер &lt;span class=&apos;ljruser&apos; style=&apos;white-space: normal;&apos;&gt;&lt;a href=&apos;http://lj.rossia.org/userinfo.bml?user=ketmar&apos;&gt;&lt;img src=&apos;http://lj.rossia.org/img/userinfo.gif&apos; alt=&apos;[info]&apos; style=&apos;vertical-align: bottom; border: 0;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://lj.rossia.org/users/ketmar/&apos;&gt;&lt;b&gt;ketmar&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;http://lj.rossia.org/users/ketmar/1151707.html&quot;&gt;поднимает важную тему&lt;/a&gt;. В самом деле, сколько можно это терпеть? Как известно, булев тип -- это тип, который имеет ровно два значения. Если вы используете его, чтобы проверить выполняется ли некоторое условие (предикат), то вы оказываетесь в весьма глупом положении, потому что эти значения сами по себе никак не связаны с условием, которые вы хотите проверить. Это явление известно как &lt;em&gt;булева слепота&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;Механизм зависимых типов позволяет излечиться от булевой слепоты.&lt;br /&gt;&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;&lt;br /&gt;Пусть имеются два типа A и B и вы хотите определить функцию f : A -&amp;gt; B. Пусть значения типа A могут обладать некоторым свойством P, которое может выполняется или нет. В обычном языке вам приходится написать функцию p : A -&amp;gt; Bool, проверяющую условие P и две функции g h : A -&amp;gt; B, которые вызываются в зависимости от условия. Т.е. f a = if (p a) then (g a) else (h a). Поскольку функции g и h никак не связаны с условием P вам остается только скрестить пальцы и молиться, что p реализована правильно.&lt;br /&gt;&lt;br /&gt;В языке с зависимыми типами, вы можете явно записать само условие P. Задать условие P значит описать множество его доказательств. Тогда, если a имеет тип A, то P a -- это какое-то доказательство того, что для а выполняется P. Если P разрешимо, то это можно явно записать p : (a : A) -&amp;gt; P a + (P a -&amp;gt; Zero), где + -- это прямая сумма, а Zero -- пустой тип. Аргументом для соответствующих ветвей определяемой функции f будет не только само a, но и доказательство P a либо его отрицание: G : {a : A} -&amp;gt; P a -&amp;gt; B, H : {a : A} -&amp;gt; (P -&amp;gt; Zero) -&amp;gt; B, а функция f определяется так:&lt;br /&gt;&lt;br /&gt;f a with p a&lt;br /&gt;f a | inl x = G x&lt;br /&gt;f a | inr y = H y&lt;br /&gt;&lt;br /&gt;Обе ветви точно знают какую именно ситуацию они обрабатывают, что позволяет избежать большого числа ошибок.&lt;br /&gt;&lt;br /&gt;Интересно, что зависимые типы позволяют рафинировать даже тип с одним значением. В классической ситуации, для есть только один предикат над A, который выполняется для всех a из A -- это тривиальный предикат. В конструктивном случае их, вообще говоря, до фига. В частности, если A -- индуктивный тип, то все P для которых можно определить функцию p : (a : A) -&amp;gt; P a содержат, например, все возможные способы определить индукцию над A. &lt;br /&gt;&lt;br /&gt;Поясним на примере деления. Деление, как известно, нельзя определить с помощью структурной рекурсии над парой натуральных чисел. В тотальных языках это важно, потому что компилятору всегда должно быть очевидно, что каждая определяемая функция завершается. Что же делать. Определяем вспомогательный индуктивный тип, например, так:&lt;br /&gt;&lt;br /&gt;data DivView : Nat -&amp;gt; Nat -&amp;gt; Set where&lt;br /&gt;  dz : {k : Nat}(x : Fin (ns k)) -&amp;gt; DivView (ns k) [ x ]&lt;br /&gt;  ds : {k : Nat}{n : Nat} -&amp;gt; DivView (ns k) n -&amp;gt; DivView (ns k) ((ns k) + n)  &lt;br /&gt;&lt;br /&gt;Здесь Fin -- это тип конечных множеств, [_] : {n : Nat} -&amp;gt; Fin n -&amp;gt; Nat -- функция, которая нумерует элементы конечного множества, ns -- функция следования. Тип DivView можно рассматривать как дерево рекурсивных вызовов процедуры деления. Для любой пары натуральных чисел k, n можно построить функцию unfold: (k n : Nat) -&amp;gt; DivView (ns k) n, которая строит это дерево. Это половина дела. Вторая половина -- свернуть это дерево, чтобы получить функции целой части и остатка. Они уже будут примитивно рекурсивны относительно типа DivView:&lt;br /&gt;&lt;br /&gt;div : {k n : Nat} -&amp;gt; DivView k n -&amp;gt; Nat&lt;br /&gt;div (dz x) = 0&lt;br /&gt;div (ds x) = ns (div x)&lt;br /&gt;&lt;br /&gt;mod : {k n : Nat} -&amp;gt; DivView k n -&amp;gt; Nat&lt;br /&gt;mod (dz x) = [ x ]&lt;br /&gt;mod (ds x) = mod x&lt;br /&gt;&lt;br /&gt;Несложно доказать корректность построенной процедуры:&lt;br /&gt;&lt;br /&gt;div-correct : {k n : Nat}(x : DivView k n) -&amp;gt; n == (div x) * k + mod x&lt;br /&gt;div-correct (dz x) = refl&lt;br /&gt;div-correct (ds {k} {n} x) = trans (cong (_+_ (ns k)) (div-correct x)) (sym (+-assoc (ns k) (div x * ns k) (mod x)))&lt;br /&gt;  where&lt;br /&gt;  open CommutativeSemiring commutativeSemiring using (+-assoc)&lt;br /&gt;&lt;br /&gt;Мы не только объяснили компьютеру что такое деление, но обучили его новым принципам индукции над натуральными числами и новым способам зависимого сопоставления с образцом (dependent pattern matching). Подробнее об этом можно почитать в статье ``&lt;a href=&quot;http://strictlypositive.org/view.ps.gz&quot;&gt;Взгляд Слева&lt;/a&gt;&apos;&apos;. Декомпозиция в виде развертывание / свертывание связана с двойственностью между коалгебрами и алгебрами, про нее можно прочитать в статье ``&lt;a href=&quot;http://eprints.eemcs.utwente.nl/7281/01/db-utwente-40501F46.pdf&quot;&gt;Программирование с помощью бананов, линз, оберток и колючей проволоки&lt;/a&gt;&apos;&apos;. А применительно к определению тотальных функций в статье про &lt;a href=&quot;http://www.cs.ru.nl/~venanzio/publications/General_Recursion_MSCS_2005.pdf&quot;&gt;соответствующий метод&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Незатейливый теоретико-типовой юморок:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://pbs.twimg.com/media/BmvHhbeCcAA-oBK.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/2898.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/2898&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/2898.html</comments>
  <category>dependently typed programming</category>
  <category>type theory</category>
  <lj:music>Tying Tiffany -- Spin Around</lj:music>
  <lj:mood>good</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/2585.html</guid>
  <pubDate>Wed, 21 Jan 2015 19:19:01 GMT</pubDate>
  <title>Polya enumeration theorem</title>
  <link>http://lj.rossia.org/users/zhd/2585.html</link>
  <description>А кто-нибудь знает / может придумать альтернативное определение &lt;a href=&quot;http://en.wikipedia.org/wiki/Cycle_index&quot;&gt;циклического индекса&lt;/a&gt;, чтобы такое же простое, но без полиномов?&lt;br /&gt;&lt;br /&gt;КДПВ:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://scontent-b.cdninstagram.com/hphotos-xaf1/t51.2885-15/e15/915426_495798417208603_452002068_n.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/2585.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/2585&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/2585.html</comments>
  <category>enumerative combinatorics</category>
  <lj:music>CRIM3S -- Stay Ugly</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/2534.html</guid>
  <pubDate>Wed, 31 Dec 2014 10:06:00 GMT</pubDate>
  <title>Крестовый поход детей</title>
  <link>http://lj.rossia.org/users/zhd/2534.html</link>
  <description>Сегодня, как известно, годовщина новогоднего штурма Грозного:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://sirdoomsbadcompany.files.wordpress.com/2010/11/operation-cannot-possibly-fail.png?w=640&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;In April 1995, General Kvashnin told me in Grozny: ≥We will beat the Chechens to pulp, so that the present generation will be too terrified to fight Russia again. Let Western observers come to Grozny and see what we have done to our own city, so that they shall know what may happen to their towns if they get rough with Russia. But you know, Pavel, in 20-30 years a new generation of Chechens that did not see the Russian army in action will grow up and they will again rebel, so we&apos;ll have to smash them down all over again.≤&lt;/em&gt; (&lt;a href=&quot;http://www.bu.edu/iscip/vol15/Felgenhauer.html&quot;&gt;отсюда&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;What could possibly go wrong?&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://thenorthcaucasus.files.wordpress.com/2014/03/chechnya-russia-war-russian-soldiers-chechens-north-caucasus1.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;И в этом аду, в этом огне и крови заново рождается то, что на весь мир во все века гремело и в преисподней, и среди ангелов небесных. Сызнова рождается характер России и ее величие.&lt;/em&gt; &lt;a href=&quot;http://youtu.be/aCwiDB1WnPs?t=6m34s&quot;&gt;Отсюда&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;``Этот остров необитаем&apos;&apos;.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://oi61.tinypic.com/1zqts3o.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/2534.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/2534&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/2534.html</comments>
  <category>culture of terror</category>
  <category>дивизия зомби</category>
  <category>ужас и моральный террор</category>
  <lj:music>Joy Division -- Walked In Line</lj:music>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/2184.html</guid>
  <pubDate>Mon, 22 Dec 2014 19:26:49 GMT</pubDate>
  <title>Break up your fallow ground, and sow not among thorns.</title>
  <link>http://lj.rossia.org/users/zhd/2184.html</link>
  <description>В январе 2014 года чел из университета Токио разместил &lt;a href=&quot;http://arxiv.org/pdf/1401.7714v1.pdf&quot;&gt;работу&lt;/a&gt;, в которой улучшил показатель степени для сложности быстрого матричного умножения с 2.3729269 до 2.3728639. В 2014 г. Да еще и в ворде статью написал. Можно было бы отнести в разряд курьезов, но давайте посмотрим на список того, что считают &lt;a href=&quot;http://cstheory.stackexchange.com/questions/174/major-unsolved-problems-in-theoretical-computer-science&quot;&gt;главными нерешенными проблемами в computer science&lt;/a&gt;. Быстрое матричное умножение (с упоминанием этого чела) там сразу после P=?NP и односторонних функций. Если вам нужно было определение словосочетания ``&lt;em&gt;ссаный позор&lt;/em&gt;&apos;&apos;, то вот по-моему неплохой кандидат.  &lt;br /&gt;&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;&lt;br /&gt;IMO, цель computer science -- это более справедливое разделение труда между человеком и машиной. Не все средства хороши для ее достижения. Нужны концептуальные прорывы, а всякие трюки в жанре ``чертики из табакерки&apos;&apos; не нужны. Концептуальные прорывы -- это, например, когда люди думают над тем, что такое ``data&apos;&apos;, индукция, а потому расширяют механизм deriving в Haskell, для автоматического определения разных полезных функций. Очень удобно, меньше работы. Или вот все что связно с автоматическим построением парсеров по описанию грамматик определенных классов. Хорошая теория помогает получать полезные инструменты. Поэтому эпистемологические ценности должны превалировать. &lt;br /&gt;&lt;br /&gt;Чем, скажем, должна заниматься теория сложности? Ну вот есть теорема Поста &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_completeness&quot;&gt;о функциональной полноте&lt;/a&gt;. Простая, понятная, конструктивная и полезная. Есть язык спецификаций (таблицы булевых функций), язык [domain specific] программирования (заданная система функций с операцией композиции), есть отношение ``программа реализует спецификацию&apos;&apos;. Теорема в числе прочего позволяет построить хотя бы одну функцию, реализующую данную спецификацию, или доказать, что это невозможно. Поскольку, вообще говоря, имеется много способов реализовать заданную спецификацию, имеет смысл ввести меру сложности для программ и изучать всякие вопросы, которые естественно возникают. Теория сложности, как мне кажется, должна исследовать аналогичные вопросы для разных языков спецификаций, программирования (не обязательно &lt;del&gt;bullshit&lt;/del&gt;Turing-complete) и способов измерения сложности. Естественно, в общем случае такая задача неразрешима, но ничто не запрещает существование интересных случаев, в которых какое-то адекватное описание возможно. &lt;br /&gt;&lt;br /&gt;Вот скажем как устроено множество алгоритмов поиска подстроки в строке? Это очень зависит от базового языка, такой вопрос явно не под силу современной науке. Есть такой-то, с такой-то сложностью, есть такой-то... Как описать комбинаторику этого дела? С чего тут вообще начать? Есть интересный подход, позволяющий выводить программы из спецификаций, заданных отношениями, называется program transformation. Отлично изложен &lt;a href=&quot;http://www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X&quot;&gt;в этой книжке&lt;/a&gt; на примере задач так называемого динамического программирования. Он не отвечает на все вопросы, но хоть что-то. Как только сузили область, оказалось, что можно получать интересные результаты. &lt;br /&gt;&lt;br /&gt;Замечу еще, что видимо не случайно мастера древности типа Кнута или де Брейна были еще и хардкоровыми комбинаторщиками. Честный анализ сложности заключается в вычленении underlying комбинаторных структур, а не асимптотических оценок. &lt;br /&gt;&lt;br /&gt;Причем тут теории типов? Продвинутые интуиционистские теории типов, основанные на Мартин-Лефе, -- это хорошие языки для описания и рассуждения о вычислениях. Они могут передавать &lt;em&gt;тонкие смыслы&lt;/em&gt;. В них спецификации задаются на уровне типов, программы -- это типизированные выражения, а отношение ``программа реализует спецификацию&apos;&apos; -- это ``выражение t имеет тип T&apos;&apos;. Интересно, что Колмогоров еще в тридцать каком-то году написал, что интуиционистское исчисление высказываний (которое эквивалентно просто типизированному лямбда-исчислению) нужно интерпретировать как исчисление задач. Он там, конечно, точно не определял, что такое задача; приводил в пример геометрические задачи на построение. Теперь-то мы понимаем, что речь идет о программах. Великого ума, видать, был мужик.&lt;br /&gt;&lt;br /&gt;Теории типов отлично описывают логическую сторону вычислений, но как прикрутить к ним комбинаторику -- &lt;a href=&quot;https://existentialtype.wordpress.com/2014/09/28/structure-and-efficiency-of-computer-programs/&quot;&gt;большой вопрос&lt;/a&gt;. Это не единственная проблема. Во всех имеющихся реализация типа Agda, Epigram или Idris есть проблема с модульностью. Проблема заключается в том, что никто не знает что это. У МакБрайда есть разные интересные инструменты, связанные с этой проблемой. А кто изучал свойства теории типов вместе механизмом рефлексии? А вопросы, связанные с новыми техниками оптимизации, основанными, например, на &lt;a href=&quot;http://gallium.inria.fr/blog/bove-reloaded/&quot;&gt;вычислительно иррелевантых типах&lt;/a&gt;? Кто всем этим будет заниматься? Тютькин?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;На самом деле я настроен весьма оптимистично. В Haskell community полно полностью поехавших гиков, которые, вдоволь наигравшись с Хаскеллем, переходят на более тяжелые наркотики. А это означает, что more crazy shit coming soon along w/ some other cool stuff. &lt;br /&gt;    &lt;br /&gt;&lt;img src=&quot;https://acm.wustl.edu/functional/io-monad.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/2184.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/2184&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/2184.html</comments>
  <category>complexity theory</category>
  <category>type theory</category>
  <lj:music>Einstürzende Neubauten -- Negativ Nein (live)</lj:music>
  <lj:mood>optimistic</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/1814.html</guid>
  <pubDate>Tue, 09 Dec 2014 19:46:43 GMT</pubDate>
  <title>All Concepts are Kan Extensions, Part 0</title>
  <link>http://lj.rossia.org/users/zhd/1814.html</link>
  <description>Решил изучить continuation-passing style, call/cc, codensity monad, вот это все. Прочитал &lt;a href=&quot;http://www.cs.ox.ac.uk/ralf.hinze/Kan.pdf&quot;&gt;статью&lt;/a&gt;, в которой в числе прочего утверждается, что многие оптимизирующие преобразования программ суть реализации категорной конструкции под названием &lt;em&gt;правое расширение Кана&lt;/em&gt;. Типа вся сущность СиПиЭс была изложена в упражнениях к десятой главе известной книги ``&lt;em&gt;Categories for the working mathematician&lt;/em&gt;&apos;&apos;. Хорошо бы понять так ли это. &lt;br /&gt;&lt;br /&gt;Сегодня будет разогрев. &lt;br /&gt;&lt;br /&gt;&lt;lj-cut&gt;&lt;br /&gt;&lt;br /&gt;Одним из наиболее часто встречающихся примеров [ковариантных] функторов в computer science являются параметрические структуры данных. Если у вас есть контейнер F, в который вы можете засунуть выражения произвольного типа A, то это эндофунктор для [некоторой] категории множеств и функций. Точно описать эту категорию сложно, но вычислительный смысл очень простой: любую функцию из A в B можно поднять до функции из F A в F B, при этом будут выполнятся ожидаемые для функторов отношения. Вот, например, список в Haskell определяется так:&lt;br /&gt;&lt;br /&gt;data List a = Nil | Cons a (List a)&lt;br /&gt;&lt;br /&gt;List -- это функтор из Set в Set:&lt;br /&gt;map :: (A → B) → List A → List B&lt;br /&gt;map f Nil = Nil&lt;br /&gt;map f (Cons x xs) = Cons (f x) (map f xs)&lt;br /&gt;&lt;br /&gt;Ну и выполняются: map id xs = xs и map (f ∘ g) xs = map f (map g xs). Чем не функтор?&lt;br /&gt;&lt;br /&gt;Нужно отметить, что с пришествием зависимых типов, стало возможным определять функторы, отличные от эндофункторов на Set. Например, берете любой тип деревьев, цепляете к нему дополнительный конструктор для переменных (переменные типа конечных множеств), получаете семейство над натуральными числами. Это будет функтор из категории конечных множеств в категорию множеств. Произвольная функция из одного конечного множества в другое это ``переименование переменных&apos;&apos;, а соответствующий map переименовывает все переменные в вашей древовидной структуре. Если задать операцию подстановки, то это будет монада. Если хотите почитать про монады в computer science, то начните с этого &lt;a href=&quot;http://stackoverflow.com/questions/11234632/monads-with-join-instead-of-bind&quot;&gt;ответа&lt;/a&gt;. Pigworker -- это ник Конора МакБрайда. ``Он бог, от него сияние исходит&apos;&apos;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Так вот, оказывается, что категорно-ориентированые чувихи и чуваки смотрят на вещи по-другому и это даже некие вычислительные последствия имеет. Список -- это монада, но не просто монада, а монада, которая индуцируется двумя &lt;em&gt;сопряженными функторами&lt;/em&gt; -- забывающим функтором из категории моноидов в категорию множеств и соответствующим свободным. В Haskell соответствующее определение выглядит так:&lt;br /&gt;&lt;br /&gt;newtype List a = Abstr {apply :: forall z . (Monoid z) =&amp;gt; (a -&amp;gt; z) -&amp;gt; z} &lt;br /&gt;&lt;br /&gt;Утверждается, что это тоже самое, что и List, определенный выше. Чрезвычайно поучительно попытаться определить для этого типа обычные конструкторы Nil и Cons, а также функции голова/хвост (Ответ &lt;a href=&quot;https://gist.github.com/gallais/ef7330d74161c46a401b&quot;&gt;тут&lt;/a&gt;). Реклама говорит, что когда допилят вычислительную сторону унивалентности, то определения функций можно будет автоматически переносить между эквивалентными представлениями... удачи им с этим. &lt;br /&gt;&lt;br /&gt;Этот новый тип обладает O(1) сложностью для cons, snoc и append. Утверждается, что этот трюк с уменьшением сложности есть частный случай общей конструкции, связанной с ``&lt;em&gt;правыми расширениями Кана&lt;/em&gt;&apos;&apos;. Поговорим об этом в следующих выпусках.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В комментариях всем людям доброй воли предлагается рассказать свои истории про то, как им в жизни помогли сопряженные функторы. &lt;br /&gt;&lt;br /&gt;Картинка для привлечения внимания:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.quickmeme.com/img/c9/c94711e0f933eb488e0cb0baa9d3eff1888a27ead4fd6089fd37d8f7d8f45a97.jpg&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/1814.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/1814&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/1814.html</comments>
  <category>category theory</category>
  <category>cps</category>
  <category>haskell</category>
  <category>type theory</category>
  <lj:music>Sixth June -- Back for a Day</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/1761.html</guid>
  <pubDate>Thu, 04 Dec 2014 17:24:20 GMT</pubDate>
  <title>И ты, Брут, продался большевикам?</title>
  <link>http://lj.rossia.org/users/zhd/1761.html</link>
  <description>Новости из унивалентного мира:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Applications are invited for two postdocs and one PhD student to work on the recently funded EPSRC grant &quot;Homotopy Type Theory: Programming and Verification&quot; obtained by Professor Neil Ghani and Dr Conor McBride (University of Strathclyde), Dr Thorsten Altenkirch (University of Nottingham) and Dr Nicola Gambino (University of Leeds). One postdoc and will work on more theoretical aspects of the project in Nottingham, while the other postdoc will work on implementation issues in Strathclyde. Nevertheless, the reality is that we will be working as a team with frequent visits expected between ourselves and our collaborators.&lt;br /&gt;&lt;br /&gt;Homotopy Type Theory (HoTT) is a revolutionary new approach to type theory where types are interpreted as spaces, terms as points and equalities as paths&lt;/em&gt;... Ну и так далее.&lt;br /&gt;&lt;br /&gt;Короче говоря, МакБрайдушка теперь тоже &lt;em&gt;с ними&lt;/em&gt;. Шаг, конечно, понятный -- у ребят проблемы с совместимостью унивалнтности и dependent pattern matching, а МакБрайд в последнем большой специалист. Однако, видимо, никакой другой теории типов кроме гомотопической в ближайшее время не будет. Есть конечно Эдвин Бреди, есть Роберт Эткей, есть ученик МакБрайда Пьер ``МакДаг&apos;&apos; Даган, есть наконец зеленая поросль аспиров, ``поднявшихся на здоровой закваске&apos;&apos;, но думалось, что в бой против унивалентной чумы поведет их МакБрайд. Но нет, видимо вместо ожидавшегося второго Эпиграмма и прорывов в области refinement types нас ждут сотни страниц с диаграммами, симплициальными множествами и т.п. Ну может людям, который занимаются приложениями, вроде Ксавье Лероя надоест писать тактики в Ltac и они начнут заниматься, скажем, доказательством через рефлексию. Было бы здорово. &lt;br /&gt;&lt;br /&gt;Есть еще Абель, Нилс и Ульф, но они вроде рубятся за sized types, а православный путь -- это memo-структуры или Bove-Capretta method. &lt;br /&gt;&lt;br /&gt;Вот так, если у тебя есть премия Филдса, то ты можешь войти в любую область и наводить там свои порядки. Интересно посмотреть на становление гомотопической теории типов через призму &lt;a href=&quot;http://vteninn.livejournal.com/&quot;&gt;приматологии науки&lt;/a&gt;. Ткачев слегка поехавший, but he&apos;s got a point. Всем сила и власть, пацаны!&lt;br /&gt;&lt;br /&gt;Картинка для привлечения внимания:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://imgs.xkcd.com/comics/seven.png&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/1761.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/1761&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/1761.html</comments>
  <category>type theory</category>
  <category>univalence</category>
  <lj:music>Haus Arafna -- Rebels Have No King </lj:music>
  <lj:mood>pessimistic</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/1327.html</guid>
  <pubDate>Thu, 13 Nov 2014 20:55:15 GMT</pubDate>
  <link>http://lj.rossia.org/users/zhd/1327.html</link>
  <description>Воеводские выкормыши не успокаиваются: &lt;a href=&quot;http://dlicata.web.wesleyan.edu/pubs/lb14cubical/lb14cubes-oxford.pdf&quot;&gt;доклад про кубическую теорию типов&lt;/a&gt;. Оказывается, чтобы вычислять нужны кановские кубические множества (чтобы это не значило). Ужас и моральный террор. Ну ладно, на самом деле там чтобы вычислять &lt;em&gt;в присутствии аксиомы унивалентности&lt;/em&gt;. Не знаю, нужны или нет, но думаю, что сперва следует задать вопрос: а нужна ли аксиома унивалентности? Так говорил МакБрайд:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;It&apos;s clear that function extensionality, quotients, and working up to isomorphism (and other weak equivalences) are important things to have a handle on. However, univalence does not have a monopoly on approaches to those concepts. As an axiom with no computational behaviour, I find univalence deeply troubling. But I shall cheerfully applaud a computational theory with decidable equality and typechecking judgments which validates the axiom and computes canonical values.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Это называется &quot;ясный левацкий взгляд&quot;. Вычислительная интерпретация унивалентности сейчас построена с помощью этих самых кубических множеств (с каноничностью &lt;a href=&quot;https://groups.google.com/d/msg/homotopytypetheory/GmXKEArD3HY/jiw1PNONQp8J&quot;&gt;не все ясно&lt;/a&gt;). Но вопрос в том, мне лично трудно представить ситуацию, когда бы занадобилось переносить конструкции между, например, натуральными числами и бинарными деревьями. В то же время, было бы крайне удобно подменять различные способы описания, скажем, графов по ситуации. Унивалентность может тут помочь, но не является необходимой для этого. Мне МакБрайдовские подходы (views, ornaments) гораздо симпатичнее (они ведь из программирования растут). И еще цитата:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;But I&apos;m happy if there&apos;s some well managed way to talk about types at a finer level than isomorphism, e.g., by encoding types in a universe: equality of codes might well be finer than isomorphism of the types codes mean. I&apos;d be really pleased if the types we wrote down were automatically internal syntactic objects, so that we could choose to interpret them in a variety of interesting ways, each with its own notion of equality. It may well be that uniqueness of equality proofs for the syntactic objects is sustainable alongside a multiplicity of isomorphisms between the underlying sets, as long as we are clear which we mean.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Делать универсальный язык или систему доказательств -- это все таки дикость и двадцатый век. Нужно учиться строить интересные универсумы и продвигать политипическое программирование. Ради этого можно даже с настоящим параметрическим полиморфизмом попрощаться.&lt;br /&gt;&lt;br /&gt;А еще у них грант на семь с половиной лимонов &lt;a href=&quot;http://homotopytypetheory.org/2014/04/29/hott-awarded-a-muri/&quot;&gt;от ВВС США&lt;/a&gt;. What would Grothendieck do?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/1327.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/1327&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/1327.html</comments>
  <category>generic programming</category>
  <category>type theory</category>
  <category>univalence</category>
  <lj:music>She Past Away -- Kasvetli Kutlama</lj:music>
  <lj:mood>geeky</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/1060.html</guid>
  <pubDate>Thu, 30 Oct 2014 18:11:02 GMT</pubDate>
  <title>Что касается свирелей, струн и барабанов, на которых играют женоподобные мужчины...</title>
  <link>http://lj.rossia.org/users/zhd/1060.html</link>
  <description>Аллах запрещает VST-инструменты, но не VST-эффекты.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/1060.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/1060&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/1060.html</comments>
  <lj:music>Dawlat al islam qamat nasheed</lj:music>
  <lj:mood>curious</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/959.html</guid>
  <pubDate>Wed, 29 Oct 2014 18:08:17 GMT</pubDate>
  <title>Метатели стрелок в ковариантную сторону</title>
  <link>http://lj.rossia.org/users/zhd/959.html</link>
  <description>На реддите &lt;a href=&quot;http://www.reddit.com/r/haskell/comments/2kkrd3/category_theory_for_programmers_the_preface/&quot;&gt;очередной срач&lt;/a&gt; на тему ``нужна ли теория категорий программисту&apos;&apos;.&lt;br /&gt;&lt;br /&gt;Вот разные умные люди размышляли над концептом ``data&apos;&apos;. И пришли к интересным вещам типа индуктивных или индуктивно-рекурсивных семейств. Их можно рассматривать как начальные F-алгебры для функторов F в некоторых категориях, обладающими свойством ``строгой положительности&apos;&apos;. А можно этого не делать. Например, попытки явно описать, что же это за категории приводят к конструкциям громоздким и для многих совершенно непрозрачным. В оригинальных работах же все это строилось как расширение теории Мартин-Лефа с помощью правил введения/исключения. Просто, конструктивно и понятно. &lt;br /&gt;&lt;br /&gt;Всякие интересные инструменты (аппликативные функторы, орнаменты) сначала придумали программисты, а потому уже, следуя моде, начали искать категорные конструкции, которым они соответствуют. В некоторых случаях такие конструкции нашлись, но легче никому не стало. Было бы интересно, конечно, если бы кто-нибудь использовал категории как базу для создания языка программирования (а лучше целой кучи языков, между которыми можно было бы переносить структуры автоматически), но что-то не видать таких героев. &lt;br /&gt;&lt;br /&gt;Ну и чтобы не забыть: &lt;a href=&quot;http://mazzo.li/epilogue/index.html%3Fp=504.html&quot;&gt;у МакБрайда в Эпиграмме&lt;/a&gt; законы для функторов, связанных с индуктивными типами, встроены в механизм вычисления нормальных форм и их доказывать не надо. Это удобно, конечно, но к теории категорий отношения не имеет.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/959.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/959&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/959.html</comments>
  <category>category theory</category>
  <category>epigram</category>
  <category>type theory</category>
  <lj:mood>blah</lj:mood>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/users/zhd/534.html</guid>
  <pubDate>Sun, 26 Oct 2014 13:25:23 GMT</pubDate>
  <title>Кавер на CC</title>
  <link>http://lj.rossia.org/users/zhd/534.html</link>
  <description>&lt;object width=&quot;560&quot; height=&quot;315&quot; data=&quot;//www.youtube.com/embed/twibTenzzSM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/users/zhd/534.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/zhd/534&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/users/zhd/534.html</comments>
  <lj:mood>calm</lj:mood>
</item>
</channel>
</rss>
