{"id":286672,"date":"2017-05-22T13:15:02","date_gmt":"2017-05-22T09:15:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286672"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2017-05-22T09:15:02","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286672","title":{"rendered":"\u041e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a \u0433\u043e\u043c\u043e\u0442\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430 Scala + Shapeless + ProvingGround"},"content":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/siddhartha-gadgil\/ProvingGround\">ProvingGround<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0421\u043a\u0430\u043b\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/milessabin\/shapeless\">Shapeless<\/a>. \u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f <a href=\"http:\/\/siddhartha-gadgil.github.io\/ProvingGround\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>, \u043f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u0430\u044f. \u0410\u0432\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 <a href=\"http:\/\/math.iisc.ernet.in\/~gadgil\/\">\u0421\u0438\u0434\u0434\u0445\u0430\u0440\u0442\u0445\u0430 \u0413\u0430\u0434\u0436\u0438\u043b<\/a> \u0438\u0437 Indian Institute of Science. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f. \u0421\u0430\u043c \u0421\u0438\u0434\u0434\u0445\u0430\u0440\u0442\u0445\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0430 \u00abwork in progress\u00bb. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0436\u0438\u0432\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0441 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433 \u0431\u044b \u0447\u0435\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u043b\u0435\u043a\u043e. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 \u0433\u043e\u043c\u043e\u0442\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (<a href=\"https:\/\/homotopytypetheory.org\/book\/\">HoTT<\/a>), (\u043f\u043e\u043b\u0443-) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u043e\u0440\u0435\u043c\u044b.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u043d\u0430 \u0421\u043a\u0430\u043b\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430 \u0421\u0442\u0435\u043f\u0438\u043a\u0430. \u041d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u043d\u0430 \u0418\u0434\u0440\u0438\u0441\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0439 <a href=\"http:\/\/compsciclub.ru\/courses\/idrisprogramming\/2017-spring\/\">\u043a\u0443\u0440\u0441<\/a>. \u0421\u043a\u0430\u043b\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041f\u043e\u0433\u0443\u0433\u043b\u0438\u043b \u043f\u043e \u0433\u0438\u0442\u0445\u0430\u0431\u0443 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c \u00ab\u0421\u043a\u0430\u043b\u0430\u00bb, \u00ab\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b\u00bb, \u00abHoTT\u00bb \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 ProvingGround. \u0421\u0440\u0430\u0437\u0443 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u2014 \u044f \u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e, \u0447\u0442\u043e \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0442\u0435\u043e\u0440\u0435\u043c, \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HoTT. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0437\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u0431\u044b\u043b \u0431\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u0443\u0440\u0441. <\/p>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0421\u043a\u0430\u043b\u0430 \u2014 \u044f\u0437\u044b\u043a \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0435\u0439 (<a href=\"http:\/\/stackoverflow.com\/questions\/12935731\/any-reason-why-scala-does-not-explicitly-support-dependent-types\">\u0434\u0440\u0443\u0433\u0430\u044f<\/a> \u0442\u043e\u0447\u043a\u0430 \u0437\u0440\u0435\u043d\u0438\u044f \u2014 \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/danielwestheide.com\/blog\/2013\/02\/13\/the-neophytes-guide-to-scala-part-13-path-dependent-types.html\">path-dependent \u0442\u0438\u043f\u043e\u0432<\/a>, <a href=\"http:\/\/slick.lightbend.com\/talks\/scalaio2014\/Type-Level_Computations.pdf\">type-level<\/a> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 <a href=\"http:\/\/docs.scala-lang.org\/tutorials\/tour\/implicit-parameters.html\">\u0438\u043c\u043f\u043b\u0438\u0446\u0438\u0442\u043e\u0432<\/a>. \u041e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u043d\u0430 \u0433\u043e\u043b\u043e\u0439 \u0421\u043a\u0430\u043b\u0435 \u0438\u043b\u0438 \u0421\u043a\u0430\u043b\u0435 \u043f\u043b\u044e\u0441 Shapeless \u0438 \u043f\u043e\u0433\u0440\u044f\u0437\u043d\u0443\u0442\u044c \u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/www.youtube.com\/watch?v=R8GksuRw3VI\">\u043e\u0442\u043b\u0438\u0447\u0438\u044f<\/a> type members \u043e\u0442 type parameters (\u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432), \u0438\u043c\u043f\u043b\u0438\u0446\u0438\u0442\u043e\u0432, path-dependent \u0442\u0438\u043f\u043e\u0432, <a href=\"http:\/\/gigiigig.github.io\/posts\/2015\/09\/13\/aux-pattern.html\">\u00abAux\u00bb \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/a>, type-level \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u0442.\u0434. \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u044c \u043a\u0443\u0440\u0441\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0433\u043e\u043b\u043e\u0439 \u0421\u043a\u0430\u043b\u0435, \u043d\u043e \u0431\u041e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u2014 \u043d\u0430 ProvingGround.<\/p>\n<h4>\u0422\u0435\u0440\u043c\u044b \u0438 \u0442\u0438\u043f\u044b<\/h4>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0442\u0435\u0440\u043c\u043e\u0432, \u0442\u0438\u043f\u043e\u0432, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442.\u0434. ProvingGround \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 <acronym>DSL<\/acronym>.<br \/>  \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0442\u0438\u043f <code>A<\/code> \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>a<\/code> \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">val A = &quot;A&quot; :: Type val a = &quot;a&quot; :: A<\/code><\/pre>\n<p>  \u0442.\u0435. \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a<\/p>\n<pre><code class=\"scala\">val \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440_\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 = &quot;\u043a\u0430\u043a \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e&quot; :: \u0422\u0438\u043f_\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0442\u0435\u0440\u043c \u00ab\u043a\u0440\u0430\u0441\u0438\u0432\u043e\u00bb \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>.fansi<\/code>, \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0442\u0438\u043f \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>.typ<\/code>:<\/p>\n<pre><code class=\"scala\">println(a) &gt; a : (A : U_0) println(a.fansi) &gt; a println(a.typ) &gt; A : U_0 println(a.typ.fansi) &gt; A<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435:<\/p>\n<pre><code class=\"scala\">val a : Term = &quot;a&quot; :: A<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c <code>A<\/code> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 ProvingGround, \u0442.\u0435. <acronym>HoTT<\/acronym>-\u0442\u0438\u043f, \u0430 <code>Term<\/code> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0432 \u0421\u043a\u0430\u043b\u0435.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u0442\u0438\u043f \u043f\u043e\u0441\u043b\u0435 <code>::<\/code>, \u0430 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0435\u0440\u043c, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>!:<\/code><\/p>\n<pre><code class=\"scala\">a !: A<\/code><\/pre>\n<p>  \u0422\u043e, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0438\u043f \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<h4>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043e \u0442\u0438\u043f\u0430\u0445. \u0415\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u044b. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0435\u0433\u043e \u0442\u0438\u043f. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependent_type\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f<\/a> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0440\u0435\u0445 \u0441\u0442\u0440\u043e\u043a \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0438\u043f\u0430 \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0447\u0438\u0441\u043b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0442\u0438\u043f\u0430, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 (\u043e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430). \u0418 \u0432\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u0442\u0440\u0435\u0445 \u0441\u0442\u0440\u043e\u043a \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0415\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043f\u0430\u0440\u0430 \u0447\u0438\u0441\u0435\u043b, \u0433\u0434\u0435 \u0432\u0442\u043e\u0440\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u0442\u0438\u043f-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e <code>1 =:= 2<\/code> (\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439), \u0442\u0438\u043f\u044b <code>1 =:= 1<\/code>, <code>2 =:= 2<\/code> (\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e) \u0438 \u0442.\u0434.<\/p>\n<p>  \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f <code>Ba<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 <code>A<\/code>, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"scala\">val Ba = &quot;B(_ : A)&quot; :: A -&gt;: Type val b = &quot;b&quot; :: Ba(a)<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0424\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438. \u0415\u0441\u0442\u044c 4 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u0441\u0442\u0440\u0435\u043b\u043e\u043a \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439: <code>:-&gt;<\/code>, <code>:~&gt;<\/code>, <code>-&gt;:<\/code>, <code>~&gt;:<\/code>&nbsp;. \u0421 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f\u043c\u0438 \u0441\u043b\u0435\u0432\u0430 \u2014 \u0434\u043b\u044f \u043b\u044f\u043c\u0431\u0434 (\u0442.\u0435. \u0441\u0430\u043c\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439), \u0441 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f\u043c\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0421 \u0434\u0435\u0444\u0438\u0441\u0430\u043c\u0438 \u2014 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0441 \u0442\u0438\u043b\u044c\u0434\u0430\u043c\u0438 \u2014 \u0434\u043b\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0442.\u0435. \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u2014 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/p>\n<pre><code class=\"scala\">val id = A :~&gt; (a :-&gt; a) !: A ~&gt;: (A -&gt;: A)<\/code><\/pre>\n<p>  \u0427\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u043d\u043e \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0438\u043f\u0430\u0445 \u0432\u0438\u0434\u0438\u0442 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0421\u043a\u0430\u043b\u044b:<\/p>\n<pre><code class=\"scala\">val f : FuncLike[Term, Term] = a :~&gt; b !: a ~&gt;: Ba(a) val f : Term =&gt; Term = a :~&gt; b !: a ~&gt;: Ba(a)<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0438\u0437 ProvingGround\/HoTT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0421\u043a\u0430\u043b\u044b \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0421\u043a\u0430\u043b\u0435.<\/p>\n<h4>\u0418\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inductive_type\">\u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0443\u043b\u0435\u0432 \u0442\u0438\u043f \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u00ab\u0438\u0441\u0442\u0438\u043d\u0430\u00bb \u0438 \u00ab\u043b\u043e\u0436\u044c\u00bb:<\/p>\n<pre><code class=\"scala\">val Bool = &quot;Boolean&quot; :: Type val BoolInd = (&quot;true&quot; ::: Bool) |: (&quot;false&quot; ::: Bool) =: Bool val tru :: fls :: HNil = BoolInd.intros<\/code><\/pre>\n<p>  \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a<\/p>\n<pre><code class=\"scala\">val \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440_\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f = (...) |: (...) |: (...) =: \u0418\u043c\u044f_\u0442\u0438\u043f\u0430<\/code><\/pre>\n<p>  \u0433\u0434\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u044b <code>|:<\/code>&nbsp;.<\/p>\n<p>  \u0415\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0442\u0438\u043f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u00ab\u043d\u043e\u043b\u044c\u00bb \u0438 \u00ab\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0437\u0430 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u043c <code>n<\/code>\u00bb:<\/p>\n<pre><code class=\"scala\">val Nat = &quot;Nat&quot; :: Type val NatInd = (&quot;0&quot; ::: Nat) |: (&quot;succ&quot; ::: Nat --&gt;&gt;: Nat) =: Nat val zero :: succ :: HNil = NatInd.intros val one = succ(zero) !: Nat val two = succ(one) !: Nat \/\/ ...<\/code><\/pre>\n<p>  \u0422\u0438\u043f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u00ab\u043f\u043b\u044e\u0441 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 <code>n<\/code>\u00bb \u0438 \u00ab\u043c\u0438\u043d\u0443\u0441 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 <code>n<\/code> \u043c\u0438\u043d\u0443\u0441 1\u00bb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<pre><code class=\"scala\">val Int = &quot;Integer&quot; :: Type val IntInd = (&quot;pos&quot; ::: Nat -&gt;&gt;: Int) |: (&quot;neg&quot; ::: Nat -&gt;&gt;: Int) =: Int val pos :: neg :: HNil = IntInd.intros<\/code><\/pre>\n<p>  \u0422\u0438\u043f \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 <code>A<\/code> \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u00ab\u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\u00bb \u0438 \u00ab\u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u0442\u0438\u043f\u0430 <code>A<\/code> \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u043c \u0442\u0438\u043f\u0430 <code>ListA<\/code>\u00bb:<\/p>\n<pre><code class=\"scala\">val ListA = &quot;List(A)&quot; :: Type val ListAInd = (&quot;nil&quot; ::: ListA) |: (&quot;cons&quot; ::: A -&gt;&gt;: ListA --&gt;&gt;: ListA) =: ListA val nil :: cons :: HNil = ListAInd.intros<\/code><\/pre>\n<p>  \u0423 \u0442\u0438\u043f\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (\u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0443\u0437\u043b\u0430\u0445) \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u00ab\u043b\u0438\u0441\u0442\u00bb \u0438 \u00ab\u0432\u0438\u043b\u043a\u0430\u00bb (\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432):<\/p>\n<pre><code class=\"scala\">val BTree = &quot;BTree&quot; :: Type val BTreeInd = (&quot;leaf&quot; ::: BTree) |: (&quot;fork&quot; ::: BTree --&gt;&gt;: BTree --&gt;&gt;: BTree) =: BTree val leaf :: fork :: HNil = BTreeInd.intros<\/code><\/pre>\n<p>  \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u00ab\u0432\u0438\u043b\u043a\u0430\u00bb \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043b\u043e\u0436\u044c \u0432 \u043e\u0434\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e, \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435:<\/p>\n<pre><code class=\"scala\">val BTree = &quot;BTree&quot; :: Type val BTreeInd = (&quot;leaf&quot; ::: BTree) |: (&quot;fork&quot; ::: (Bool -|&gt;: BTree) --&gt;&gt;: BTree) =: BTree val leaf :: fork :: HNil = BTreeInd.intros<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>  \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 (<a href=\"https:\/\/ncatlab.org\/nlab\/show\/inductive+family\">indexed inductive type<\/a>), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0435\u043a\u0442\u043e\u0440 <code>Vec<\/code> \u0438\u043b\u0438 \u0442\u0438\u043f-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e <code>Id<\/code>, \u0442\u043e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>=::<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>=:<\/code>, \u0441\u0442\u0440\u0435\u043b\u043a\u0443 \u0441 \u0442\u0438\u043b\u044c\u0434\u043e\u0439 \u0438 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0438\u043f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 <code>(\u0418\u043c\u044f_\u0442\u0438\u043f\u0430 -&gt; \u0418\u043c\u044f_\u0442\u0438\u043f\u0430(n))<\/code> \u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c \u0442\u0438\u043f\u0435, <code>(\u0418\u043c\u044f_\u0442\u0438\u043f\u0430 :&gt; \u0418\u043c\u044f_\u0442\u0438\u043f\u0430(n))<\/code> \u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u043c \u0442\u0438\u043f\u0435, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e <code>\u0418\u043c\u044f_\u0442\u0438\u043f\u0430(n)<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u0438\u043d\u044b <code>n<\/code>:<\/p>\n<pre><code class=\"scala\">val VecA = &quot;Vec(A)&quot; :: Nat -&gt;: Type val n = &quot;n&quot; :: Nat val VecAInd = (&quot;nil&quot; ::: (VecA -&gt; VecA(zero) )) |:      {&quot;cons&quot; ::: n ~&gt;&gt;: (A -&gt;&gt;: (VecA :&gt; VecA(n) ) --&gt;&gt;: (VecA -&gt; VecA(succ(n)) ))} =:: VecA val vnil :: vcons :: HNil = VecAInd.intros<\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e:<\/p>\n<pre><code class=\"scala\">val Fin = &quot;Fin&quot; :: Nat -&gt;: Type val FinInd = {&quot;FZ&quot; ::: n ~&gt;&gt;: (Fin -&gt; Fin(succ(n)) )} |:      {&quot;FS&quot; ::: n ~&gt;&gt;: ((Fin :&gt; Fin(n) ) --&gt;&gt;: (Fin -&gt; Fin(succ(n)) ))} =:: Fin val fz :: fs :: HNil = FinInd.intros<\/code><\/pre>\n<p>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Fin(zero)<\/code>. \u0415\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Fin(one)<\/code>:<\/p>\n<pre><code class=\"scala\">val fz0 = fz(zero) !: Fin(one)<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 <code>Fin(two)<\/code>:<\/p>\n<pre><code class=\"scala\">val fz1 = fz(one) !: Fin(two) val fs1 = fs(one)(fz0) !: Fin(two)<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 <code>Fin(three)<\/code>:<\/p>\n<pre><code class=\"scala\">fz(two) !: Fin(three) fs(two)(fz1) !: Fin(three) fs(two)(fs1) !: Fin(three)<\/code><\/pre>\n<p>  \u0438 \u0442.\u0434.<\/p>\n<h4>\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e\u0431 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (family of inductive types) \u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 (indexed inductive type). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>List(A)<\/code> \u2014 \u044d\u0442\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e, \u0430 <code>Vec(A)(n)<\/code> \u2014 \u044d\u0442\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0438\u043f\u0430 <code>A<\/code>, \u043d\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 <code>n<\/code>. \u0418\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u2014 \u044d\u0442\u043e \u0442\u0438\u043f, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u00ab\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u043a\u0430\u043a \u0443 \u0442\u0438\u043f\u043e\u0432 <code>Nat<\/code>, <code>List<\/code> \u0438 \u0442.\u0434.). <code>Vec(A)(n)<\/code> \u043f\u0440\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c <code>A<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c, \u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c <code>n<\/code>. \u0412 ProvingGround \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0442.\u0435. \u043d\u0435\u043b\u044c\u0437\u044f, \u0438\u043c\u0435\u044f \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f\u0430 <code>List(A)<\/code>, \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>List(B)<\/code>, <code>List(Nat)<\/code>, <code>List(Bool)<\/code>, <code>List(List(A))<\/code> \u0438 \u0442.\u0434. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"scala\">val List = &quot;List&quot; :: Type -&gt;: Type val ListInd = {&quot;nil&quot; ::: A ~&gt;&gt;: (List -&gt; List(A) )} |:      {&quot;cons&quot; ::: A ~&gt;&gt;: (A -&gt;&gt;: (List :&gt; List(A) ) --&gt;&gt;: (List -&gt; List(A) ))} =:: List val nil :: cons :: HNil = ListInd.intros cons(Nat)(zero)(cons(Nat)(one)(cons(Nat)(two)(nil(Nat)))) !: List(Nat)  \/\/ \u0441\u043f\u0438\u0441\u043e\u043a 0, 1, 2<\/code><\/pre>\n<p>  \u0438<\/p>\n<pre><code class=\"scala\">val Vec = &quot;Vec&quot; :: Type -&gt;: Nat -&gt;: Type val VecInd = {&quot;nil&quot; ::: A ~&gt;&gt;: (Vec -&gt; Vec(A)(zero) )} |:      {&quot;cons&quot; ::: A ~&gt;&gt;: n ~&gt;&gt;: (A -&gt;&gt;: (Vec :&gt; Vec(A)(n) ) --&gt;&gt;: (Vec -&gt; Vec(A)(succ(n)) ))} =:: Vec val vnil :: vcons :: HNil = VecInd.intros vcons(Bool)(two)(tru)(vcons(Bool)(one)(fls)(vcons(Bool)(zero)(tru)(vnil(Bool)))) !: Vec(Bool)(succ(two))   \/\/ 3-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 tru, fls, tru<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (<code>HList<\/code>):<\/p>\n<pre><code class=\"scala\">val HLst = &quot;HList&quot; :: Type -&gt;: Type val HLstInd = {&quot;nil&quot; ::: A ~&gt;&gt;: (HLst -&gt; HLst(A) )} |:      {&quot;cons&quot; ::: A ~&gt;&gt;: (A -&gt;&gt;: (B ~&gt;&gt;: ((HLst :&gt; HLst(B) ) --&gt;&gt;: (HLst -&gt; HLst(A) ))))} =:: HLst val hnil :: hcons :: HNil = HLstInd.intros<\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>HList<\/code> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 ProvingGround, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445 Shapeless, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>HList<\/code>.<\/p>\n<h4>\u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>  \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (<a href=\"https:\/\/en.wikibooks.org\/wiki\/Haskell\/GADT\">GADT<\/a>). \u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u0425\u0430\u0441\u043a\u0435\u043b\u0435<\/p>\n<pre><code class=\"haskell\">{-# Language GADTs #-} data Expr a where     ELit     :: a         -&gt; Expr a     ESucc    :: Expr Int  -&gt; Expr Int     EIsZero  :: Expr Int  -&gt; Expr Bool     EIf      :: Expr Bool -&gt; Expr a    -&gt; Expr a    -&gt; Expr a<\/code><\/pre>\n<p>  \u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 \u0421\u043a\u0430\u043b\u0435<\/p>\n<pre><code class=\"scala\">sealed trait Expr[A] case class ELit[A](lit: A) extends Expr[A] case class ESucc(num: Expr[Int]) extends Expr[Int] case class EIsZero(num: Expr[Int]) extends Expr[Boolean] case class EIf[A](cond: Expr[Boolean], thenExpr: Expr[A], elseExpr: Expr[A]) extends Expr[A]<\/code><\/pre>\n<p>  \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 ProvingGround \u043a\u0430\u043a<\/p>\n<pre><code class=\"scala\">val Expr = &quot;Expr&quot; :: Type -&gt;: Type val ExprInd = {&quot;ELit&quot; ::: A ~&gt;&gt;: (A -&gt;&gt;: (Expr -&gt; Expr(A) ))} |:   {&quot;ESucc&quot; ::: Expr(Nat) -&gt;&gt;: (Expr -&gt; Expr(Nat) )} |:   {&quot;EIsZero&quot; ::: Expr(Nat) -&gt;&gt;: (Expr -&gt; Expr(Bool) )} |:   {&quot;EIf&quot; ::: A ~&gt;&gt;: (Expr(Bool) -&gt;&gt;: Expr(A) -&gt;&gt;: Expr(A) -&gt;&gt;: (Expr -&gt; Expr(A) ))} =:: Expr val eLit :: eSucc :: eIsZero :: eIf :: HNil = ExprInd.intros<\/code><\/pre>\n<p>  <\/p>\n<h4>\u041a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432<\/h4>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Type_class\">\u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0438\u043f\u043e\u0432<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/wiki.haskell.org\/Functor\">\u0444\u0443\u043d\u043a\u0442\u043e\u0440<\/a>:<\/p>\n<pre><code class=\"scala\">val A = &quot;A&quot; :: Type val B = &quot;B&quot; :: Type val C = &quot;C&quot; :: Type val Functor = &quot;Functor&quot; :: (Type -&gt;: Type) -&gt;: Type val F = &quot;F(_ : U_0)&quot; :: Type -&gt;: Type val Fmap = A ~&gt;: (B ~&gt;: ((A -&gt;: B) -&gt;: (F(A) -&gt;: F(B) ))) val FunctorInd = {&quot;functor&quot; ::: F ~&gt;&gt;: (Fmap -&gt;&gt;: (Functor -&gt; Functor(F) ))} =:: Functor val functor :: HNil = FunctorInd.intros<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c (instance) \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"scala\">val as = &quot;as&quot; :: List(A) val indList_map = ListInd.induc(A :~&gt; (as :-&gt; (B ~&gt;: ((A -&gt;: B) -&gt;: List(B) )))) \/\/ \u044d\u0442\u043e \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044f, \u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438 \u0438\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u043d\u0438\u0436\u0435 val mapas = &quot;map(as)&quot; :: B ~&gt;: ((A -&gt;: B) -&gt;: List(B)) val f = &quot;f&quot; :: A -&gt;: B val map = indList_map(A :~&gt; (B :~&gt; (f :-&gt;        nil(B)    )))(A :~&gt; (a :-&gt; (as :-&gt; (mapas :-&gt; (B :~&gt; (f :-&gt;        cons(B)(f(a))(mapas(B)(f))    ))))))  !: A ~&gt;: (List(A) -&gt;: (B ~&gt;: ((A -&gt;: B) -&gt;: List(B) ))) val listFunctor = functor(List)(A :~&gt; (B :~&gt; (f :-&gt; (as :-&gt; map(A)(as)(B)(f) )))) !: Functor(List)<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043a\u043e\u043d\u044b:<\/p>\n<pre><code class=\"scala\">val fmap = &quot;fmap&quot; :: A ~&gt;: (B ~&gt;: ((A -&gt;: B) -&gt;: (F(A) -&gt;: F(B) ))) val Fmap_id = A ~&gt;: ( fmap(A)(A)(id(A)) =:= id(F(A)) ) val f = &quot;f&quot; :: A -&gt;: B val g = &quot;g&quot; :: B -&gt;: C val compose = A :~&gt; (B :~&gt; (C :~&gt; (f :-&gt; (g :-&gt; (a :-&gt; g(f(a))      ))))) !: A ~&gt;: (B ~&gt;: (C ~&gt;: ((A -&gt;: B) -&gt;: ((B -&gt;: C) -&gt;: (A -&gt;: C))))) val Fmap_compose = A ~&gt;: (B ~&gt;: (C ~&gt;: (f ~&gt;: (g ~&gt;: (      fmap(A)(C)(compose(A)(B)(C)(f)(g)) =:= compose(F(A))(F(B))(F(C))(fmap(A)(B)(f))(fmap(B)(C)(g)) ))))) val FunctorInd = {&quot;functor&quot; ::: F ~&gt;&gt;: (fmap ~&gt;&gt;: (Fmap_id -&gt;&gt;: (Fmap_compose -&gt;&gt;: (Functor -&gt; Functor(F) ))))} =:: Functor val functor :: HNil = FunctorInd.intros<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0422\u0438\u043f\u044b-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430<\/h4>\n<p>  \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u0433\u043c\u0430-\u0442\u0438\u043f (\u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043f\u0430\u0440\u044b), \u043f\u0438-\u0442\u0438\u043f (\u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043c\u044b \u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u044b\u0448\u0435), \u0442\u0438\u043f-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e (identity type):<\/p>\n<pre><code class=\"scala\">mkPair(a, b) !: Sgma(a !: A, Ba(a)) one.refl !: (one =:= one) one.refl !: IdentityTyp(Nat, one, one) two.refl !: (two =:= two) (one =:= two) !: Type<\/code><\/pre>\n<p>  \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438 \u0441\u0432\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"scala\">val Id = &quot;Id&quot; :: A ~&gt;: (A -&gt;: A -&gt;: Type) val IdInd = (&quot;refl&quot; ::: A ~&gt;&gt;: a ~&gt;&gt;: (Id -&gt; Id(A)(a)(a) )) =:: Id val refl :: HNil = IdInd.intros refl(Nat)(two) !: Id(Nat)(two)(two)<\/code><\/pre>\n<p>  \u0422\u0438\u043f\u044b-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Curry%E2%80%93Howard_correspondence\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u041a\u0430\u0440\u0440\u0438-\u0425\u043e\u0432\u0430\u0440\u0434\u0430<\/a>. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b <code>A -&gt;: B<\/code> \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 <code>A<\/code> \u0432 <code>B<\/code>, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u00ab\u0438\u0437 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f <code>A<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <code>B<\/code>\u00bb. \u0418, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <code>(A -&gt;: B) -&gt;: A -&gt;: B<\/code> \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>A -&gt;: B<\/code> \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>A<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e \u043a \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u0442.\u0435. \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>B<\/code>. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 modus ponens \u2014 \u00ab\u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u043e, \u0447\u0442\u043e \u0438\u0437 <code>A<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <code>B<\/code>, \u0438 \u0432\u0435\u0440\u043d\u043e <code>A<\/code>, \u0442\u043e \u0432\u0435\u0440\u043d\u043e <code>B<\/code>\u00bb. \u0421 \u0442\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u044b \u2014 \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u2014 \u044d\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u044d\u0442\u0438\u0445 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439. \u0418 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u043e, \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f \u043d\u0430\u0441\u0435\u043b\u0435\u043d, \u0442.\u0435. \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u0438\u00bb \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0442\u0438\u043f\u043e\u0432, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u0438\u043b\u0438\u00bb \u2014 \u0441\u0443\u043c\u043c\u0435 \u0442\u0438\u043f\u043e\u0432, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u043d\u0435\u00bb \u2014 \u0442\u0438\u043f\u0443 <code>A -&gt;: Zero<\/code>, \u0442.\u0435. \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0432 \u043f\u0443\u0441\u0442\u043e\u0439 \u0442\u0438\u043f. \u0422\u0430\u043a \u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0430. \u041f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435 \u043b\u044e\u0431\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u0430 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%82%D1%83%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D0%B7%D0%BC\">\u0438\u043d\u0442\u0443\u0438\u0446\u0438\u043e\u043d\u0438\u0441\u0442\u0441\u043a\u0430\u044f<\/a> \u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430\u044f, \u0442.\u0435. \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u0435\u0437 \u0437\u0430\u043a\u043e\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>PlusTyp(A, A -&gt;: Zero)<\/code> (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c <code>A<\/code>, \u0442\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435-<code>A<\/code>). \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u0435 \u043a \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u044e \u0437\u0430\u043a\u043e\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e:<\/p>\n<pre><code class=\"scala\">val g = &quot;g&quot; :: PlusTyp(A, A -&gt;: Zero) -&gt;: Zero val g1 = a :-&gt; g(PlusTyp(A, A -&gt;: Zero).incl1(a)) !: A -&gt;: Zero g :-&gt; g(PlusTyp(A, A -&gt;: Zero).incl2(g1)) !: (PlusTyp(A, A -&gt;: Zero) -&gt;: Zero) -&gt;: Zero<\/code><\/pre>\n<p>  \u041d\u0443 \u0442\u0430\u043a \u0432\u043e\u0442, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f\u044b \u2014 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u2014 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u0442\u043e \u0440\u0430\u0437 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0442\u0435\u0440\u043c\u043e\u0432 <code>a1 =:= a2<\/code> \u2014 \u044d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0442\u0438\u043f. \u0422\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439, \u0442.\u043a. \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>a1, a2<\/code> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>A<\/code>. \u0415\u0441\u043b\u0438 <code>a1, a2<\/code> \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0442.\u043a. \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043b\u043e\u0436\u043d\u043e. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u0442\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0437 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>refl(A)(a) !: Id(A)(a)(a)<\/code> (\u0438\u043b\u0438 <code>a.refl !: (a =:= a)<\/code> \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430-\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430).<\/p>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u0442\u0435\u043e\u0440\u0435\u043c \u0441 \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<pre><code class=\"scala\">val LTE = &quot;\u2264&quot; :: Nat -&gt;: Nat -&gt;: Type val LTEInd = {&quot;0 \u2264 _&quot; ::: m ~&gt;&gt;: (LTE -&gt; LTE(zero)(m) )} |:      {&quot;S _ \u2264 S _&quot; ::: n ~&gt;&gt;: m ~&gt;&gt;: ((LTE :&gt; LTE(n)(m) ) --&gt;&gt;: (LTE -&gt; LTE(succ(n))(succ(m)) ))} =:: LTE val lteZero :: lteSucc :: HNil = LTEInd.intros<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0412\u044b\u0441\u0448\u0438\u0435 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/h4>\n<p>  \u0415\u0449\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 <a href=\"https:\/\/homotopytypetheory.org\/2011\/04\/24\/higher-inductive-types-a-tour-of-the-menagerie\/\">\u0432\u044b\u0441\u0448\u0438\u043c\u0438 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c\u044e<\/p>\n<pre><code class=\"scala\">val Circle = &quot;S^1&quot; :: Type val base = &quot;base&quot; :: Circle \/\/ \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 val loop = &quot;loop&quot; :: (base =:= base) \/\/ \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/code><\/pre>\n<p>  \u0438 \u0441\u0444\u0435\u0440\u043e\u0439<\/p>\n<pre><code class=\"scala\">val Sphere = &quot;S^2&quot; :: Type val base = &quot;base&quot; :: Sphere \/\/ \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 val surf = &quot;surf&quot; :: (base.refl =:= base.refl) \/\/ \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \/\/  val surf = &quot;surf&quot; :: IdentityTyp(base =:= base, base.refl, base.refl) \/\/  val surf = &quot;surf&quot; :: IdentityTyp(IdentityTyp(Sphere, base, base), base.refl, base.refl)<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0438 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044f<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435) \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>.rec<\/code>, <code>.induc<\/code>, \u0442.\u0435. \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e (aka \u0440\u0435\u043a\u0443\u0440\u0441\u043e\u0440) \u0438 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044e \u2014 \u044d\u043b\u0438\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c (pattern matching), \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u043d\u0435\u00bb:<\/p>\n<pre><code class=\"scala\">val b = &quot;b&quot; :: Bool val recBB = BoolInd.rec(Bool) val not = recBB(fls)(tru)<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c:<\/p>\n<pre><code class=\"scala\">match {   case true =&gt; false   case false =&gt; true }<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"scala\">not(tru) == fls not(fls) == tru<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u00ab\u0438\u00bb:<\/p>\n<pre><code class=\"scala\">val recBBB = BoolInd.rec(Bool -&gt;: Bool) val and = recBBB(b :-&gt; b)(b :-&gt; fls)<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443:<\/p>\n<pre><code class=\"scala\">\/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 match {   case true =&gt; (b =&gt; b)   case false =&gt; (b =&gt; false) }<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"scala\">and(fls)(tru) == fls and(tru)(tru) == tru<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430:<\/p>\n<pre><code class=\"scala\">val n = &quot;n&quot; :: Nat val m = &quot;m&quot; :: Nat val recNN = NatInd.rec(Nat) val double = recNN(zero)(n :-&gt; (m :-&gt; succ(succ(m)) ))<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c:<\/p>\n<pre><code class=\"scala\">\/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 match {   case Zero =&gt; Zero   case Succ(n) =&gt;     val m = double(n)     m + 2 }<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"scala\">println(double(two).fansi) &gt; succ(succ(succ(succ(0))))<\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<pre><code class=\"scala\">val recNNN = NatInd.rec(Nat -&gt;: Nat) val addn = &quot;add(n)&quot; :: Nat -&gt;: Nat val add = recNNN(m :-&gt; m)(n :-&gt; (addn :-&gt; (m :-&gt; succ(addn(m)) )))<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443:<\/p>\n<pre><code class=\"scala\">\/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 match {   case Zero =&gt; (m =&gt; m)   case Succ(n) =&gt;     val addn = add(n)     m =&gt; addn(m) + 1 }<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430:<\/p>\n<pre><code class=\"scala\">println(add(two)(three).fansi) &gt; succ(succ(succ(succ(succ(0)))))<\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432:<\/p>\n<pre><code class=\"scala\">val vn = &quot;v_n&quot; :: VecA(n) val vm = &quot;v_m&quot; :: VecA(m) val indVVV = VecAInd.induc(n :~&gt; (vn :-&gt; (m ~&gt;: (VecA(m) -&gt;: VecA(add(n)(m)) )))) val concatVn = &quot;concat(v_n)&quot; :: (m ~&gt;: (VecA(m) -&gt;: VecA(add(n)(m)) )) val vconcat = indVVV(m :~&gt; (vm :-&gt; vm))(n :~&gt; (a :-&gt; (vn :-&gt; (concatVn :-&gt; (m :~&gt; (vm :-&gt;      vcons(add(n)(m))(a)(concatVn(m)(vm)) ))))))<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u0430 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044e, \u0442.\u043a. \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u043b\u0438\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u0442\u0438\u043f <br \/>  <code>m ~&gt;: (VecA(m) -&gt;: VecA(add(n)(m)))<\/code> \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 <code>n<\/code> \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c:<\/p>\n<pre><code class=\"scala\">\/\/ \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 match {   case (Zero, Nil) =&gt; (vm =&gt; vm)   case (Succ(n), Cons(a)(vn)) =&gt;     val concatVn = concat(vn)     vm =&gt; Cons(a)(concatVn(vm)) }<\/code><\/pre>\n<p>  \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c:<\/p>\n<pre><code class=\"scala\">val a = &quot;a&quot; :: A val a1 = &quot;a1&quot; :: A val a2 = &quot;a2&quot; :: A val a3 = &quot;a3&quot; :: A val a4 = &quot;a4&quot; :: A val vect = vcons(one)(a)(vcons(zero)(a1)(vnil)) val vect1 = vcons(two)(a2)(vcons(one)(a3)(vcons(zero)(a4)(vnil))) println(vconcat(two)(vect)(three)(vect1).fansi) &gt; cons(succ(succ(succ(succ(0)))))(a)(cons(succ(succ(succ(0))))(a1)(cons(succ(succ(0)))(a2)(cons(succ(0))(a3)(cons(0)(a4)(nil)))))<\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430\u0436\u0443 \u0435\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0442\u0435\u043e\u0440\u0435\u043c\u044b \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 ProvingGround. \u0414\u043e\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e <code>add(n)(n) =:= double(n)<\/code>.<\/p>\n<pre><code class=\"scala\">val indN_naddSm_eq_S_naddm = NatInd.induc(n :-&gt; (m ~&gt;: ( add(n)(succ(m)) =:= succ(add(n)(m)) ))) val hyp1 = &quot;n+Sm=S(n+m)&quot; :: (m ~&gt;: ( add(n)(succ(m)) =:= succ(add(n)(m)) )) val lemma = indN_naddSm_eq_S_naddm(m :~&gt; succ(m).refl)(n :~&gt; (hyp1 :-&gt; (m :~&gt;     IdentityTyp.extnslty(succ)( add(n)(succ(m)) )( succ(add(n)(m)) )( hyp1(m) )   )))  !: n ~&gt;: m ~&gt;: ( add(n)(succ(m)) =:= succ(add(n)(m)) ) val lemma1 = IdentityTyp.extnslty(succ)( add(n)(succ(n)) )( succ(add(n)(n)) )( lemma(n)(n) ) val indN_naddn_eq_2n = NatInd.induc(n :-&gt; ( add(n)(n) =:= double(n) )) val hyp = &quot;n+n=2*n&quot; :: ( add(n)(n) =:= double(n) ) val lemma2 = IdentityTyp.extnslty( m :-&gt; succ(succ(m)) )( add(n)(n) )( double(n) )(hyp) indN_naddn_eq_2n(zero.refl)(n :~&gt; (hyp :-&gt;     IdentityTyp.trans(Nat)( add(succ(n))(succ(n)) )( succ(succ(add(n)(n))) )( double(succ(n)) )(lemma1)(lemma2)   ))  !: n ~&gt;: ( add(n)(n) =:= double(n) )<\/code><\/pre>\n<p>  \u041e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u0447\u0435\u0440\u0435\u0437 <code>(...) |: (...) =::&nbsp;...<\/code> (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>loop<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Circle<\/code>, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0441 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0435\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<pre><code class=\"scala\">val recCirc = &quot;rec_{S^1}&quot; :: A ~&gt;: a ~&gt;: (a =:= a) -&gt;: Circle -&gt;: A val B = &quot;B(_ : S^1)&quot; :: Circle -&gt;: Type val b = &quot;b&quot; :: B(base) val c = &quot;c&quot; :: Circle val indCirc = &quot;ind_{S^1}&quot; :: B ~&gt;: b ~&gt;: (( IdentityTyp.transport(B)(base)(base)(loop)(b) =:= b ) -&gt;: c ~&gt;: B(c) )<\/code><\/pre>\n<p>  \u0441 \u0434\u0432\u0443\u043c\u044f \u0430\u043a\u0441\u0438\u043e\u043c\u0430\u043c\u0438 <code>comp_base<\/code> \u0438 <code>comp_loop<\/code>:<\/p>\n<pre><code class=\"scala\">val l = &quot;l&quot; :: ( IdentityTyp.transport(B)(base)(base)(loop)(b) =:= b ) val comp_base = &quot;comp_base&quot; :: B ~&gt;: b ~&gt;: l ~&gt;: ( indCirc(B)(b)(l)(base) =:= b ) val P = &quot;P(_ : A)&quot; :: A -&gt;: Type val f = &quot;f&quot; :: a ~&gt;: P(a) val dep_map = &quot;dep_map&quot; :: A ~&gt;: (P ~&gt;: (f ~&gt;: (a ~&gt;: (a1 ~&gt;: (( a =:= a1 ) -&gt;: ( f(a) =:= f(a1) )))))) \/\/ dep_map \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e IdentityTyp.extnslty(f), \u043d\u043e \u0434\u043b\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 f val comp_loop = &quot;comp_loop&quot; :: B ~&gt;: b ~&gt;: l ~&gt;: ( dep_map(Circle)(B)(indCirc(B)(b)(l))(base)(base)(loop) =:= l )<\/code><\/pre>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 ProvingGround. \u0415\u0441\u0442\u044c 3 \u0441\u043f\u043e\u0441\u043e\u0431\u0430.<\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u2014 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/www.lihaoyi.com\/Ammonite\/#Ammonite-REPL\">Ammonite REPL<\/a>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <br \/>  <b><a href=\"http:\/\/www.scala-sbt.org\/\">sbt<\/a> mantle\/test:run<\/b> (\u0438\u0437 \u043a\u043e\u0440\u043d\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 ProvingGround \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/siddhartha-gadgil\/ProvingGround.git\">github.com\/siddhartha-gadgil\/ProvingGround.git<\/a>, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Ammonite REPL \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>ProvingGround\/mantle\/target\/web\/classes\/test<\/code>).\n<\/li>\n<li>\u0412\u0442\u043e\u0440\u043e\u0439 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>sbt server\/run<\/code> \u0438 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a>.\n<\/li>\n<li>\u0422\u0440\u0435\u0442\u0438\u0439 \u2014 \u0438\u0437 IDE. \u0412 IntelliJ Idea 2017.1.3 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 <a href=\"https:\/\/github.com\/siddhartha-gadgil\/ProvingGround\/issues\/124\">\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a> build.sbt, \u043d\u043e \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0418\u0434\u0435\u044e \u043d\u0435 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442 <code>ProvingGround\/core<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c <a href=\"https:\/\/stepik.org\/media\/attachments\/course\/2294\/build.sbt\">\u043d\u043e\u0432\u044b\u0439 build.sbt<\/a> \u0441\u044e\u0434\u0430: <code>ProvingGround\/core\/build.sbt<\/code>&nbsp;.\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<pre><code class=\"scala\">import provingground._ import HoTT._ import TLImplicits._ import shapeless._ \/\/import ammonite.ops._ import FansiShow._<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 (\u0442\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432, \u0433\u043e\u043c\u043e\u0442\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0435\u043e\u0440\u0438\u044f \u0442\u0438\u043f\u043e\u0432, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0442\u0438\u043f\u044b, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0438\u043f\u043e\u0432, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0442\u0435\u043e\u0440\u0435\u043c), \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <a href=\"https:\/\/stepik.org\/2294\">\u043c\u043e\u0439 \u043a\u0443\u0440\u0441<\/a>. \u041e\u043d \u0432\u0432\u043e\u0434\u043d\u044b\u0439. \u041f\u043e HoTT \u0441\u043a\u043e\u0440\u0435\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0430 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c, \u0434\u0443\u043c\u0430\u044e, \u0434\u043e\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/329176\/\"> https:\/\/habrahabr.ru\/post\/329176\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/siddhartha-gadgil\/ProvingGround\">ProvingGround<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0421\u043a\u0430\u043b\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/milessabin\/shapeless\">Shapeless<\/a>. \u0423 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f <a href=\"http:\/\/siddhartha-gadgil.github.io\/ProvingGround\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>, \u043f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043e\u0431\u0448\u0438\u0440\u043d\u0430\u044f. \u0410\u0432\u0442\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 <a href=\"http:\/\/math.iisc.ernet.in\/~gadgil\/\">\u0421\u0438\u0434\u0434\u0445\u0430\u0440\u0442\u0445\u0430 \u0413\u0430\u0434\u0436\u0438\u043b<\/a> \u0438\u0437 Indian Institute of Science. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f. \u0421\u0430\u043c \u0421\u0438\u0434\u0434\u0445\u0430\u0440\u0442\u0445\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0430 \u00abwork in progress\u00bb. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0436\u0438\u0432\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0441 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433 \u0431\u044b \u0447\u0435\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u043b\u0435\u043a\u043e. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 \u0433\u043e\u043c\u043e\u0442\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 (<a href=\"https:\/\/homotopytypetheory.org\/book\/\">HoTT<\/a>), (\u043f\u043e\u043b\u0443-) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u043e\u0440\u0435\u043c\u044b.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-286672","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=286672"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286672\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}