From d748d5e7aaeb5a701a52c46f245f4f0642505195 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 8 May 2019 16:21:40 +0100 Subject: [PATCH 01/45] add documentation for elaboration reflection --- docs/_static/theme_overrides.css | 13 + docs/conf.py | 6 + docs/image/binders.png | Bin 0 -> 13546 bytes docs/image/compareToProofAssist.png | Bin 0 -> 7231 bytes docs/image/elab.png | Bin 0 -> 3707 bytes docs/image/elabLogicEx1_1.png | Bin 0 -> 2424 bytes docs/image/elabLogicEx1_2.png | Bin 0 -> 2421 bytes docs/image/elabLogicEx1_3.png | Bin 0 -> 2421 bytes docs/image/elabLogicEx1_4.png | Bin 0 -> 1436 bytes docs/image/elabOverview.png | Bin 0 -> 20056 bytes docs/image/elabProofState.png | Bin 0 -> 17193 bytes docs/image/elabProofStateEx1_1.png | Bin 0 -> 10443 bytes docs/image/elabProofStateEx1_2.png | Bin 0 -> 7147 bytes docs/image/elabProofStateEx1_3.png | Bin 0 -> 7147 bytes docs/image/idrisTopLevel.png | Bin 0 -> 20751 bytes docs/image/tree.png | Bin 0 -> 4115 bytes docs/proofs/elabReflection.rst | 55 +++ docs/proofs/example1.rst | 280 +++++++++++++++ docs/proofs/generatingData.rst | 301 ++++++++++++++++ docs/proofs/primative.rst | 517 ++++++++++++++++++++++++++++ docs/proofs/tactics.rst | 431 +++++++++++++++++++++++ 21 files changed, 1603 insertions(+) create mode 100644 docs/_static/theme_overrides.css create mode 100644 docs/image/binders.png create mode 100644 docs/image/compareToProofAssist.png create mode 100644 docs/image/elab.png create mode 100644 docs/image/elabLogicEx1_1.png create mode 100644 docs/image/elabLogicEx1_2.png create mode 100644 docs/image/elabLogicEx1_3.png create mode 100644 docs/image/elabLogicEx1_4.png create mode 100644 docs/image/elabOverview.png create mode 100644 docs/image/elabProofState.png create mode 100644 docs/image/elabProofStateEx1_1.png create mode 100644 docs/image/elabProofStateEx1_2.png create mode 100644 docs/image/elabProofStateEx1_3.png create mode 100644 docs/image/idrisTopLevel.png create mode 100644 docs/image/tree.png create mode 100644 docs/proofs/elabReflection.rst create mode 100644 docs/proofs/example1.rst create mode 100644 docs/proofs/generatingData.rst create mode 100644 docs/proofs/primative.rst create mode 100644 docs/proofs/tactics.rst diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css new file mode 100644 index 0000000000..63ee6cc74c --- /dev/null +++ b/docs/_static/theme_overrides.css @@ -0,0 +1,13 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} diff --git a/docs/conf.py b/docs/conf.py index 58e3580e79..7cc70a99bf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -151,6 +151,12 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +html_context = { + 'css_files': [ + '_static/theme_overrides.css', # override wide tables in RTD theme + ], + } + # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. diff --git a/docs/image/binders.png b/docs/image/binders.png new file mode 100644 index 0000000000000000000000000000000000000000..da5c47797f14a9f976bd1427acbd6d32877f0007 GIT binary patch literal 13546 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%0DGIHz5Ce{~?^HSyjQ>w40 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 literal 0 HcmV?d00001 diff --git a/docs/image/compareToProofAssist.png b/docs/image/compareToProofAssist.png new file mode 100644 index 0000000000000000000000000000000000000000..b53004d4fb5a5ca88e578f428a3117e51541d5f0 GIT binary patch literal 7231 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 N002ovPDHLkV1nia$C3a5 literal 0 HcmV?d00001 diff --git a/docs/image/elab.png b/docs/image/elab.png new file mode 100644 index 0000000000000000000000000000000000000000..f2436cad22776c887bf426ae16c754ce45af3ad8 GIT binary patch literal 3707 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 XwoBLe1x53-k0QVt28T9Y^S<{lP7mV+ literal 0 HcmV?d00001 diff --git a/docs/image/elabLogicEx1_1.png b/docs/image/elabLogicEx1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3282350c2990446b070519fdf0d9698a4985b78d GIT binary patch literal 2424 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 literal 0 HcmV?d00001 diff --git a/docs/image/elabLogicEx1_3.png b/docs/image/elabLogicEx1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7c534698788a9fac683993353e00694789482606 GIT binary patch literal 2421 zcmV-*35xcKP)d$00004b3#c}2nYxW zdwB4Pw|E z*dO>D$@Dy5eK%msi1z0LT|C#PAsu6T;0aH83TVE*leNema)GyiDxfRk0O$GciP9My z;v9`DCJqDE0N*2>A_Wu!=a}Df8~GV58VLnR;cH{Aw?g8=iw;0bU)g4+T~t52BTJ(U zSLf)7IEICVg@uKMMRwu$0a$FfXoYmCxX1@uht#bCmiY^FfXhP~6ap<03=UERlMq;Q zlKTxdPk4V3$xP5(pl!l2S|XQuT;$;@$NvQ$22S)B<^W$3y?}MV>V$*+mhk@7W}LW4 z0m~DP@h9QVt{|+#^>)U^AIJ=ji@%XuJqcDKH-B8zBTnGOufXDj<62l)SXfwiu_clx z$Hu&WBnmAjK>=_9aGz-(l)n&!QKY-J4*}8=@CtA%;U?o2 zz-7S2rmvp9`f^}C>5)qZDPSU*`4Alur+FFWJQM*po4OIeJ|T0l@F0vBIs>zTlYmo! zy-@i0Lu8UXOXea@1NtKyb{L9824Nr~vSO6PQt7K-jv}8y9H-K>8|5n>2ke0IC(c7* z@M=@H5cn=+E*25+i-~X0iynh?i5x^gD}k$U#Y6$Jedi%Lz6e+lF-}Xg``;$ML+C3+ zaAzXF#QnHpq9Y={DTtURVZ}sZgvnb6f1Ce~L&zb9Jmk!9+NTgP{EQZDA|jq36avp6 zaj`$ioJ{~z5$pG6Mn7-H8v`7gus;ifxSII0$j?0$cmNT@bDsLOz*9gU#9a;{JOg?< za4_Nu7b8yMb^mrlsc+kcv|opkUcBja?UC!e56Z?aGWV?l1_Qe`_=FZ2DQS6V$IeCx zt;N7QXmMTvdgHR*g~%*i3CsXqGwocnHYsE~YWXN4E(f!K+p;{S zg@uKMg@uKMMHXSx-omjVW?|*v9%_z@7G%2bzX9G1>iqErI%`9w2^xiFWS)y?2yICg zeQb)9yp0);5D<*aN4|lmm*m65lw=`;kzB`T4u^yemop%g_$J4f6z97Rl<8iUb$tMZgB1I9C9*3HFct4V|7zG%^a3cCLPC=LkUk*%0i|v>tdziAjfn5UH6rv2K2M~3J z^?eSCf(|f!o$ISFMW5#Je+%kN6hQkL1;cJa-)^`cCCPx4s;Kh-N1~jE+srrs*P>*c zNhn*ZmwC?1QI2MRUmvFy;z;OZPdm_S^h$5(6(2ng2T#Xde$!5GLl$h}wvex>d zq$EFfL+OT-(L3A~DfKz}SkvJ$uJ97c)N9aKhIub<_#{!pz^u0B( z#QgrwTzgH|0%U6XkCOF62{9mIyb680VH*@N?SdBLtdMaBAR=69emfujs6YhV1BKmR zLQ&Ill)l&3*H0_LkFCu_X?Na`d}p*%TcE|CgRHpKq+1^IkywdJ5Y9)NU*KAx)$x`Gi&)uOl>Jms`q@G!`>D`8z^mrrg77o$&T45U z9p|{%I)a^Fb%>}MI+QvD$<;Id{KwJaVij;9@FcEJrUxR#@n{hs*stSk z%z97RkGP!fNA$i%ArVu8xN&VjUv(%KbOx?(VSAJ?JSA)%alL+3h~-=h+=y72S6Qk@ zY^M}aUXGc35N4qdbqzzxOSP}Q6Ve0P`^sz3uJED)cNa$GT!J`39a7qg5n=hCe*q%Q zu}GH*5(g)f`Dr3Ao%5+RM;;b2v%`vJgH;T;f2K;y2ga*BYe>4nptr zAtXv>6740dAy|2L@Qdl+@lIZXbc9b(M%WZYUQ_^5nL&!lQ nU>@)~V#7^=D~a#h$r}CvWLf&yQnzA600000NkvXXu0mjfq=ieb literal 0 HcmV?d00001 diff --git a/docs/image/elabLogicEx1_4.png b/docs/image/elabLogicEx1_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdfe84cf03eb183c07c93a461e75f0914b5e45d GIT binary patch literal 1436 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 BJ2?OV literal 0 HcmV?d00001 diff --git a/docs/image/elabProofState.png b/docs/image/elabProofState.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd9ea1b0bb06f0e2a2a2acb8b9c3745abe74f6c GIT binary patch literal 17193 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 literal 0 HcmV?d00001 diff --git a/docs/image/elabProofStateEx1_1.png b/docs/image/elabProofStateEx1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6040b56e93ee0693448b350182481814abccc13f GIT binary patch literal 10443 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 literal 0 HcmV?d00001 diff --git a/docs/image/elabProofStateEx1_2.png b/docs/image/elabProofStateEx1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..228582bd128de389313c9b39bdeead17ae347582 GIT binary patch literal 7147 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 literal 0 HcmV?d00001 diff --git a/docs/image/elabProofStateEx1_3.png b/docs/image/elabProofStateEx1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..228582bd128de389313c9b39bdeead17ae347582 GIT binary patch literal 7147 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 literal 0 HcmV?d00001 diff --git a/docs/image/idrisTopLevel.png b/docs/image/idrisTopLevel.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d1e22f1150d7da527339ff8e6621d785a5dacc GIT binary patch literal 20751 zcmYIw1z3|`+%}B^sZr9S2TF*5j2t~_q(wq{Qqt0l5J7<>vt(NZNNVI;x9!6ADAQ+kPmgS&cvp74O^{@&vD zt>}G0;GytB|H1t&;DOD@`^SKHFcXja!tTEVH45lKN>^^WY$OG~o@JHuySp5ix z*lU#Km069z|Je5IZl`&STt$J`4W5Gdt-1)Tpuz||wULMKI^}{kTnx@V&rg2srGDQ( zKABuFXexCvFq;0pF;5MmM2%E+#jH8p3BL;xJ6Vxjj(f5*ipPvB`C(m&S6@FWg_n<5 zH)y_tf+#Q8$c`2e(99LZ<(&YZyy#|z3zX~~Q5)Hl5epwY1k{Y@!75bpj7SAH4qwxG zR;%kl4sG>^z(t@0#e1ChbP^9YNuBV@U7ZEx)7Gq^);SNFi7p<&7db;>UdArbUkCv| z*cWUq@pK(`@itan1O^m4pZj1JnVVTInBS9Zz8#Fjzax^xF~k?F9_0*i4w2cFEGL{N z@WgM#OPdvIo;$mg80$HM;9bxkkRM1^+og37-&g8YD3rWlg7H1$SF!*^I0aPIl0Jt@ zWNi9?N1mzpmUKSDUJ_xf0Of zoa58u6ZcLHLm97by8ODxx^iJUKB}RQY(iyOFIZ<7Bp90MjiU(8&%2tuS{NOp{7zknC9hVv{!9L-HN-7~3#Y6=8X`R|+St+ygT5GnLRAc}sHP z&#?S<>gI>TQqKt*2@RWWZU{6QWj_B*+CHP@Ppq?p0`ZKq-mqoap2-pdevu-3ci|s323g|yBr`dUIQ=aU>j9r$ zCS$EHJS1_OiQz}CDQ<#^HQL%H(_EAf2);aEbO$9>g~-K!JEzX66S(VHtdeK+RQAP( zH$CT|cIVILzQ5Czqp)xx#4tp#2)Pp0q?{t`zD-O4C~pdB-L!=6(Ga6;(<<@ybFe z)<`}6#rq6rIkMs7+t2k|%CNer82(XcB;)3HlPMrUsh?oXg-_O-b1_|;vzGyMaCdw{!Zh=6;%xUTGfnXUZs5zuyC z2NWXB4lrTqqx$1LW%ME0fA0d_1NVPL4*A5BKJNvcP~_`bR^#INcEEox=EROua)V5y z)YHR|#b>3EUDpRkl%q-Tu7))Sw)>AmsDWVwwc}qmS>Z}s&8I3#QBU0qAM{)lO^6JO zED;CK7lAcx?-Iq`gfP!_S+`SbYyo*0^Qo|61N&{gHrH<(7D@+<6#sn_?HHYHHDi?M zuw2Mayw8brBDxkZaNahAeob^zjfs_4*wS9EObpEaRQtMufK~ZNhmabNv`(^n1d5>1$-b24da};$nj*REl;ier_(d^zO z*Q?%*(v|EMpZ?{k>llDTe(HuI*GdkQV3`d6!9ub^c%%t4uEa5iM#errHBwfXnW4dO(JHa=O z9;%5PiSidw{f9A?#uP#$AZo&RMDf)+L4iP{5_;t&S3sQdxvn}_xVP$`lpsYozYG)S z@FgJ^Gd1kswANNG_lYqRb!ti<2SRfAOl~PzNFi;DzC>-3v{BkzY~We{6_$HTbLAgkjnhz_`#)7_8ny~j59RJ8zNejh3Y-1h{lEI|Tq!Q$L~ z76>L9&dz$9y+TNLTYG+160mX~x|uI*&}R6l0rV+u*F=qRygILjHKR&p3KB+(Y#4?`q_pbEK((w4DAS7MJJQEvr4T#yyJecm&@G&h=fD zDVM9z72Fwc=X}Q`V&ZC_t!}jwiNBP4%oexa?$43nYhU0@k1wY$Z&CVXC!{^3OfQ*2 zMUQqP(Ic2RAGhDdVcDHEjpvcYcNZeO(*&gCGvt7pjY|+4JYo`a%m%{=3fHK~M?|3h zIz9pRdLYQgm=6m1uwGpWFwR?`Ok1$3GPA6L-KJ@Xs#V}c*Olm? zFkP{7dt`DOb2D&lyAs^TNwIem|NWX+zkCHIda>!cQA_&{Omdv&FeeVxa`k5)?A~`U zztcEjl2sKoo*`(a)T9lFt2A((v#00SX#CLi#$oJ)_ei)C$K(YMC;K&TOBSh9r|PdO z@|NeZ3LaN-U!+n0)AwoJ`GD^BYptAKAw4KYVG_VEy{L?SI(CW^1Z=tEQ~2^iBSz-z zhQ&1aVcO0eHJPX2Cl-4-(=%RRH9j&YfR3!%rNO%@Pky#|^Z6n*nT=r{Vmx`ODX6Ow zC3S1&=#LNVRUcc1f5|lZkBLg7UkLIm!B@HL!b(BD>` ziLuf8wK&dwS7f2Jahf$5xBFXDHVJ|mTocY-s)%|FqW-KExh#|7uqP{sw18$EgEX-u zTwN?AGIJy|sqeB0@Lq&NR-p#&79CPLeFr=X-@00A);c5&O>OvzQ;(T)erGA4Ei^4O zF!#;VK!V6r^(cDI$VJA56w#8f2gUhjyBCU>B&f&lzFcIB>Bn$y5GCln2{B&8(1)&9 zFw-0H;j7X3YBTBx)0>El?IKPAKh4#5VvV0y%Ap=(7^Jr}m9NGqH1x#Z#$}Ndu*iT~ub%Y}6-4 z`x^QC4%4XC)?AdX=9iRVlznie_3c+%R$o^7?nC5hXg?SkYqk2mj#oD~oD4CHG;Dm{ zPw_X%CQF;ZwgpYvQ@R)G{>C-J%BSYM!V2@e>CD+`a7vlAd#5M4!fvn;23e$=I&X$< zzi}Sq&wl?bB5BN;y&qsW@st9d|7}QM!!3Ds!?r+sq!thU^ZvYX>ua{1$+g6PV;4%{ zsffUBEORIiyXFQJ%^mi!i0jp(x!`=_Q~i@_%|A$NZX{Mzv~No%V8^H{Y-$}h?_yaB z`NE_0G?zLp_;sj)Z8Cdb&S`uX1OAYF?(-S!KjS+i)i?Li*YC}6&?HjX{m%XIl5u7| zPoP2he}m<3>Q{LOg#yTxSj87$R{0TWWpJz)gNTeE`#|L>dm-Ub9T={p$OWqdtX9I9 zq=_MqH03>7C~{V*nLzf13u6JNYKbLzY`~VC*;{SJ(D&le6@f!ni}-)k7Yjc-Rx=F{ z(cQDXn2N9o@k^8FTE+Gd0w$%jG@tF%D1zNmuyulVl7!Uot>oMla3WoJr95I?Arge! zLINBz%7608BKIWjSmzp}I5kS|+*;X~?T9q0t;1A785(-?yMJbgTpjXM%g8I<5B*{= zN)$r>`Wl1t<(XumH4m`X6r|@9DeBCVum8C$2Vya5WfSW{Ip@LwyqL~;G#3_M)IzV; zI*Uv8NKhrKHNiQ%D(8Aq4pea|G8cq%w7$Rua1G8N9h4B#Y2V;iGUE4@Zv{0U@FhUbT%)56!;WN5d>a^1k2N`>zzRZ3M%oSCG}?c=2{h z05%9#EvWQrpCfVfJAIn{Efsw4`P>Yec*72P9r*#KC-_U=QHUll zk@1e{zkyq_mmj9*63frpAa6@8HFuQ^-U_2=*oqw*F3aQBa%0T^=pUB> z?IZR6@sd5x-5%9g3=|Gr~ z`F=Uzr|~#Zyhgo4>Lu>2;+Dil8V_QhfrX7Vn{-H9OA$tDYBxY7WOD{S5!eRSBi+a%`R*HlLmAU^YML{O%e>0S*IJ zPcEo++Ye6T0at?hR>wa6`!+jqji>k+|5B(d%>{w7RKS})+~yb*;>e$-uCo}k6X2*v z@Y*UcBl-vNbdwj8@!VYwiHqJYcAcTh_`i-q$&~*EA=WS1wX^y6QHe>L@43JJXKTpO zx@$OaQbJ#MhmXeJLLu?WtFqz_2!Pn{6yw}Q{_)&+Im>oQ9P<&t< z>8i8t$0ZvYo{Mx$6NTE1WIwtieA}4KcFDCS(9ChEGbVFIl%{EkcdF|7IOr!XThh70 zf2esKNQ-UEwvk0wn74n3rH9$!0bOLRmQ}cx{qjyKI!bB5axIEK7`TurRK6G3x33o| z{_0{ogyNw=OH;I*xH~$(<;4+gtR%!I_>Jn$nbRG5np19w`3DhVBfKreRgI_i)PPmp z#>xi}JG%iB))I~ZTI;Qxgs`36q(Aa~-TdTdZd(b;1b7WG{_*Sj3lE`gi;)}xPju?I zbRI2fEK`_zX9=W36SGdKO`rEJK99m!b4OQ2f~6M96Za2GP0YsxRMW%~Wt2twV=svq zr7unzwn{wm_3Nt0q(fFvj z@%ce1gNaEfsIv_*0XMWqjhn!vWTPhxlJLaB6w%gt9C2rjV5bs3HTMJ%uw?PYc9qCk zdYMn#l7$J}PFvyCp}&J)etEf{n_b@VXCtSI=Wfv~>(xG{%rXM5rQcoS4AZj3 z5m_mYGrLi6;XGF&*KMLIe8XZAdsAG?ex&CRqw%*czV6SSN#h~8F*TBMfy*{9s@+wi zz{{Tw#9PsUqS{qlrZIh9JKtUvDZy9h9O6UWqB_xFf^X7_vjzdv9`UK^e!ytJL^_XW@C)5Ua&F>S^Gz`2=Z;?MhCAHfa8^|-kJ#^h%gkWk zexoYfd}XJX@()?Ix=ke!z(;kpFfcMu?z02AFRqA(l>hl%n3D(UX6$vte%N_w$2dBR z+0+NWFtbHmRgdHF_&sXs60&;NJF=oJ@_Ws@+J5Lq+TN*63+C-J@}OG(ozf@H;&BUM z5Z@Add(*8%_I08}DIbpb6@|9pbX0){{Qy-PgGejO+a+GB7gw1>^LGkwm<5~{+M`6V zWcrWk^W-iAPNZzCH1p)_Rfe>eWwDZxPoBd`==1%p`TS7xd-|eQVE&9Tgad08C0L$u zVh@Gi!oL~YX46@cck{~%I0zJqk+Ej&D18| zXhk-4(bF?tzveyXzO;`7DNP3txl8~IpQTf70WTrAIB!6eez+}AK!cO!Yqr6tgU*|aG(tabM| zWvVhFY~Oj7jl8!9ot-{ z`Oas4e%~u2f=B&O!V}pchf1= znNME$Rv4X`zhxzs>ajJ1G*!@%LDExB8Bi)6G;o5l1Q`t4U6jIGoUx{`R_5wWGOi4e zabY2RU7dWiunw`^*NrBh@_`pIGK;#8^_rA~hwYKK@T^Ao(lI&*r_^eC5Vt#Zexpn6 z?s5ZMh~?^@kUNl{x{1Q1YPLrYg73LS-M0)ftQd$fTa!_<)6-Y_$8S>z{`D>UE-!7i zld@-*73y84p5tMmlqPWMoF)@9CtQ0fz8~o~i za@lw9Iwli=sC7O@ zp)V&G^I_N1x}5S>Vy5MrRv{&6M5bV!CJJc0|)M}9{+6?=u@-!EdT^-)f{zQT*>hfTIsGv`%pPu>Z0-OGPF<1-zC17qv9rk$=W{=MCJ z_go!jI^lFz-q1STQROK-+)dIMY=6rsIDs@OnjM8Y>ZvJukNr7IZ5e)TkDsK0cgche z(%TKM1+1#;1%+@SoCaM!W@dN@&!G*H?0rDQul*3$uw9?aAKi&F=lTfd;P$-<(p7Z~ z_6hN{)ceH_As>hY!4$|eFEN4~(yO5q#W+&5O=v+?E7>6Lk+3kv?9S%z{AogXFI1x& ze@q%{F(r5R>T^b9hjMb%9_{9!VV4YQ`}9Ft6I-;jifWGU$ms4VKCrqo&ry_gxVV+s ze9##y^LVVUMG#4f&~ixo_9Hf$Z#3fjS@wBVe~ou*FWQV1JHIqlWj#u~vCK$Z29c2D zIT3do>sAiCo?|ZGTfUg-5O;?>u)&%S*kEjMGvI;eqqX_gm=?5%5Rz9ib#2-!t=8i< z!|cALp98a3Z6LdQ%haZ4HsZyCY$$Wv?qxtKD=Ptctr6R*OQ+-`V}Zu9bBs_HuL;f=5VFMm^krE&(n?+2ejVW~kgv z&m2MRT$C2SD2}%+4Dm1Cp_QH=QR4u>Zo*kZc$XrrzHVEp)7hYegD9=g6>dwI0>q~* zR8QxL1CQMt7Rbe%Q-6Q}|9K-_@N@QxyJYD(-cn+|Yn{&TZW4~izkbZPt)pv|r|4A^ zpTeK&&I~y%Yb2iJRs?28KA}5j&$VD>XWk&Rn$%5Ney}X@`_4kQW4-TN%MwKACL@CA zRyEiDFne?Hnjk_UM&TSTc%p%FPl)PPQs@spFSp$<1C^=qmr)IKkE$!(aRPP6AMX0< zy~%J7wurmVc-g=1apbt`A!#y;fXP47*g_wa*;1plIgU>yyB_h{XSUbX3w?s12z){& zS1-6kIq=r}$qMWtBzk^i@UL}a4a{WHcKbuuOd1D!UoS7w&Wn#6ItU+7PrPQ$@%$1QP%Ge$ zlBRwiiz+o_+6u2v)1d3_p+itN)QU|cBHFDB+0;kWNRWmpv^C5J!OUpW0zHytVV{Azp+ zxe;k8dSOF@0zfWaf4c8Yb30U`Z_M^CKM-7JPZpdOauxex@nWh;5dqf#ceCfrsb|xw zMQAb|-$rg2&OD;+HLqS!QLk*(2O{+(j$FC(RIOLLtV(WMeVosJ|4fqp<-{S-oad?P zQPi2|@BYZZHLwJ1HWp?n!}6Cpy?RTg>vr&h#qTzSpzW6;~n@HNsV-{ld2 z?`v0AXU1H<6z$BcB(^#4;x8HAo(8K*f1)Rj1OkwSRnUgaSC|ir>+(JxkWVM$1zWM@l|3lZ1GmJ{6!(ci3NfxlWjA zrH*Z;88slrI8EGuj5@~RJCw9|vU4pjUoe>8t617EEk2=!848i+$L0G$E<#>6?ot~& z{cm1%7fN_R9Cj_U1pFuZUz9a`vg(}g!;b?$}95PcbW)_b9f7PqhFgFvN?WS zw3*U*%R+wU9dA7hEQUvt4ldTda}(S6eM(^iKRjL~H`!~+jl9lsz?mi^`#fj!-oU={ zcsuU_p5biW6YkT3xAkbDBNY zGGCJGO~zQy^|qI1`wYx3d$>KU6W_{c8HpCaj`0E40lzqX3? zd}pNaBY;BG_BYc-YlBbMLf7wbg5~bbt8=AG5h%&v6436iJIPO$(E7QUcnXy07hT>i3GbI1vQssV@ZF#>n-rH5M& ze&aBKoV`gz%=Xo}+m==dAPFe3&0LdhZ*j-@K+78Ix>u=4cGCbP7&s z1+Q2B>TlD}JxGDhHp3M6te0H9s!>6oQkbu|X^I->We5Bg*rsS3H1Xzw^;QDTXu zhJ9mpIn+m^#!>6!fs)Ig#&h1|rU|0)$Ucrj;ovfnK3~nh`K0`x_1;einwY0cZNjs$ z#ZIjW0v2+Om$NO|h|*B)|jPZD4BXdxiei{!B+8ZG9o_NeyLr=&(tHN4u^ zFod98jaPN9^V|~p!r32v<&5!{BHl5vIQNSG&O|I=J)L8#wq)p|7INexr7|Tth4_)n zPVxc;;kLD{j`T_DjhKsJaA|(a!-FiAxESs~a!ae&*3y zOk*TFydT7|G1Ssaj(U4QnPz<&Huhn&doB(Jm7?Jn9hzz=^d{N-PfpTL{tE3t@ikp2 z*n16XDrT*UZW#Vs)tKz=Cy@Bj{f8$*RU%c`qws<6($t@~2Fea0e$2pT-j|Xmh3peK zLh@;1s6+_#!@==?6nBG$G@(u&-pUw*opr-qjwVvY- z`fhU2@H84FW$XVPBO109QeEttOCAqWr_nv)i6;t_a{nS31IoEqgmU)&sg1H*{9ScM zFLWz5?%DIk{lQiYv)KL9Y6dG?euK0!JA`MrU8Ve~POjr~-+dLu{Kfr6@^8x2CjZ>; z>k%-hc2i)63ipQFe-~>!5cb1aw=%pLK--bkd{eoNVvZ`EHyIFJ+x|Vk$WDzR|MUK{ z0tgXZpdmk!yrI`o`X&bX;YNFPt(6jR_Ut2p=h%Oh$}G?!bf-Rn25~g*lG)HzQ1N!W z&EX?)oEKbT`G%X8|BjEXvR0Y!eB~!;oRY_=8`+heX%n41l$a#(tb{`g{nEloTzBbz zy#Rz7oF}{^q*`0+=$XfRSxewX>D$uU9~@#Z4>evaj2B70DXXUGN>7g(?%!ouANw-6TXoslRQYS; zgC-q{MK=qxgrL@$FX1e0`$u?$1y7E8Vi)OUEbpM9hdea@{vi{zLt&sQC0f^!Sj?Rr z&F#xjV6CXK#|Lu2q`ZR;B|WMP-BJh^*q&@0$xfk1CFnp}YtC+hlU$E99_!QC<_Gu` z5Wzo|@(wF+ImP8}YYv--nbUHE5ApmM-OHs4nfo+!(C+usFf}@tmBi3m5pGp{LM_rn zRZoh7zXc?#JdL-)YP>I8V_AEHIeocisbk&-0uTORuvazWj(NZ1OhJ90%wXbtXY#=< zGB3p6xWtL(o=p|6gALv2J@dV5N6mD`V>rPwt}{ervfhfpX=XYMy(CoBD6(BFWic03 z%&xzXX|SbJx&X_N8$Y`JH(%;6yD67ay`XLN3@h_s@9H0X!Mj|%6iXJ4T_^1|Ed#1b zkO(=2&>BcT-gn5=u((15lUBXgPbUj=kU!?i6C1=`>a+?I{Crp=V48BDsiibsq6Qp` z#UpR}(e<3|{gQ&nxTaB`UsG|s6GiP%*@-C@B~dUR&8vJ|rNGH$N%p0XBnL|KOv9%_ zImDcUV-lvfqWqD*B(ufml}bGZ{7;}PPOHo9G^BG*{^E&!e+6_%jmhB5i}mMH_cbDp z2TZUhi~|~7@I~EEb__Y3@%2XpT?V9ocPzn|&UwB+>KQ!?5^m|wim5nWhu!t1$Es8& zIGH_9w4P>1{AFvjj;D@Ov>Og{!k+2`ZU45$cBG_#h2A#l{WzT^H;<~&=0&PXT%hAAI+eks3^NH?kS0C^_GJY#qX}BKO~BqScC;l+d7bR zQ$f}XB)u@!OKb{h#hkO@Hy;J&B4MCxD$`DZ79nPS^X1?j@C9PWMj(n@UyDD=Bx3LF5P9RxJT9~>BBr- zbKC^ao!st?Mk!eYyeD(|boTqta}+q8kv)5Y z`oApI^*^0c+>2a@@byxMgDZyU)R839u}e){aTtnmBEF>P&_pmmt(tcF zwg&TW_p@k?M%#z=$HDSx>A}l;A?r*+P|o=``er-@KY_J0t3S9r$$XU77s*$7EX({B z%h}_TB?W93Bu?JV(vT&}Dsl!|)bPeOS&AwvxaS0F2SRVDAx@VA0&F=;0kVEwLE+(E z!6(Rc=v8&8_vR~4c?y0ZBx4TNim;^!tJmVR{J`>Qn#C>ig6U#^8HZQZasNa8_6;}x zJ4jXgH{W%T`r;a@_UQu&>YMYj^g?gu;PT$h%Za5$R~5Y=x%_TxHcz1rm%xk!c%NX} zI({>E?j0ULGr}w^t5w+nUD0@X{ad0zS<%IIKiJkdrTW|-^M``A%JtJff+~56A6TUC z!IUWWMNfKik-hN}`S1prq5>oVBA6~5yFzI5!@OerXRvPUoDn^J{-v(PYwXGHa9ISw zl^GjOhgMw>K&0+2T>7UfNZ?l?9LvaP;~cjwjqNtyFiy8c{k~>Q%MPOInYu-Uzj#{v zc|N9caNOoLv#RFyj-Cu`*BfgTTJ$gtl;As^=p3vStM|<+_w4aEaGfh!Y;ngpvJfIPPqwe40=9^3?IwHFd6U$mcF7XS^`a(2vKFeWm zYUy3j$fac-@oiG$9wjy?F7SNuyW7MtyM^`66evxPC`Qx>Shy~Q7#L;u@ih6NlR*-G z?p8Aq-PjfphRHM`e!XhDFyG_J&y+fIO4$ZzS=A6Gj2vg6UNg7XeyO~=Sq2t|}aPaV0c7ZpS633X@s z4PdR8viIs( z@D1X%IwbMRXXF&&g?v%}#3Hsu>zRIe2f&XNqZig^PD-}y$KLrxY^;uNqk4!2@p?&m zYeztNGgq1-^}14(Q_|JXC45N8Jm;1q!)XW2F@4948hRd!inpgN2uuM@u3#E1*cvCO z04qQ)jlhqCh^b<%bEk)n!@!dhWH-84(ml{_@D(RQmK0!)1h~=(Pjo!5xe!$s7aT zbOVXz!tu6dJR6N?s39|_xhv$?#TxPNC*L?|*gabJ(-$WW%$s9=~sse>}^hWvocbagXn9rl@1YI_T#B5LDLlW)Ox^#&$n_=Np(*=onSOZ>;svwBWw4Gm@lHbs(uBx8dK*#%!w-s}erHhbhhaJ+L*3x3e=o4Cs%dVTg2ynBKgqv*%Kc?4>U(aR56x~c%zjQ7n+nqgv|K)Jwjm6Fn8NB zktVMQf@5px7~+m(ODx17Hl+s!L5aQq{m{dVC(ih@kkFEUuRzZnapKsYoz0b`nSgXE z>Xkis=GI#|5qD34G6Y0@$(OGe5^9}%1TVk6^5oezrBX{s6JXhDP$HaSVxl zNy|B%Qi~z{Of!I(#U;(zAl}vaQ&4G;2Q$B}1YT0~C%w-D7ZouiQJZ zHGyn`dS$m4T}hY9Tt8%7!{TjbMaEkO48;0UsyXc=Ei+7V_4|45)anb)e+1M-MZtpfevk@FH;b)d8IEj;99yLfr-N?^DG+v9=cO-WZXu?4;d zhKlFEV5uQ9y(2kxLKM?HO?Y-z%AFsdj6IS6_EN6S+OzT0{319ue7I-o499Ul z#2IOMi!(#M{+v%}-)QnGlxbo^8{cn%kTvL`q(ux?9O_ zF$xb)@4%jj07k#Di_2Q*-w8^YnY8@KKa)yD1C6lb09?2m<$^zX(z0Vr{XjqJwG3%9 zql}Vy6pKBh-`62k^d9l%n>ngxNXkcxuG%G>nohqJAh93{lPia_LM( z3(P%$(^2FNy*Tt3>=p4}nnKIP5TKrXkr{1LW!%3vca3kdOX5KaG;xBI+)DDxo$crL ziMqZ)P6}JzcP}m}{qQ0_Y2E!0l;8$qT3`XJpXv%8+c_ZX2moEd)PIEgraC|GA>N?2 zTvSb`36(9&qxa%C9OoWJyf6~WkrdsUQ~T*-AzOBy+WS@; zFHNsan6HAJLMmtFV3iaWc%S9(dIrXr$r_13j{#b_Ca&zcayTXh-b#0~t{Js;gd~Xs zjO}JA8$kr_E4F!&`l3p2RGE;7v%-%qP1`k8 z^u(f^O=#{mw!!gB)kBAGJUd3?Vt!vYJ1*!JcynH_ACLW<&6V%<+LW$}!uU9T+4*v= z$}Z=YaEfursf}u2alxiVhaY@WD%5Yy@$X45Ps#005{eckgZEA6;x3PRYeYVQG$fsl zi@ig+u4r&2b`}8(g;~m}9}ByM3rIa{+~p@Wm7E#vRx&*+D}z{sK_Os;r;)t(V+-O{ zT(;t(^u16M#=%9Y_EA(u2>BR@Zw9{C2=d25-Vo_N#Wq7b@Bm8~r`DbEWjN*2NnQ~n z|0NuxrHghg^z4@O-bB=Dg+(*Kr(8|u{va(+@h&+<1(vIBs!-ZLT!SCRLn}#b70wmI z1{%h4-V-uDFf8d(B|=;y1MdV1G2MnOZpo84x#oHfJUa$RdyEvSjpo5`VsVA@>q(Sp zYo#z7paOwvJy$-dc8$E<$O;TmM^Gb?*AD@cW=QyZ5O6iCDn8kd1=wcICquk@iECnd zHP;bazb3@l9ZV>4*H^*1k;nH@D!!UEdi{%3E<8e`uQaA!as8SW6_-o)g|vO#3!dmZ z>Hc(lQA$c;DK+>7UY0u4)ITuA77Hbt{IIDFeDM4E_FKXIy0JTSy0-;8MCHnKb?cU9 zA~BGwhq1(R=-o1hnxo@F{FX0x;s7d3Y(KZL@-broozM4$J|s97GD5(JBOO;nEt#)V zms|2qk!feL28Fxpv@_^D<)Y}wbk1Ai?5PlsE0^;ioX`Ph&Ej!|W()YB(qz<# zPY>AgrE$-JkngtK3DDRI*R5rJ;-x+`S=q!QG5;^aO>J~#`3FSky7WmThSqedC)q61 zwp9UT8z}J3Ai2>9=!msG?%y#$yy`LY+9r;ZMU|%YT3pxoWyT~Df6`B1vvPSQzR8W#<{yhDESef6G&v@d zH4u!%Uu>*rbSyurWYEWmAnce#(M6XCipks5;X2wGIH z!c5n-tu{RxKm%#e)N5d_n-n-mtGnSEFrtz$uI zAd&Ei^J^ZZ4${DQ{0T4@4X(Hf`HN!CeRL*5&uWe>=8IyzN)!*d;tPT64pk6w!Cj6L zt2Re*5le-pHVx?wd+nog(u_AdAJ}(vT?-I2xeu+_*oirp_WgI6vz7lsObars6K2F7 zMOV5y?#%T#7qb!V-nd#QEtL?zKUv1#) zur;xj$P04Zx6tvk62-|ZcxSX1Ty*v(@AZ@`C%Ydb zC~4EwL0E0GTRwu7c(bJcnHAV(#QuFMrWVamu$700xYl zf`@e{qO&pRTc-`04X&LfoK>Y$5ylINMCF|Tsik9`sV9-Q`Efdsgwv7D^K6^Gz}U3& z(gpFU$cr5!(M?#BphcAaeHt%K;!*s+g0=P%pN|cXMItL{;ph?1*`1N>4K5&+&HFj@jjz_0$V`USuz#>y`p~%i%H_nC)a$I8V z3GHykUXa4mpXdGlkOCUMg6G))n{sES5RDii_|+0IJYNyn#r#5_8ISA4Znn{)H(491 zB_x1c)*9xg+u)?xN7JSrP1kuy(81TNkc zZO)5aa%d>=ahT?Da8u;?AKRZWRaxCQhK(?YN&r@&c*zoE|IRqn#zd$drH#4n%~jxN zdE6(t!fxkCD=>9{h}VDo->QM0t02yVs0`KtzXj6RM?rpTmG3(0$*j>nb|TRh@LuvcsqL? zpzfrM0Rhph+uAuxH!#shEsP7#9`{ZGTf;5Zr5qUys2N2y-{ZU;d z-z@yKU+bawl)Mp8)F_vO@BopCJ&l|vTG*8RD5vur9y0X(*|_4Favrwqn}8#Xs~|8h zG6|)ANl%0Kj8G=$x#ADF{}(aLEKF*VW{r6f2pAb254)6JO$|_SN)OKYUOEEiG?eV+ zpgw5WL>w{{I`#=dkLz0P+DO#uW*(RzMn)&dPu^YO4*Oal!VTFtoc~TFo(X{je5x}? z^*t*F^6(i!o+@>a`C{iq>3bHWg=1^48pzM}@EWcbz+! zHx;w^RGv1Gr3tad{E$ipeHwT4UR*%(NDZNVHP3vxJk1r0rWhPtyd~32@9@c(c|d>X z0mEf|k5vMrhknT*drhnYx9u=N4X4?r*+sJrr=1(Y&L+NF@-&exEVX$~F+qc8;M)tX zR&lnR?k;5q9C1=ISvwOp);Nq0n@!9tJz!aP^VQvl@QX8tSP89Xt4b&Q{XbZCtV#3W z@z9)+@dV@nC(`1rx?5DsK#-D_^KFv^-SAv;4rGo48;~2A74d`snQ9O zd_(z-v1_KEd0*>Il>5i8;u?aG^reF~?c9vHtPv_p2&nAWuxMKSDL7ciR~CwYGKjnk zAaZ}?PazYD&iTHidv@b2$~*gc_0hEF6KHOtS$t%Ga{VPVN2``iM85LNe(ZgwvaOcR zefjuscn5txf^zp37wMz`@#}O#-sJ@DSz*eo-VRT9Yo#1IozFbQM@asx0hfbl(*8?v zLP6TE!+$&~`N~4BiBO-JcoEXyjml!l3GoouFT>l6MhEZp1g~VW zD4=CM^sk_^$nz>)ZytZm`JMO_Z?6MVcdLP4^eB9p*ti~Y+GIQgUVg2XS&VK`wk}xj zB}m7dvCw4dtBv|#gwmzkw0soL%Z8C6_*nvMHhBBI_G(gM_)5Rxq!Y}i+$cVKmJ-7; zp?ya)*V36AE|vA6Alp@d2OHe3n}%W3X(VF3ce962fs0(5Y8i>}_{yW|>z|_P&K}eF z%oF)e2`Xld_W{>Byp>*XU!Rj9@R5CcBsA7@%(m~-K3IiTDIKEnbpwuGCIa|J$iO!1 z>WSaBgBu{Fn= zR)h3;NKkgjok60Y2i<^^I7^S*$vFXwvKpJDJI8o)b`-AoqO$NTco__Hc&_?_jaiL+ z9FKdknF6o@2TM);fmNG-=9i68ee;|tuYhvD@MMFCD@0t?H=8Be`IL}PGJjRvDDV3; z132A?RP_A?{e(!TQk2+~DnQFc0naxJgXKv~ePXWXOPtr;Lk&au$eUmqx%tEI_k*II z#dp07cbgt`Es6UUsb<-Ym_^W~tb6GUauXdXFsSYFO;VJEbj> zz`Ij&rKgoQecn?V6f)XPgY?L^?zc@vBsMkwqT3wxf5dM<|3IHeh*=UO@4*WE#l+qX z^f6Xrk>>fh*IkUXLo*gONoSRAJhib}ik$d%pD^2%qF6%^rA}n|y8iV=FoEERa-E}ueKI%6H`TYEwccqvvl83S+ zWi<`g9whROCG55u0kw6A2;Zbd0k#qS3DkYsvy-g9Y3{u-X31^K&h?%Uc#4&B{-tt%1FuY?k{d!Vyh6M zc5dB5h2PTszdFu6oXI}^`y081XzSs5r-uLzWd_M2*eZOCy=LSBB zDxH>1v%3fyLjPWVo4m~JxMq~OV*lu1^WZZ&L0bR{Ny|-a9hcY(8_Tg)!)n`hn z77_mYDk?BhxREQ=wW)zakz!af|#iWpfBCir5z~8)(b*z@nPBr*9 z)AQf$|8uEQr{lWjzklw)EEA`lzdx9}0=_QQs{7ve6n~^Un|9!;g1_x&yQsX7Gf(62 zIT7XCYaiq6>}MGzwg+>{Y!9~fJPgel&>ac&@Hu2%_o1Lg*i^&c^C$}nKL2}K56UI5 zUkdGIWf>mK>Ko?SmQtLx%a$#K;+ta|s}a6BN$)0S zub8_y(13ZLzPsk3x9aY#a1jwc9)D0_IO#tt{gGS?xTK@26stSUgZfzTfK{8vdZz{Q zSv==dH9)HRCqe&HbhNTsmT^&nSos=vG>~U2yW50y*pz&K^t0!#uv2ZkkkhATMW+j< z=ltUhj+WbqB2!Ui{{pR!c#MA+leSjk>elhtZc_`g@H?GFaIdZhip2ae+Nb-qXW^Ig zh+~5uK_|=HK6hnd?Z1iV<<}Wkk8vf2De?95;-1AsXk_T1{cG7MJNi5e9CcTjzYib~ z+Ze_Vm7mJ}n@vlqdgA(m4KIBb1#j&Pc7rF15~la*2916OcK$}arAGP8iMT(TH~QRK zN&fiuq%cS7YDklf}=^!d-j} z5<;P}%kS8+h|l{ehdl@d$;k|XsX4~J0G+EAQB_J2%|k^Q2=cqKTbyqK3wuT}=blt( z%Dr_LN8y_~KuMFsNODndp*r~sAptC5B>;od*EIRk z+Y!8n0A>Cq?5zR#E;Sa_>?ds_pEeJ+`l$wb;EUgvwl8?AH6HmrF|JJRK6~M^7nGJBdXhRwY7Wij zYQv5vd~S`k2Vq^IUAO*6$L5)fnu(3@4{1hkY-fp`u%dhUf-Yah#M3HEQfLL)HJ9%ZpcNl2AQ`Q8vq|{r7cPT+t9MOUF{0)dvbe)~70Dh1jM>nC zp2CM@UN7ScICzsre{W69ju4RSIBxihA8AASuxJ;F5sVd6c_e1mJZ@%WC%kdwQt=R~yo*HD%QJ=OYDS`URDq>lxv@PVG=cKI<*L9Kxn1DZjdzNGZ?C z#T~Gq#GWQx+>(Tc`xP&$|9!hX3re5AqsSW>*x4}*LBV_Oy@&``m2|O_v)I?aiYS$; zf_UF36ssbJX};=6bgJ3j9!evx(3Rw@#4RQRaJEY|RpvF75G9o$7k3~1r&idpQCW$u z=CtJcfK$WMmsMZ-IC}9hFw@@cBNDix+`GuzeH~v}Hw^|QV14IR3LZ2>JMt4(-#qbd z?F-F4%?G^N@X1V`vjYV(fP3<gWAP3^lDF68$QjJ15=ibKnMSVW;=#WLvPxbUCuXvR@{A@P8Te^fW&d= z`Uq+3NHXfmfdirjN5C=2LqIIbf5`wg`)eY5!oV3a=#E(47azul+6!+zd=)uhm#C)- z%{{kw9=OaYwV?GDVSuDtR{GSVmgTCh9O^=3S5 zS7nWvi=P@FQ()|81jYZPmREpK3qNNujqiE*cjxSq62!5Uky_@SzbZ;T9K`3;*6nYN zGe>jBSUJ}btd29GNwuoH>He`Mt>J0!UV5Y21e$OfnDP^F(eH*#DN|$WYlX~^@p^Ce zCJFxB?<0Rm`norhczn;{5><#i2+%=s#%^}EB);r&M^1%xS@>#Ux zr|Er=S%Oc2x9$kQ^uZg#H2uVeKoQ^(Z(sIT!i30L!r8@Of7JBtK4&C-pl5{ zL_)_GD*|0io{djlyDC0EsgHP$3)k0wb5o{XX{Sa9a?rWFiEXm_s3ToZ_Z_K|2v*^E zR2J5PVqALLNu;r9OXt?iGzuxYV)op&)nsgUK=Tbw{t7OkgLKLFI>d%)@gr)G_Y%- ze+)xPw#MHGK=J!_Vf9hDFCulHcDT`dtlajOZiDl;;d#RApgj3|uE#<<6rB#vbi6gN zDd@oCQFRBLr0d6b%p}Y(MQJJ@d>q0$`{5pyk!sKrU4k8z<%lJ1k~Go*Ko zJccHR`^GJZ;{z)!%7}Y>^44ODs*|z#RP9LFSa00@;1K)7O{2Vilw+Rz{Odf_C}p5b zJpDA0wlk>^{o$EVa~ZQ)E3~b9D#Gw(o$5`#d zJkH;ww^_FR`qt0qL2Z_y6HWAie70D7vQF+c8Wp|{nNEv)7P4gdPwGr#Ebt#6{CUi3 zM$S+yQ9ZqTTK;1mA5$Kn8DSt-!VFMRiYdaZZqshjz^bv-J*+i}xg_{IjImaomtV)a z_KJW3z5TqnlSz%Dk%i{DC4|Ip1R0a3(qZ0p+60(N6gUyHUXAA6E8sAKqJB9}& zjDq%ZmH>Yxo*1@(Zw+7X#$pLQJMdASgKV3!_~%%NrQo}p#&#~@Ldq7aiQ$R=wqN-4=x}V z!CHJW?%jT8Em9n{(h`=%y9OEbbvv};9AstU$!K%yF%F=uAWPdPE9r|`RZ3rE!Bg{2 zpk!KI_=%J!H5YBP=Av@Xw2j6UicmQO;3>)N&pc%V@HcL3d}eYHG^xcg^>SUdmf3`} zV}z?&-dVIVf2AQ-&nE4Te!ZWSKi@Y|Oomnp=)VNR9jZfduwPl3PwKAa7%fIufqS_3 z_s|oOzR11ZVfw!)cvPeRJAq-ULX|HLDQ2XJN%tO|cZ?sXMM^RD;YQY;xAr6jxhoUm zrbBU8Qq#NpK9+PGdG}43_-8miMiMxlGz2X_-v6{h5`pd6$coLDnqy+|62rhhapL)! z)vCJ(3@c4+W#>n7D`wo9N+N`}k$IPb4i7==EPyV$7xZ_|ysSFdBM0;52}k4fP9}

zn@X+KbXc=B8;CYHJ28cAab`+&sRobI3sx5F_0=a-yRLjCRu#C zU^CFPVF~Dqg7uw1(B@4vFzru+`O3h{VVL&kMXc@n`^}}c@>19Z+5rh-R&b&A%5f_Z z*%IcWGpjoeAx~y7HcwJJ{bap~N!OWW7Z&oap4_V&k(fJ$4~jxH909JIOswq|H$c$V%St2tvB4fY?iLAdp3@Xs_^@4@DikO| zu#_;OkthTFC`f>>=ER^C$!6|&zSnyVW#^jW&=Sl@4W4stEhL~@K^%F5ze)2K%{`@| z`f;gUp#<%B1TNMP!RHw@@tmo95hn?~)3(AfAKgpCe&+L*3P*2ikY;`lT~|Jehpaf;+4TR8KCv-(6!hY-`=uT_LuM# zRB*g)VwL(%KSPcEQ!8TccA4V$*(vl)kULf=v*z_@O;cU)7MZjV=c59pP=m=Q>A}%v>%x&}RZ* z&dv%v_hbrXIvGtUVg!)uUc0_6o@H|%Aate=BNK{`6g1gr(ccM@D?Pi;3K(Kl);imR z-z%)T|D*3d`+n12P0Cwfj^?*bdEhk8rmK#(9d}G=JX!eHvxWdR|r zM(AOd@|7Z(?E<`nL4>?o|M?(-^KX2yGrMK53^4u(aR_aG^b-0as5&=RV#vtpw_aDC z2`5M9ZmHZWsZ%l>9jItbGZjd(~AXHV3@h@o&mGZh6b6g5rM z{5a2=Mp|lMiespt1rFepRs?BDre-SOSejyznua1OqJjgYD1#=y{#fh2dwJaV?z{Kw zd(VCEp6}fxCbSKu1460XP)s2}}dF%X06~jB8)3 zb8Qgt)jW0i3UDK^Q^vWGz%72<1Goq1o#ozcz+Zq~o}L06?8gTHSLCTnMKcxn1h@^W z7&U%=F>nnq5D+lD&V8MMcYvLN8-UM&PJXQyunxGq0DaB^o&;I~?OnH{{n{PCgFuTc z_f-LR1Ap}N!N6)@W1tQ2PvE!$^r<*@1YQRo2X+O90Q>s2T$SP{zV{g(3>{GED_Aqj>AMhtXeiB#$><`=ti~?Q)UIcCi4#XbTRIKt1 z#6Ah10)GbP)Kf<4Q}&7fcJkvDz(nA$z;fUupr2n$-SZjnWkz~7u!WaBzY+hxisl92 zRzJQ8c-fD0S&Ajt+n!<)@B#J^Rs-Yw{O*`F*cn(0jK!>mFiTY*ZGpc7vpjt^ung$y z>BE38ysXpwTrb!ALQmg;S(nb9Ug`IhoLJ0L479)=N{Shn$-V$1w*;y^{UBxuT9f{aRRgU&FRn-G7_3remR~X|rBb|xRe}`rfQ7&q z;90D#QUe?VTnn6wH9i~58qBJE+snBD_z3%K0bB(97i%Y6=I8eD->ZOjSX<*_&({j* zf;EmyPNh_e`D|$ZXJUW+8J=E?^=Pj2{Hw9=dSm(6e>2+_9e`~y%X1-C*^a_KPaR0N zKiXr@Vx^~dz$)4^d6ZwVbj02&{5SOgI$_`SYU~YbRp-6|SR0~q#<|v>w{By5bC=Zt z*a)*AU9g@>L$t#hl_z@o7GN&+z`Kxs0lWCQ`$&Jb4#yg@DgAB(Cg&(GApm2s_Chfk z23+UIU4h?`9-zvkD`u5?czPoC=>co#&L=&Nl2ByoJRofhIw~Gj>ZL1YNfJtrz6N>^ zv|sMLwfBq#9Z)=-5@JNVf>wc6gWBZIUwhvy&`Y37X`ojMIvlhDBzwSl-TQUWI?#c| z(Jdhc^fSL^lxuhRDt?~ zei=yiGu9hPXkzFxZ(wfi=@y_tfn*=#)}kQ?oP_d113{mIeq1E^Ro08q-Nlig5Exa1 zo&`M*syme)vYf-bH#4w!Wh4Yb=Yqblq3NQQ)57ONX5`MB5F_dX`V@3YiOM_LdpFyZ zro4naQ59%5=s)?*fJQ2_8uTjY_R^G>kS99DC%Z~KexQ@wTI9R@Frm0;GoKa@G!Bth z*{witf~J+e?1To;EPpT^Vk-X!-UZIb3p}BC=m;N3+BbLJEO$c-!SRA!JbjqbYcm=v zr48sEn|w=%8EtIy8POVgf+>P`1S5TZy#SvHorAggZ5BnBgvjVOpbtQsM3Mqs1s@4k z%N7$CBBed(ebCiWbV-Or?QG?tL8QUMZY9o&AZ477lSHbd2?e3{phf0L6F?g5;}v4A zV5tgTkfV;E3zIQc>s%&}V7KnQ}$lFh}8YB+ z9cONfTN7+g53&B<9tEO7*y5o>qRXl{G#!gx*EMcUu)wNIFpCiY-HWYUE8}^avO^>N zvr$fO)6E3iWxn(2x#P^3xHV}6^MGH46Q}*% zTI?E5W|ODZapoT-a-50EMZo){_Xi7r=9OV@D^4`leGTgFDqOC71M8aZ5>BKJaceOo zoXjSR`eExXFN#}}Jg5TRCg|4Fssg&)$v$}q=<3D znofp5&BtuE3@f*6 zQ8z50$1QPd5`ga5{^dd9Vx&rMVb1Y19(i z5B%wBTKUQmPh&nDaajOFv#y8=IQeVANsjQx$HNlQV526o}q#o!6LzPf~kJKz%T^r zfdy=7B5}SpK-;+EOwjm|9_)03aSlNj!JUF13LX+n_u!~o2%ZvbC%Dfa%AD z7Fa2!2<8ZG5wsJ0)yvu1&&z*@c}V90e*aQIguy6H@zLP6x$~A4YJqL{`~m?Zwg`6i zKlWPLoI~cdP5s(z!8pM>!59y|ew|-G+w+W1g;w@AxsXb6uiz3tK0(mk%h^OQ*3XX> zY?N{D9)3Q;>UnMM*7uCUWyFHc#2jY=`Y(cDvTVzRHG-eixt6LFhk1I5>V!|O`}y#5 zg;t7Do?aoiq)wjN&qtm6mdd=fBBGnHC6z@DkrXgSf_ej&1J^*+Q^BO#yuxT;25>)c zN{$BGx=>~3;7f8e90ffwpNsiK+7+Od3Babn(E()DOUS?((|`|w@d0ImZN$<8_#sK0a@7~@v$@%y3Hp(nnSjAL1#|U}@4`by$1^h^GQZ9K7 zQ?&^A9q?0%7$PZ9rO+|JzQD;)^;xdmdD0J<1w4(d<(vd;pK*OHFdJCr=_i5LFpKd8 zu&xRgVxN?4Njt@?^ZVY;Qsz3$fhLnxp8o?+KL)&xO^AKrzb^rkvBu@5z&pU-unDu_ zKnQ=-%YZF_BLc`O7PXEuH^r?<<)E3E7ks&fNYd}Ix&P+kIMW1Be{ax_j$4x~)UJd4 zZrqww9-4*iv0hHrLY*+jnVE5GQkm%Mm`lQep1v_&eE`tS*ajy(;?|^c(E~omG}tRh zoPHPD)0HS{e>ou=>H)eEv=`|RNe}qk$gte^7e}dfpw~dNNgQWlLc95p_hKy8=o+sa z?%J_GG9E$9St#$lC4236bfW}~c7O6@RcqM$}l(-#>(Ns>| zpbAI7z+4^$S{lQ%Q8mqX9YPaE(|s^&4doq3E}?X&8uTx>7LhmaO+Ew7f~qgE$+ks6 zkJIR;!f{@g&b~)#dQ*J2++>+bSJ%Dq9d>u_GV|JC6Jm{9|io6v}ITh z9ECZg48bZ#2S4tJ`8D3_dB5p;l*6VlO^FLgdxSNbW!S3egRnpPtJnsuA7keFJwLw~ z80^RIVtZ=!$2^giW8Oy-X_&)-m40098P@!fbaP6w%7(J!qzYJ!TbeZ0cwC_{aSsdY7@*=?l&3AF2mXtxXkx4OOkRm z8-`WRkyzVe0Z1zjlmAsTb^ncY>(~Bm1-^DgjJkRfK=q! z_b}hczF1{>6>Gd!I^!@u&Ec4}J;skG0@nk#0@tyAFqN0E7i%Q;(hmk6#|*-7EU;S@ zFs(6NQu%MTwFV2ZesOEe!U%Jk&Bh|&V$!beCt|htTb@1-t0e76dp#eC1qGRcRkr;x zi&W`6fxVE|0dp{C-o3CFdJ=FYW??gzSqgjE_VIsjVKKXgV=wiwSi5qk#<+>Uf_?9w zWW#loR{(P{)6)sK7JK;hv7EFw^(w5EcLsLE)-oLK$Cm&z{n`r8pSmxVu4Lw7R$xzT zSAp%ZPeTo64O#$gFe{w7H~d}L@`%=cEYGuov~{iqi`&$bbnm0J3m!tc*U$&+k)(PC znXwW&0J~Fv?<14`uE+pSKZ}h&^ukP973m(%#+ZA2YCG%Gu|{n&;AZWzg;>w<4Xkm# zHTIJI8SAmF!k$}ZL$eBa6V}^f^-QdjFcljfxV;4WZ@~G$Fa3B&;5n>@*JWpHF->X$ zZZ7scOt2UCZ0rI4l=QmQ!PuvEGWN2AeO5B}Q#};>jAuGXeGl7W^HN}|{{uRN>jVKs RksJU3002ovPDHLkV1nM&zrg?i literal 0 HcmV?d00001 diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst new file mode 100644 index 0000000000..f72dd9bc13 --- /dev/null +++ b/docs/proofs/elabReflection.rst @@ -0,0 +1,55 @@ +Extending Idris using Elaborator Reflection +=========================================== + +Idris provides a mechanism to modify the language without having to recompile Idris itself. We can think of this in terms of metaprogramming or domain specific languages or just building in new capabilities. + +In order to extend the language we need to know something about how Idris is complied. On this page we try to limit this explanation to only what we need to customise the elaboration. For more details of the compiler see `Edwin Brady 2013 paper`_ and for customising the elaboration process see `David Christiansen Practical Reflection and Metaprogramming`_ and `Elaborator reflection: extending Idris in Idris`_. For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs McBride 1999`_. + +Here is a diagram of the multistage process at the top level when Idris code gets compiled: + +.. image:: image/idrisTopLevel.png + :width: 484px + :height: 147px + +TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here we use the word 'tactics' to refer to these elaboration tactics - not to be confused with the old tactics mechanism. + +.. image:: image/compareToProofAssist.png + :width: 229px + :height: 114px + +This gives the opportunity to allow the primitives of the elaboration mechanism to be exposed to metaprograms. +During elaboration TT (Raw) structure contains: + +- holes - terms yet to be inferred. +- guesses - Suppresses β-reduction while precise structure not known. + +Type checker: + +- include universe levels +- distinguish between global and local bound names. + +.. image:: image/elabOverview.png + :width: 268px + :height: 219px + +As already mentioned the TT core language is kept syntactically very simple. Part of the reason for this is that its correctness is already well proven using logic. For instance, here are the binders in TT with corresponding code and logic type introduction rules: + +.. image:: image/binders.png + :width: 310px + :height: 203px + +.. list-table:: + + * - There is an elaborator for both definitions and terms, the definition elaborator calls the term elaborator when required. + - .. image:: image/elab.png + :width: 141px + :height: 145px + +.. target-notes:: +.. _`Edwin Brady 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf +.. _`David Christiansen Practical Reflection and Metaprogramming`: https://davidchristiansen.dk/david-christiansen-phd.pdf +.. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932 +.. _`Dependently Typed Functional Programs and their Proofs McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 + + + diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst new file mode 100644 index 0000000000..26a1ca3b9c --- /dev/null +++ b/docs/proofs/example1.rst @@ -0,0 +1,280 @@ +Example 1 +========= + +.. list-table:: Nat identity + + * - As an example of elaborator reflection here we step through this identity implementation: + - Nat identity. + + .. code-block:: idris + + %language ElabReflection + + idNat : Nat -> Nat + idNat = %runElab (do + intro `{{x}} + fill (Var `{{x}}) + solve + ) + +.. list-table:: Nat identity + + * - We start off with a hole for the whole term (of type Nat->Nat). + We fill that with 'intro' which creates a lambda term with a hole for the expression. + - diagram + + .. image:: image/tree.png + :width: 133px + :height: 106px + +After each tactic we will look at the state: + +.. list-table:: evolution of state + + * - We start with the type signature like this: + - Nat identity. + + .. code-block:: idris + + %language ElabReflection + + idNat : Nat -> Nat + idNat = %runElab (do + + * - In order to investigate how the program works we can look at the proofState at each stage as the tactics are applied. So here is the proofState at the start: + - state + + .. image:: image/elabProofStateEx1_1.png + :width: 310px + :height: 124px + + * - We can also look at the logic at each stage: + - logic + + .. image:: image/elabLogicEx1_1.png + :width: 126px + :height: 33px + + * - The term is: + - ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} + + * - getEnv + + getGoal + + getHoles + + - state. + + .. code-block:: idris + + getEnv=[] + + getGoal=({hole_2}, {TT:Bind + name=`{{__pi_arg}} + binder={ + Π ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}).{ + TT:TType tt=ext=./Prelude/Nat.idr#20 + } + } + tt={ + TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat","Prelude"]} + TT={TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + }) + + getHoles=[{hole_2},{hole_0}] + + * - getGuess + - error no guess + + * - Introduce a lambda binding around the current hole and focus on the body. + - intro \`{{x}} + + * - state now looks like this + - state + + .. image:: image/elabProofStateEx1_2.png + :width: 312px + :height: 124px + + * - logic now looks like this + - logic + + .. image:: image/elabLogicEx1_2.png + :width: 126px + :height: 45px + + * - term now looks like this + - ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} + + * - getEnv + + getGoal + + getHoles + + - state. + + .. code-block:: idris + + getEnv=[( + `{{x}}, { + λ ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}). + {TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + )] + + getGoal=({hole_2},{ + TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat", "Prelude"]} + TT={TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + ) + + getHoles=[{hole_2},{hole_0}] + + * - getGuess + - error no guess + + * - Place a term into a hole, unifying its type + - fill (Var \`{{x}}) + + * - state now looks like this + - state + + .. image:: image/elabProofStateEx1_3.png + :width: 312px + :height: 124px + + * - logic now looks like this + - logic + + .. image:: image/elabLogicEx1_3.png + :width: 131px + :height: 45px + + * - term + - ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} + + * - getEnv + + getGoal + + getHoles + + - state. + + .. code-block:: idris + + getEnv=[(`{{x}}, {λ ({`{{Nat}}.["Nat", "Prelude"]}: + {type const tag=8,0}). + {TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + )] + + getGoal=({hole_2}, + {TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat", "Prelude"]} + TT={TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + }) + + getHoles=[{hole_2}, {hole_0}] + + * - getGuess + - state. + + .. code-block:: idris + + {TT:Parameter name ref + NameType=NameType just bound by intro + TTName=`{{x}} + TT={TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat", "Prelude"]} + TT={TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + } + + * - Substitute a guess into a hole. + - solve + + * - logic now looks like this + - logic + + .. image:: image/elabLogicEx1_4.png + :width: 131px + :height: 14px + + * - term + - ?{hole_0} ≈ λ x . x . {hole_0} + + * - getEnv + + getGoal + + getHoles + + - state. + + .. code-block:: idris + + getEnv=[] + + getGoal=({hole_0}, {TT:Bind + name=`{{__pi_arg}} + binder={ + Π ({`{{Nat}}.["Nat", "Prelude"]}: + {type const tag=8,0}).{TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + tt={TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat","Prelude"]} + TT={TT:TType tt=ext=./Prelude/Nat.idr#20} + } + }) + + getHoles=[{hole_0}] + + * - getGuess + - state. + + .. code-block:: idris + + {TT:Bind + name=`{{x}} + binder={λ ({`{{Nat}}.["Nat","Prelude"]}:{type const tag=8,0}).{ + TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + tt={TT:Parameter name ref + NameType=NameType just bound by intro + TTName=`{{x}} + TT={TT:Parameter name ref + NameType={type const tag=8,0} + TTName={`{{Nat}}.["Nat", "Prelude"]} + TT={TT:TType + tt=ext=./Prelude/Nat.idr#20 + } + } + } + } diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst new file mode 100644 index 0000000000..fe9d390bb5 --- /dev/null +++ b/docs/proofs/generatingData.rst @@ -0,0 +1,301 @@ +Generating Data and Functions at Compile Time +============================================= + +We can construct a data structure at compile-time in an Elab monad. +This can allow proofs to be generated for user defined types or it could allow types to be automatically generated to support user defined types. +An example is the code, from Christensen-Brady joint paper ('Elaborator Reflection: Extending Idris in Idris'), that automatically generates accessibility predicates using the Bove-Capretta method. +The following simple outline example is adapted from +``_ + +.. code-block:: idris + + module DataDef + %language ElabReflection + + addData : Elab () + addData = do + let dataname : TTName = `{{DataDef.N}} + declareDatatype $ Declare dataname [MkFunArg `{{n}} `(Nat) Explicit NotErased] `(Type) + defineDatatype $ DefineDatatype dataname [ + Constructor `{{MkN}} [MkFunArg `{{x}} `(Nat) Implicit NotErased] + (RApp (Var `{{DataDef.N}}) (Var `{{x}})), + Constructor `{{MkN'}} [MkFunArg `{{x}} `(Nat) Explicit NotErased] + (RApp (Var `{{DataDef.N}}) (RApp (Var `{S}) (Var `{{x}}))) + ] + + %runElab addData + +So this declares and defines the following data structure 'N' with a constructor 'MkN' which can have an implicit or an explicit Nat argument. + +.. code-block:: idris + + data N : Nat -> Type where + MkN : N x + MkN' : (x : Nat) -> N (S x) + +Which can be used like this: + +.. code-block:: idris + + λΠ> :t N + N : Nat -> Type + λΠ> N 2 + N 2 : Type + λΠ> N 0 + N 0 : Type + λΠ> :t MkN + MkN : N x + +Here is another, more complicated, example from the same test file. This also creates a function. + +.. code-block:: idris + + module DataDef + %language ElabReflection + + mkU : Elab () + mkU = do + let U = `{{DataDef.U}} + let el = `{{DataDef.el}} + declareDatatype $ Declare U [] `(Type) + declareType $ Declare el [MkFunArg `{{code}} (Var U) Explicit NotErased] `(Type) + defineDatatype $ DefineDatatype U [ + Constructor `{{Base}} [] (Var U), + Constructor `{{Pi}} + [MkFunArg `{{code}} (Var U) Explicit NotErased, + MkFunArg `{{body}} `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U)) Explicit NotErased] + (Var U) + ] + defineFunction $ DefineFun el [ + MkFunClause (RBind `{{code}} (PVar (Var U)) + (RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U))) + (RApp (Var el) + (RApp (RApp (Var `{{DataDef.Pi}}) + (Var `{{code}})) + (Var `{{body}}))))) + (RBind `{{code}} (PVar (Var U)) + (RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U))) + (RBind `{{x}} (Pi (RApp (Var el) (Var `{{code}})) `(Type)) + (RApp (Var el) (RApp (Var `{{body}}) (Var `{{x}})))))), + MkFunClause (RApp (Var el) (Var `{{DataDef.Base}})) `(Bool) + ] + + %runElab mkU + +This code generates the following data and function: + +.. code-block:: idris + +data U : Type where + Base : U + Pi : (code : U) -> (el code -> U) -> U + el : U -> Type + el (Pi code body) = (x : el code) -> el (body x) + el Base = Bool + +Which can be used like this: + +.. code-block:: idris + + λΠ> :t U + U : Type + λΠ> :doc U + No documentation for U + λΠ> Base + Base : U + λΠ> DataDef.Pi + Pi : (code : U) -> (el code -> U) -> U + + +.. code-block:: idris + + λΠ> :t el + el : U -> Type + λΠ> el Base + Bool : Type + +So these are the functions that we can use to create data and functions in the Elab monad: + +.. list-table:: Generating Data and Functions + :widths: 10 30 + :stub-columns: 1 + + * - declareType + - Add a type declaration to the global context. + + Signature: + + declareType : TyDecl -> Elab () + * - defineFunction + - Define a function in the global context. The function must have already been declared, either in ordinary Idris code or using `declareType`. + + Signature: + + defineFunction : FunDefn Raw -> Elab () + + * - declareDatatype + - Declare a datatype in the global context. This step only establishes the type constructor; use `defineDatatype` to give it constructors. + + Signature: + + declareDatatype : TyDecl -> Elab () + + * - defineDatatype + - Signature: + + defineDatatype : DataDefn -> Elab () + + * - addImplementation + - Register a new implementation for interface resolution. + + - @ ifaceName the name of the interface for which an implementation is being registered + - @ implName the name of the definition to use in implementation search + + Signature: + + addImplementation : (ifaceName, implName : TTName) -> Elab () + + * - isTCName + - Determine whether a name denotes an interface. + + @ name a name that might denote an interface. + + Signature: + + isTCName : (name : TTName) -> Elab Bool + +The above functions use the following data/records: + +.. list-table:: Generating Data and Functions data/records + :widths: 10 30 + :stub-columns: 1 + + * - Plicity + - How an argument is provided in high-level Idris + + .. code-block:: idris + + data Plicity= + ||| The argument is directly provided at the application site + Explicit | + ||| The argument is found by Idris at the application site + Implicit | + ||| The argument is solved using interface resolution + Constraint + + * - FunArg + - Function arguments + + These are the simplest representation of argument lists, and are used for functions. Additionally, because a FunArg provides enough + information to build an application, a generic type lookup of a top-level identifier will return its FunArgs, if applicable. + + .. code-block:: idris + + record FunArg where + constructor MkFunArg + name : TTName + type : Raw + plicity : Plicity + erasure : Erasure + + * - TyConArg + - Type constructor arguments + + Each argument is identified as being either a parameter that is + + consistent in all constructors, or an index that varies based on + + which constructor is selected. + + .. code-block:: idris + + data TyConArg = + ||| Parameters are uniform across the constructors + TyConParameter FunArg | + ||| Indices are not uniform + TyConIndex FunArg + + * - TyDecl + - A type declaration for a function or datatype + + .. code-block:: idris + + record TyDecl where + constructor Declare + ||| The fully-qualified name of the function or datatype being declared. + name : TTName + ||| Each argument is in the scope of the names of previous arguments. + arguments : List FunArg + ||| The return type is in the scope of all the argument names. + returnType : Raw + + * - FunClause + - A single pattern-matching clause + + .. code-block:: idris + + data FunClause : Type -> Type where + MkFunClause : (lhs, rhs : a) -> FunClause a + MkImpossibleClause : (lhs : a) -> FunClause a + + * - FunDefn + - A reflected function definition. + + .. code-block:: idris + + record FunDefn a where + constructor DefineFun + name : TTName + clauses : List (FunClause a) + + * - ConstructorDefn + - A constructor to be associated with a new datatype. + + .. code-block:: idris + + record ConstructorDefn where + constructor Constructor + ||| The name of the constructor. The name must _not_ be qualified - + ||| that is, it should begin with the `UN` or `MN` constructors. + name : TTName + ||| The constructor arguments. Idris will infer which arguments are + ||| datatype parameters. + arguments : List FunArg + ||| The specific type constructed by the constructor. + returnType : Raw + + * - DataDefn + - A definition of a datatype to be added during an elaboration script. + + .. code-block:: idris + + record DataDefn where + constructor DefineDatatype + ||| The name of the datatype being defined. It must be + ||| fully-qualified, and it must have been previously declared as a + ||| datatype. + name : TTName + + * - CtorArg + - CtorParameter + + .. code-block:: idris + + data CtorArg = CtorParameter FunArg | CtorField FunArg + + * - Datatype + - A reflected datatype definition + + .. code-block:: idris + + record Datatype where + constructor MkDatatype + ||| The name of the type constructor + name : TTName + ||| The arguments to the type constructor + tyConArgs : List TyConArg + ||| The result of the type constructor + tyConRes : Raw + ||| The constructors for the family + constructors : List (TTName, List CtorArg, Raw) + diff --git a/docs/proofs/primative.rst b/docs/proofs/primative.rst new file mode 100644 index 0000000000..56a7c4dc65 --- /dev/null +++ b/docs/proofs/primative.rst @@ -0,0 +1,517 @@ +Primitive Operators +=================== + +.. list-table:: Primitive Operators + :widths: 10 30 + :stub-columns: 1 + + * - gensym + - Generate a unique name based on some hint. + + Useful when establishing a new binder. + + **NB**: the generated name is unique **for this run of the elaborator**. + + Do not assume that they are globally unique. + + Signature: + + gensym : (hint : String) -> Elab TTName + + * - solve + - Substitute a guess into a hole. + + Substitute the focused guess throughout its scope, eliminating it and moving focus to the next element of the hole queue. Fail if the focus is not a guess. + + Signature: + + solve : Elab () + + * - fill + - Place a term into a hole, unifying its type. Fails if the focus is not a hole. + + Signature: + + fill : (e : Raw) -> Elab () + + Place a term e with type tc into the focused hole: + + ?h : th.e' + + and convert it to a guess: + + ?h ≈ e:t.e' + + and fail if the current focus is not a hole. The type t of the guess is constructed by unifying tc and th, which may instantiate holes that they refer to. Fail if the current focus is not a hole or if unification fails. + + This unification can result in the solution of further holes or the establishment of additional unsolved unification constraints. + + * - apply + - Attempt to apply an operator to fill the current hole, potentially solving arguments by unification. + + A hole is established for each argument. + + The return value is the list of holes established for the arguments to the function. + + Note that not all of the returned hole names still exist, as they may have been solved. + + - @ op the term to apply + - @ argSpec - A list of booleans, one for each argument that the operator will be applied to. If true then attempt to solve the argument by unification. + + Signature: + + apply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName) + + Example: elaborating an application of a function f that takes one implicit and two explicit arguments might invoke: + + apply \`(f) [False, True, True] + + Here is an example of an elab script that uses apply to insert the term plus Z (S Z) into a goal of type Nat. + + .. code-block:: idris + + do [x,y] <- apply `(plus) [False, False] + solve + focus x; fill `(Z); solve + focus y; fill `(S Z); solve + + The names of the established holes are returned. + + Note: This was added to the original tactic language to allow elaborator reflection. + + * - matchApply + - Attempt to apply an operator to fill the current hole, potentially solving arguments by matching. + + The return value is the list of holes established for the arguments to the function. + + Note that not all of the returned hole names still exist, as they may have been solved. + + - @ op the term to apply + - @ argSpec instructions for finding the arguments to the term, where the Boolean states whether or not to attempt to solve the argument by matching. + + Signature: + + matchApply : (op : Raw) -> (argSpec : List Bool) -> Elab (List TTName) + + * - focus + - Move the focus to the specified hole, bringing it to the front of the hole queue. Fails if the hole does not exist. + + @ hole the hole to focus on + + Signature: + + focus : (hole : TTName) -> Elab () + + * - unfocus + - Send the currently-focused hole to the end of the hole queue and focus on the next hole. + + Signature: + + unfocus : TTName -> Elab () + + * - attack + - Convert a hole to make it suitable for bindings - that is, transform it such that it has the form + + `?h : t . h` as opposed to `?h : t . f h`. + + The binding tactics require that a hole be directly under its binding, or else the scopes of the generated terms won't make sense. This tactic creates a new hole of the proper form, and points the old hole at it. + + Signature: + + attack : Elab () + + * - claim + - Establish a new hole binding named n with type t, surrounding the current focus. + + Introduce a new hole with a specified name and type. + + The new hole will be focused, and the previously-focused hole will be immediately after it in the hole queue. Because this tactic introduces a new binding, you may need to 'attack' first. + + Signature: + + claim : TTName -> Raw -> Elab () + + * - patvar + - Convert a hole into a pattern variable. + + Signature: + + patvar : TTName -> Elab () + + * - compute + - Normalise the goal. + + Often this is not necessary because normanisation is applied during other tactics. + + Signature: + + compute : Elab () + + * - normalise + - Normalise a term in some lexical environment + + - @ env the environment in which to compute (get one of these from `getEnv`) + - @ term the term to normalise + + Signature: + + normalise : (env : List (TTName, Binder TT)) -> (term : TT) -> Elab TT + + * - whnf + - Reduce a closed term to weak-head normal form + + @ term the term to reduce + + Signature: + + whnf : (term : TT) -> Elab TT + + * - convertsInEnv + - Check that two terms are convertible in the current context and in some environment. + + - @ env a lexical environment to compare the terms in (see `getEnv`) + - @ term1 the first term to convert + - @ term2 the second term to convert + + Signature: + + convertsInEnv : (env : List (TTName, Binder TT)) -> (term1, term2 : TT) -> Elab () + + * - converts + - Check that two terms are convertable in the current context and environment + + - @ term1 the first term to convert + - @ term2 the second term to convertconverts : (term1, term2 : TT) -> Elab () + + converts term1 term2 = convertsInEnv !getEnv term1 term2 + + * - getSourceLocation + - Find the source context for the elaboration script + + Signature: + + getSourceLocation : Elab SourceLocation + + * - sourceLocation + - Attempt to solve the current goal with the source code + + locationsourceLocation : Elab () + + .. code-block:: idris + + sourceLocation = do loc <- getSourceLocation + fill (quote loc) + solve + + * - currentNamespace + - Get the current namespace at the point of tactic execution. This allows scripts to define top-level names conveniently. + + The namespace is represented as a reverse-order list of strings, just as in the representation of names. + + Signature: + + currentNamespace : Elab (List String) + + * - rewriteWith + - Attempt to rewrite the goal using an equality. + + The tactic searches the goal for applicable subterms, and constructs a context for `replace` using them. In some cases, this is not possible, and `replace` must be called manually with an appropriate context. + + Because this tactic internally introduces a `let` binding, it requires that the hole be immediately under its binder (use 'attack' if it might not be). + + Signature: + + rewriteWith : Raw -> Elab () + + * - resolveTC + - Attempt to solve the current goal with an interface dictionary + + @ fn the name of the definition being elaborated (to prevent Idris from looping) + + Signature: + + resolveTC : (fn : TTName) -> Elab () + + * - search + - Use Idris's internal proof search. + + Signature: + + search : Elab () + + * - search' + - Use Idris's internal proof search, with more control. + + - @ depth the search depth + - @ hints additional names to try + + Signature: + + search' : (depth : Int) -> (hints : List TTName) -> Elab () + + * - operatorFixity + - Look up the declared fixity for an operator. + + The lookup fails if the operator does not yet have a fixity or if the string is not a valid operator. + + @ operator the operator string to look up + + Signature: + + operatorFixity : (operator : String) -> Elab Fixity + + * - debug + - Halt elaboration, dumping the internal state for inspection. + + This is intended for elaboration script developers, not for end-users. Use `fail` for final scripts. + + Signature: + + debug : Elab a + + Only seems to compile if 'debug' is last tactic so comment out following tactics like this: + + .. code-block:: idris + + %language ElabReflection + + idNat : Nat -> Nat + idNat = %runElab (do + intro `{{x}} + debug + -- fill (Var `{{x}}) + -- solve + ) + + * - debugMessage + - Halt elaboration, dumping the internal state and displaying a message. + + This is intended for elaboration script developers, not for end-users. Use `fail` for final scripts. + + @ msg the message to display + + Signature: + + debugMessage : (msg : List ErrorReportPart) -> Elab a + + Only seems to compile if 'debug' is last tactic so comment out following tactics like this: + + .. code-block:: idris + + %language ElabReflection + idNat : Nat -> Nat + idNat = %runElab (do + intro `{{x}} + debugMessage [TextPart "error message"] + -- fill (Var `{{x}}) + -- solve + ) + + * - metavar + - Create a new top-level metavariable to solve the current hole. + + @ name the name for the top-level variable + + Signature: + + metavar : (name : TTName) -> Elab () + + * - runElab + - Recursively invoke the reflected elaborator with some goal. + + The result is the final term and its type. + + Signature: + + runElab : Raw -> Elab () -> Elab (TT, TT) + + +Read and Write State +==================== + +.. list-table:: Read and Write State + :widths: 10 30 + :stub-columns: 1 + + * - getEnv + - Look up the lexical binding at the focused hole. Fails if no holes are present. + + Signature: + + getEnv : Elab (List (TTName, Binder TT)) + + * - getGoal + - Get the name and type of the focused hole. Fails if not holes are present. + + Signature: + + getGoal : Elab (TTName, TT) + + * - getHoles + - Get the hole queue, in order. + + Signature: + + getHoles : Elab (List TTName) + + * - getGuess + - If the current hole contains a guess, return it. Otherwise, fail. + + Signature: + + getGuess : Elab TT + + * - lookupTy + - Look up the types of every overloading of a name. + + Signature: + + lookupTy : TTName -> Elab (List (TTName, NameType, TT)) + + * - lookupTyExact + - Get the type of a fully-qualified name. Fail if it doesn't resolve uniquely. + + Signature: + + lookupTyExact : TTName -> Elab (TTName, NameType, TT) + + .. code-block:: idris + + lookupTyExact n = case !(lookupTy n) of + [res] => pure res + [] => fail [NamePart n, TextPart "is not defined."] + xs => fail [NamePart n, TextPart "is ambiguous."] + + * - lookupDatatype + - Find the reflected representation of all datatypes whose names are overloadings of some name. + + Signature: + + lookupDatatype : TTName -> Elab (List Datatype) + + * - lookupDatatypeExact + - Find the reflected representation of a datatype, given its fully-qualified name. Fail if the name does not uniquely resolve to a datatype. + + Signature: + + lookupDatatypeExact : TTName -> Elab Datatype + + .. code-block:: idris + + lookupDatatypeExact n = case !(lookupDatatype n) of + [res] => pure res + [] => fail [TextPart + "No datatype named", NamePart n] + xs => fail [TextPart "More than one datatype named", + NamePart n] + + * - lookupFunDefn + - Find the reflected function definition of all functions whose names are overloadings of some name. + + Signature: + + lookupFunDefn : TTName -> Elab (List (FunDefn TT)) + + * - lookupFunDefnExact + - Find the reflected function definition of a function, given its fully-qualified name. Fail if the name does not uniquely resolve to a function. + + Signature: + + lookupFunDefnExact : TTName -> Elab (FunDefn TT) + + .. code-block:: idris + + lookupFunDefnExact n = case !(lookupFunDefn n) of + [res] => pure res + [] => fail [TextPart + "No function named", NamePart n] + xs => fail [TextPart "More than one function named", + NamePart n] + * - lookupArgs + - Get the argument specification for each overloading of a name. + + Signature: + + lookupArgs : TTName -> Elab (List (TTName, List FunArg, Raw)) + + * - lookupArgsExact + - Get the argument specification for a name. Fail if the name does not uniquely resolve. + + Signature: + + lookupArgsExact : TTName -> Elab (TTName, List FunArg, Raw) + + .. code-block:: idris + + lookupArgsExact n = case !(lookupArgs n) of + [res] => pure res + [] => fail [NamePart n, TextPart "is not defined."] + xs => fail [NamePart n, TextPart "is ambiguous."] + + * - check + - Attempt to type-check a term, getting back itself and its type. + + - @ env the environment within which to check the type + - @ tm the term to check + + Signature: + + check : (env : List (TTName, Binder TT)) -> (tm : Raw) -> Elab (TT, TT) + +Error Handling +============== + +.. list-table:: Error Handling + :widths: 10 30 + :stub-columns: 1 + + * - tryCatch + - `tryCatch t (\err => t')` will run `t`, and if it fails, roll back the elaboration state and run `t'`, + but with access to the knowledge of why `t` failed. + + Signature: + + tryCatch : Elab a -> (Err -> Elab a) -> Elab a + + Fixme - following does not work. + + .. code-block:: idris + + %language ElabReflection + + id1 : Elab () + id1 = do + tryCatch (intro `{{x}}) + (\err -> (intro `{{x}})) + fill (Var `{{x}}) + solve + + idNat : Nat -> Nat + idNat = %runElab id1 + + * - fail + - Halt elaboration with an error + + Signature: + + fail : List ErrorReportPart -> Elab a + + Return type is given by last term so fail cant be at the the last term, we would expect fail to be in some sort of conditional statement: + + .. code-block:: idris + + %language ElabReflection + + id1 : Elab () + id1 = do + intro `{{x}} + fill (Var `{{x}}) + if True + then + fail [TextPart "error message"] + else + solve + + idNat : Nat -> Nat + idNat = %runElab id1 + diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst new file mode 100644 index 0000000000..38441c4ffb --- /dev/null +++ b/docs/proofs/tactics.rst @@ -0,0 +1,431 @@ +Elaborator Reflection - Tactics +=============================== + +The Idris part of the code for elaborator reflection is in +Elab.idr ``_ +Before we look at the Elab monad we need to know how to construct terms. + +Proof State +=========== + +Tactics operate on the proof state. The proof state contains various pieces of information, at this stage, the important ones for us are: + +- A hole queue - This contains a list of the names of the holes used in the proof term. The solution to each hole may depend on the other holes. +- A goal type - The type of the term that is under construction for the current goal. +- A possibly incomplete proof term, which is being calculated and should be the goal type at the end of elaboration. +- Context - A collection of open unification problems, representing recoverable failures of unification that may yet unify once more variables are solved. + +There are many other pieces of information in the proof state such as the names used , such as the bodies of case blocks that need to be elaborated.but, for now, we will leave the system to handle these. + +.. image:: image/elabProofState.png + :width: 283px + :height: 232px + +Names TTName +------------ + +Names in an Idris program are evaluated at runtime but sometimes we need a 'variable name' which can be referred to as an unevaluated symbol. +The names used in terms have different constructors depending on their type: + ++---------------------------+-----------------------------------------------+ +| UN String | A user-provided name | ++---------------------------+-----------------------------------------------+ +| NS (UN "foo") ["B", "A"]) | A name in some namespace | ++---------------------------+-----------------------------------------------+ +| MN Int String | Machine-chosen names | ++---------------------------+-----------------------------------------------+ +| SN SpecialName | Special names, to make conflicts impossible | +| | and language features predictable | ++---------------------------+-----------------------------------------------+ + + +A user defined name can be constructed like this: + +.. code-block:: idris + + Idris> UN "x" + UN "x" : TTName + +.. code-block:: idris + + Idris> NS (UN "x") ["b","a"] + NS (UN "x") ["b", "a"] : TTName + +.. list-table:: machine-chosen names + + * - A machine-chosen name needs to be generated within an Elab monad (see below for details) and is unique within that monad. This produced: {abc_140}{abc_141} so although gensym "abc" was called twice each one had a different integer: + - example of unique names: + + .. code-block:: idris + + implementation Show TTName where + show (UN s) = "`{{"++s++"}}" + show (NS t a) = "{"++(show t)++ + "."++(show a)++"}" + show (MN i s) = "{"++s++"_"++(show i)++"}" + show (SN sn) = "TTName special name" + + showGensym : String + showGensym = %runElab (do + debugMessage [TextPart ( + show !(gensym "abc") ++ + show !(gensym "abc") + )] + ) + +Quasiquotation +============== + +Since names are used frequently in elaborator reflection there is a shortcut for constructing them: + +.. list-table:: Quasiquotation + + * - An unresolved variable "x" is wrapped in backtick and double braces: + - example + + .. code-block:: idris + + Idris> `{{x}} + UN "x" : TTName + + + * - Single braces are used for existing variables: + - example + + .. code-block:: idris + + Idris> `{x} + No such variable x + Idris> :let x=2 + Idris> `{x} + UN "x" : TTName + + + * - brackets are used for an expression: + - example here type is inferable + + .. code-block:: idris + + Idris> :let a=2 + Idris> `(a) + P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT + + + * - Expression with explicit type: + - example + + .. code-block:: idris + + Idris> `(a:Integer) + P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT + + + * - If we want the vale we can escape from quasiquotation by using anti-quotation (tilde) + - example + + .. code-block:: idris + + Idris> `(~a) + 2 : Integer + +quasiquotation summary: + ++------------+-----------+----------------------------------------------------------+ +| |Reification| | ++============+===========+==========================================================+ +| \`{{n}} | TTName | Use for new names. Unresolved quotation of the name n. | ++------------+-----------+----------------------------------------------------------+ +| \`{n} | TTName | Use for existing names. Resolved quotation of the name | +| | | n. n is a reference to a unique name in scope. | ++------------+-----------+----------------------------------------------------------+ +| \`(e) | | expression e for which a type is inferable. | ++------------+-----------+----------------------------------------------------------+ +| \`(e:t) | | expression e with a given type e. | ++------------+-----------+----------------------------------------------------------+ +| ~a | | anti-quotation - sub region which can be evaluated rather| +| | | than quoted. | ++------------+-----------+----------------------------------------------------------+ +|(Var\`{{x}})| Raw | | ++------------+-----------+----------------------------------------------------------+ + +TT +== + +There is a notation for a term in TT as it is being constructed (based on a BNF-like grammar), this is used for example in the debug output, it is a compact way to see the state of the term so we use it here. +So internally the program is stored as a tree structure using the following syntax: + ++------------+-------+-------------+---------------------------------------------+ +| | | Syntax | More Information | ++============+=======+=============+=============================================+ +| term | | t | | ++------------+-------+-------------+---------------------------------------------+ +| binding | | b | | ++------------+-------+-------------+---------------------------------------------+ +| constant | t ::= | c | | ++------------+-------+-------------+---------------------------------------------+ +| variable | t ::= | x | | ++------------+-------+-------------+---------------------------------------------+ +| variable | t ::= | b.t | so a dot '.' tells us this is some sort of | +| binding | | | binding. | ++------------+-------+-------------+---------------------------------------------+ +| application| t ::= | t t | As with Idris, juxtaposition indicates | +| | | | function application. Note: we use the same | +| | | | symbol 't' for terms | ++------------+-------+-------------+---------------------------------------------+ +| Type | t ::= | T | | +| constructor| | | | ++------------+-------+-------------+---------------------------------------------+ +| Data | t ::= | C | | +| constructor| | | | ++------------+-------+-------------+---------------------------------------------+ +| function | b::= | λ c:t | colon ':' separates parameters from body of | +| | | | binding. | ++------------+-------+-------------+---------------------------------------------+ +| let binding| b::= | let\|-> t:t | | ++------------+-------+-------------+---------------------------------------------+ +| function | b::= | ∀ x:t | | ++------------+-------+-------------+---------------------------------------------+ +| Type | c::= | \*i | The universe hierarchy is usually handled | +| universe | | | automatically so we can just use\* for the | +| | | | type of types. | ++------------+-------+-------------+---------------------------------------------+ +| integer | c:== | i | | +| literal | | | | ++------------+-------+-------------+---------------------------------------------+ +|integer type| c:== | Integer | | ++------------+-------+-------------+---------------------------------------------+ +| string | c:== | s | | +| literal | | | | ++------------+-------+-------------+---------------------------------------------+ +| string type| c:== | String | | ++------------+-------+-------------+---------------------------------------------+ +|focused hole| | ?x : t | Conor McBride 1999 thesis. | ++------------+-------+-------------+---------------------------------------------+ +| guess | | ?x ≈ t : t | Conor McBride 1999 thesis. | ++------------+-------+-------------+---------------------------------------------+ + +Sometimes the part of the term in focus is underlined. + +Reflection of the well typed core language + +.. code-block:: idris + + data TT = + ||| A reference to some name (P for Parameter) + P NameType TTName TT | + ||| de Bruijn variables + V Int | + ||| Bind a variable + Bind TTName (Binder TT) TT | + ||| Apply one term to another + App TT TT | + ||| Embed a constant + TConst Const | + ||| Erased terms + Erased | + ||| The type of types along (with universe constraints) + TType TTUExp | + ||| Alternative universes for dealing with uniqueness + UType Universe | + +TT stores local bound variables using De Bruijn index, when working in Idris this does not concern the user because string names are used for variables. Converting bound variables internally to index values means that the same variable name can be used, in different lambda terms, without ambiguity and without the need for α-substitution. +De Bruijn index which is a integer where: + +- 0=inside current (inner) lambda term +- 1= next outer lambda term +- 2= next outer and so on + +Raw +--- +Raw is similar to TT except it is used before types are known. The types should be resolved by the type checker. + +.. code-block:: idris + + data Raw = + ||| Variables, global or local + Var TTName | + ||| Bind a variable + RBind TTName (Binder Raw) Raw | + ||| Application + RApp Raw Raw | + ||| The type of types + RType | + ||| Alternative universes for dealing with uniqueness + RUType Universe | + ||| Embed a constant + RConstant Const | + +Expression Syntax +================= + +There is a way of notating expressions such as those used in the proof state (example: goal type and proof terms) which is reasonably standard in the papers written about this subject. + +This notation is not entered directly by metaprogrammers but it is seen, for example in debug output. So this notation is explained here because it is useful to be familiar with it. + +The notation assumes right-associativity, in the absence of brackets, the term to the right binds more tightly than the one on the left. +So, for nested lambda terms: + ++---------------+--------+-------------------+ +| λ a . λ b . f | means | λ a .( λ b . f) | ++---------------+--------+-------------------+ + +and the same for function application: + ++---------------+--------+-------------------+ +| f g x | means | f (g x) | ++---------------+--------+-------------------+ + +In contrast, in lambda calculus, function application is usually regarded as left-associative, +Here are some typical examples of the notation used for expressions: + ++-----------------------+ +| ? {hole_0} . {hole_0} | ++-----------------------+ + +The term, to be derived, may start off in this state following something like this: + +.. code-block:: idris + + myScript : Elab () + myScript= do + +The dot '.' tells us this is some sort of binding. + ++----------------------------------------------+ +| ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} | ++----------------------------------------------+ + +This is a slightly more complicated example arising from: + +.. code-block:: idris + + idNat : Nat -> Nat + idNat = %runElab (do + +This introduces a guess that hole_0 = hole_2 . + ++----------------------------------------------------+ +| ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} | ++----------------------------------------------------+ + +Following on from the previous example a lambda function is introduced like this: + +.. code-block:: idris + + intro `{{x}} + +So now the expression is wrapped in a lambda binding. + ++-------------------------------------------------------+ +| ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} | ++-------------------------------------------------------+ + +Following on, we can use the fill tactic like this: + +.. code-block:: idris + + fill (Var `{{x}}) + +which introduces another guess. + ++--------------------------------+ +| ?{hole_0} ≈ λ x . x . {hole_0} | ++--------------------------------+ + +The solve tactic completes the proof + +Binders +======= + +Here we look at each tactic in turn to see how they affect the proof state. + +Introduction tactics for binders. The binder types are: + +- lambda function (intro) +- dependent function (forall) +- let (letBind) +- pattern (patbind) + +A precondition of these tactics is that the focused hole is of the form: + ++-----------+ +| ?h : t.h | ++-----------+ + +that is, that the body of its scope consists directly of a reference to the hole-bound variable. If a hole binder were of the form: + ++--------------------+ +| ?h : t1 -> t2.f h | ++--------------------+ + +and a tactic such as + ++------------------+ +| intro \`{{x}} | ++------------------+ + +were applied, the result would be the term + ++---------------------------+ +| ?h : t2 . λ x:t1. f h | ++---------------------------+ + +However this would cause the application of f to be ill-typed, as it expects an argument of type t1->t2, not an argument of type t2. Additionally, some binding tactics require that t, the type of the hole h, have a specific form, because the binder to be established may have a typing rule associated with it. + +.. list-table:: Binders + :widths: 10 30 + :stub-columns: 1 + + * - intro + - Introduce a lambda binding around the current hole and focus on the body. + + Requires that the hole be in binding form (use 'attack' if it might not be). + + @ n the name to use for the argument. + + Signature: + + intro : (n : TTName) -> Elab () + + Result + + λn:t1.?h:[n/x]t2.h + + * - intro' + - Introduce a lambda binding around the current hole and focus on the body, using the name provided by the type of the hole. + + Requires that the hole be immediately under its binder (use 'attack' if it might not be). + + Signature: + + intro' : Elab () + + * - forall + - Introduce a dependent function type binding into the current hole, and focus on the body. Requires that the hole be immediately under its binder + + (use 'attack' if it might not be). + + Signature: + + forall : TTName -> Raw -> Elab () + + * - patbind + - Introduce a new pattern binding. Requires that the hole be immediately under its binder (use 'attack' if it might not be). + + Signature: + + patbind : TTName -> Elab () + + * - letbind + - Introduce a new let binding. + + Requires that the hole be immediately under its binder (use 'attack' if it might not be). + + - @ n the name to let bind + - @ ty the type of the term to be let-bound + - @ tm the term to be bound + + Signature: + + letbind : (n : TTName) -> (ty, tm : Raw) -> Elab () + From cd58dfbb4bc281b0c31c2219a66dc3da7c686352 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 8 May 2019 16:24:38 +0100 Subject: [PATCH 02/45] add documentation for elaboration reflection --- docs/proofs/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/proofs/index.rst b/docs/proofs/index.rst index 9123651cc5..dd6ffbb0ae 100644 --- a/docs/proofs/index.rst +++ b/docs/proofs/index.rst @@ -25,4 +25,9 @@ A tutorial on theorem proving in Idris. propositional interactive interactiveOld + elabReflection + tactics + example1 + primative + generatingData From b6fde49227ad6bfd56aa1ec259380d8db4f7e9a4 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 8 May 2019 16:44:47 +0100 Subject: [PATCH 03/45] fix image paths --- docs/proofs/elabReflection.rst | 10 +++++----- docs/proofs/example1.rst | 16 ++++++++-------- docs/proofs/tactics.rst | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index f72dd9bc13..87a40d4c89 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -7,13 +7,13 @@ In order to extend the language we need to know something about how Idris is com Here is a diagram of the multistage process at the top level when Idris code gets compiled: -.. image:: image/idrisTopLevel.png +.. image:: ../image/idrisTopLevel.png :width: 484px :height: 147px TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here we use the word 'tactics' to refer to these elaboration tactics - not to be confused with the old tactics mechanism. -.. image:: image/compareToProofAssist.png +.. image:: ../image/compareToProofAssist.png :width: 229px :height: 114px @@ -28,20 +28,20 @@ Type checker: - include universe levels - distinguish between global and local bound names. -.. image:: image/elabOverview.png +.. image:: ../image/elabOverview.png :width: 268px :height: 219px As already mentioned the TT core language is kept syntactically very simple. Part of the reason for this is that its correctness is already well proven using logic. For instance, here are the binders in TT with corresponding code and logic type introduction rules: -.. image:: image/binders.png +.. image:: ../image/binders.png :width: 310px :height: 203px .. list-table:: * - There is an elaborator for both definitions and terms, the definition elaborator calls the term elaborator when required. - - .. image:: image/elab.png + - .. image:: ../image/elab.png :width: 141px :height: 145px diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 26a1ca3b9c..c05f064683 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -23,7 +23,7 @@ Example 1 We fill that with 'intro' which creates a lambda term with a hole for the expression. - diagram - .. image:: image/tree.png + .. image:: ../image/tree.png :width: 133px :height: 106px @@ -44,14 +44,14 @@ After each tactic we will look at the state: * - In order to investigate how the program works we can look at the proofState at each stage as the tactics are applied. So here is the proofState at the start: - state - .. image:: image/elabProofStateEx1_1.png + .. image:: ../image/elabProofStateEx1_1.png :width: 310px :height: 124px * - We can also look at the logic at each stage: - logic - .. image:: image/elabLogicEx1_1.png + .. image:: ../image/elabLogicEx1_1.png :width: 126px :height: 33px @@ -98,14 +98,14 @@ After each tactic we will look at the state: * - state now looks like this - state - .. image:: image/elabProofStateEx1_2.png + .. image:: ../image/elabProofStateEx1_2.png :width: 312px :height: 124px * - logic now looks like this - logic - .. image:: image/elabLogicEx1_2.png + .. image:: ../image/elabLogicEx1_2.png :width: 126px :height: 45px @@ -152,14 +152,14 @@ After each tactic we will look at the state: * - state now looks like this - state - .. image:: image/elabProofStateEx1_3.png + .. image:: ../image/elabProofStateEx1_3.png :width: 312px :height: 124px * - logic now looks like this - logic - .. image:: image/elabLogicEx1_3.png + .. image:: ../image/elabLogicEx1_3.png :width: 131px :height: 45px @@ -218,7 +218,7 @@ After each tactic we will look at the state: * - logic now looks like this - logic - .. image:: image/elabLogicEx1_4.png + .. image:: ../image/elabLogicEx1_4.png :width: 131px :height: 14px diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 38441c4ffb..059cff040d 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -17,7 +17,7 @@ Tactics operate on the proof state. The proof state contains various pieces of i There are many other pieces of information in the proof state such as the names used , such as the bodies of case blocks that need to be elaborated.but, for now, we will leave the system to handle these. -.. image:: image/elabProofState.png +.. image:: ../image/elabProofState.png :width: 283px :height: 232px From 278de0611fd74df703fa178afded3353fe3e4f3b Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 8 May 2019 16:56:07 +0100 Subject: [PATCH 04/45] change title of theorem proving section --- docs/proofs/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/proofs/index.rst b/docs/proofs/index.rst index dd6ffbb0ae..7456892100 100644 --- a/docs/proofs/index.rst +++ b/docs/proofs/index.rst @@ -1,10 +1,10 @@ .. _proofs-index: -############### -Theorem Proving -############### +######################################### +Theorem Proving and Elaborator Reflection +######################################### -A tutorial on theorem proving in Idris. +A tutorial on theorem proving in Idris. .. note:: From 5e25d2b5b48cbaaa404e7b62a4db50240da83d11 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 8 May 2019 18:53:37 +0100 Subject: [PATCH 05/45] fix minor formatting issue --- docs/proofs/generatingData.rst | 47 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index fe9d390bb5..97beefe522 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -86,33 +86,38 @@ This code generates the following data and function: .. code-block:: idris -data U : Type where - Base : U - Pi : (code : U) -> (el code -> U) -> U - el : U -> Type - el (Pi code body) = (x : el code) -> el (body x) - el Base = Bool + data U : Type where + Base : U + Pi : (code : U) -> (el code -> U) -> U + el : U -> Type + el (Pi code body) = (x : el code) -> el (body x) + el Base = Bool -Which can be used like this: +.. list-table:: Usage -.. code-block:: idris + * - We can then use U the data structure, like this: + - examples + + .. code-block:: idris - λΠ> :t U - U : Type - λΠ> :doc U - No documentation for U - λΠ> Base - Base : U - λΠ> DataDef.Pi - Pi : (code : U) -> (el code -> U) -> U + λΠ> :t U + U : Type + λΠ> :doc U + No documentation for U + λΠ> Base + Base : U + λΠ> DataDef.Pi + Pi : (code : U) -> (el code -> U) -> U + * - el is the function that has been defined: + - examples -.. code-block:: idris + .. code-block:: idris - λΠ> :t el - el : U -> Type - λΠ> el Base - Bool : Type + λΠ> :t el + el : U -> Type + λΠ> el Base + Bool : Type So these are the functions that we can use to create data and functions in the Elab monad: From 1772239d54ab98feb5ae8b24968d0c6b87517967 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 9 May 2019 07:07:51 +0100 Subject: [PATCH 06/45] minor change - add reference --- docs/proofs/generatingData.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 97beefe522..16950cc101 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -3,7 +3,7 @@ Generating Data and Functions at Compile Time We can construct a data structure at compile-time in an Elab monad. This can allow proofs to be generated for user defined types or it could allow types to be automatically generated to support user defined types. -An example is the code, from Christensen-Brady joint paper ('Elaborator Reflection: Extending Idris in Idris'), that automatically generates accessibility predicates using the Bove-Capretta method. +An example is the code, from `Elaborator reflection: extending Idris in Idris`_, that automatically generates accessibility predicates using the Bove-Capretta method. The following simple outline example is adapted from ``_ @@ -304,3 +304,5 @@ The above functions use the following data/records: ||| The constructors for the family constructors : List (TTName, List CtorArg, Raw) +.. target-notes:: +.. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932 From 9472245345f67e2b7184ee364374d40e03a9658e Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 11:13:33 +0100 Subject: [PATCH 07/45] inital changes following comments, more to come --- docs/proofs/elabReflection.rst | 10 +++++----- docs/proofs/tactics.rst | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index 87a40d4c89..7311dde399 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -3,7 +3,7 @@ Extending Idris using Elaborator Reflection Idris provides a mechanism to modify the language without having to recompile Idris itself. We can think of this in terms of metaprogramming or domain specific languages or just building in new capabilities. -In order to extend the language we need to know something about how Idris is complied. On this page we try to limit this explanation to only what we need to customise the elaboration. For more details of the compiler see `Edwin Brady 2013 paper`_ and for customising the elaboration process see `David Christiansen Practical Reflection and Metaprogramming`_ and `Elaborator reflection: extending Idris in Idris`_. For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs McBride 1999`_. +In order to extend the language we need to know something about how Idris is complied. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_ . Here is a diagram of the multistage process at the top level when Idris code gets compiled: @@ -11,7 +11,7 @@ Here is a diagram of the multistage process at the top level when Idris code get :width: 484px :height: 147px -TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here we use the word 'tactics' to refer to these elaboration tactics - not to be confused with the old tactics mechanism. +TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here the word 'tactics' is used to refer to these elaboration tactics - not to be confused with the old tactics mechanism. .. image:: ../image/compareToProofAssist.png :width: 229px @@ -46,10 +46,10 @@ As already mentioned the TT core language is kept syntactically very simple. Par :height: 145px .. target-notes:: -.. _`Edwin Brady 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf -.. _`David Christiansen Practical Reflection and Metaprogramming`: https://davidchristiansen.dk/david-christiansen-phd.pdf +.. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf +.. _`David Christiansen's PhD thesis`: https://davidchristiansen.dk/david-christiansen-phd.pdf .. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932 -.. _`Dependently Typed Functional Programs and their Proofs McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 + diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 059cff040d..b60966631a 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -3,7 +3,12 @@ Elaborator Reflection - Tactics The Idris part of the code for elaborator reflection is in Elab.idr ``_ -Before we look at the Elab monad we need to know how to construct terms. +Before looking at the Elab monad we need to know how to construct terms. + +Holes +===== + +For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs McBride 1999`_. Proof State =========== @@ -24,7 +29,7 @@ There are many other pieces of information in the proof state such as the names Names TTName ------------ -Names in an Idris program are evaluated at runtime but sometimes we need a 'variable name' which can be referred to as an unevaluated symbol. +Names in an Idris program are evaluated at runtime but sometimes a 'variable name' is needed, which can be referred to as an unevaluated symbol. The names used in terms have different constructors depending on their type: +---------------------------+-----------------------------------------------+ @@ -120,7 +125,7 @@ Since names are used frequently in elaborator reflection there is a shortcut for P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT - * - If we want the vale we can escape from quasiquotation by using anti-quotation (tilde) + * - If we want the value we can escape from quasiquotation by using anti-quotation (tilde) - example .. code-block:: idris @@ -151,7 +156,7 @@ quasiquotation summary: TT == -There is a notation for a term in TT as it is being constructed (based on a BNF-like grammar), this is used for example in the debug output, it is a compact way to see the state of the term so we use it here. +There is a notation for a term in TT as it is being constructed (based on a BNF-like grammar), this is used for example in the debug output, it is a compact way to see the state of the term so it is used here. So internally the program is stored as a tree structure using the following syntax: +------------+-------+-------------+---------------------------------------------+ @@ -169,8 +174,9 @@ So internally the program is stored as a tree structure using the following synt | binding | | | binding. | +------------+-------+-------------+---------------------------------------------+ | application| t ::= | t t | As with Idris, juxtaposition indicates | -| | | | function application. Note: we use the same | -| | | | symbol 't' for terms | +| | | | function application. Note: the same symbol | +| | | | 't' is used for both terms, this does not | +| | | | imply they are the same term. | +------------+-------+-------------+---------------------------------------------+ | Type | t ::= | T | | | constructor| | | | @@ -429,3 +435,5 @@ However this would cause the application of f to be ill-typed, as it expects an letbind : (n : TTName) -> (ty, tm : Raw) -> Elab () +... target-notes:: +. _`Dependently Typed Functional Programs and their Proofs McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 From d0a45759127edf15f188d5e3756b580ecdd68096 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 17:43:26 +0100 Subject: [PATCH 08/45] further improvements from comments --- docs/image/binders.svg | 326 +++++++++++++++++ docs/image/compareToProofAssist.png | Bin 7231 -> 5911 bytes docs/image/compareToProofAssist.svg | 251 +++++++++++++ docs/image/elab.svg | 139 ++++++++ docs/image/elabLogicEx1_1.svg | 97 +++++ docs/image/elabLogicEx1_2.svg | 115 ++++++ docs/image/elabLogicEx1_3.svg | 115 ++++++ docs/image/elabLogicEx1_4.svg | 80 +++++ docs/image/elabProofState.svg | 356 +++++++++++++++++++ docs/image/elabProofStateEx1_1.svg | 311 +++++++++++++++++ docs/image/elabProofStateEx1_2.svg | 271 ++++++++++++++ docs/image/elabProofStateEx1_3.svg | 274 +++++++++++++++ docs/image/idrisTopLevel.png | Bin 20751 -> 20413 bytes docs/image/idrisTopLevel.svg | 524 ++++++++++++++++++++++++++++ docs/image/tree.svg | 180 ++++++++++ 15 files changed, 3039 insertions(+) create mode 100644 docs/image/binders.svg create mode 100644 docs/image/compareToProofAssist.svg create mode 100644 docs/image/elab.svg create mode 100644 docs/image/elabLogicEx1_1.svg create mode 100644 docs/image/elabLogicEx1_2.svg create mode 100644 docs/image/elabLogicEx1_3.svg create mode 100644 docs/image/elabLogicEx1_4.svg create mode 100644 docs/image/elabProofState.svg create mode 100644 docs/image/elabProofStateEx1_1.svg create mode 100644 docs/image/elabProofStateEx1_2.svg create mode 100644 docs/image/elabProofStateEx1_3.svg create mode 100644 docs/image/idrisTopLevel.svg create mode 100644 docs/image/tree.svg diff --git a/docs/image/binders.svg b/docs/image/binders.svg new file mode 100644 index 0000000000..bf763e22ea --- /dev/null +++ b/docs/image/binders.svg @@ -0,0 +1,326 @@ + + + + + + + + + + image/svg+xml + + + + + + + Code + Logic + + + + + + Abstraction + letbinding + functionspace + λ x:t + Γ ⊢ S : Type + let x ↦ t : t + + Γ ; λ x:S ⊢ valid + Γ ⊢ S : Type + + Γ ; ∀ x:S ⊢ valid + ∀ x:t + Γ ⊢ S : Type Γ ⊢ s:S + + Γ ; let x ↦ s : S ⊢ valid + + diff --git a/docs/image/compareToProofAssist.png b/docs/image/compareToProofAssist.png index b53004d4fb5a5ca88e578f428a3117e51541d5f0..b8363e8ad9e29a3ce91e8e89a668f23f0270de1d 100644 GIT binary patch delta 5889 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 Cu+k*} diff --git a/docs/image/compareToProofAssist.svg b/docs/image/compareToProofAssist.svg new file mode 100644 index 0000000000..4218be6895 --- /dev/null +++ b/docs/image/compareToProofAssist.svg @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Human + Tactics + fill holes + Proof assistant + + + High level program(unification algorithm) + Tactics + fill holes(implicit variables, etc) + Idris Elaborator + + + + diff --git a/docs/image/elab.svg b/docs/image/elab.svg new file mode 100644 index 0000000000..bb7715767a --- /dev/null +++ b/docs/image/elab.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Definition Elaborator + definition context + Term Elaborator + + diff --git a/docs/image/elabLogicEx1_1.svg b/docs/image/elabLogicEx1_1.svg new file mode 100644 index 0000000000..6f94e00bc4 --- /dev/null +++ b/docs/image/elabLogicEx1_1.svg @@ -0,0 +1,97 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 : pi_arg : Nat -> Nat + hole_0 : pi_arg : Nat -> Nat + + + + diff --git a/docs/image/elabLogicEx1_2.svg b/docs/image/elabLogicEx1_2.svg new file mode 100644 index 0000000000..a676c6c9f6 --- /dev/null +++ b/docs/image/elabLogicEx1_2.svg @@ -0,0 +1,115 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 : Nat + hole_0 : (pi_arg : Nat) -> Nat + + + x : Nat + + diff --git a/docs/image/elabLogicEx1_3.svg b/docs/image/elabLogicEx1_3.svg new file mode 100644 index 0000000000..4a8a3e74e9 --- /dev/null +++ b/docs/image/elabLogicEx1_3.svg @@ -0,0 +1,115 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 : Nat + hole_0 : (pi_arg : Nat) -> Nat + + + x : Nat + + diff --git a/docs/image/elabLogicEx1_4.svg b/docs/image/elabLogicEx1_4.svg new file mode 100644 index 0000000000..dee42baa4c --- /dev/null +++ b/docs/image/elabLogicEx1_4.svg @@ -0,0 +1,80 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_0 : (pi_arg : Nat) -> Nat + + + diff --git a/docs/image/elabProofState.svg b/docs/image/elabProofState.svg new file mode 100644 index 0000000000..e65bea07d7 --- /dev/null +++ b/docs/image/elabProofState.svg @@ -0,0 +1,356 @@ + + + + + + + + + + image/svg+xml + + + + + + + current proof term + (TTName, TT) + original goal + pathsubtermupdates + Contexts used for global definitions and for proof state.They contain universe constraints and existing definitions.Also store maximum RigCount of the namel + Environment + Holes + Guess + Goal + + + + + + + + + focus + + + List (TTName, Binder TT)Open unification constaints. + List TTName + TT + + diff --git a/docs/image/elabProofStateEx1_1.svg b/docs/image/elabProofStateEx1_1.svg new file mode 100644 index 0000000000..cba47b651c --- /dev/null +++ b/docs/image/elabProofStateEx1_1.svg @@ -0,0 +1,311 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 + Environment + Holes + Guess + Goal + + + + + + + hole_0 + [ ] + starts off empty + + (hole_2 , pi_arg : Nat->Nat) + this is the signaturewe are looking for + + machine chosennames for the holes + + no guess yet + + diff --git a/docs/image/elabProofStateEx1_2.svg b/docs/image/elabProofStateEx1_2.svg new file mode 100644 index 0000000000..f6b3c16a83 --- /dev/null +++ b/docs/image/elabProofStateEx1_2.svg @@ -0,0 +1,271 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 + Environment + Holes + Guess + Goal + + + + + + + hole_0 + (x, λ Nat) + (hole_2 , Nat) + + machine chosennames for the holes + + x:Nat + + diff --git a/docs/image/elabProofStateEx1_3.svg b/docs/image/elabProofStateEx1_3.svg new file mode 100644 index 0000000000..fd4d243e21 --- /dev/null +++ b/docs/image/elabProofStateEx1_3.svg @@ -0,0 +1,274 @@ + + + + + + + + + + image/svg+xml + + + + + + + hole_2 + Environment + Holes + Guess + Goal + + + + + + + hole_0 + (x, λ Nat) + (hole_2 , Nat) + + machine chosennames for the holes + + x:Nat + + diff --git a/docs/image/idrisTopLevel.png b/docs/image/idrisTopLevel.png index b3d1e22f1150d7da527339ff8e6621d785a5dacc..f3d20f35e061b9cf784843caabeab52cf5653fa9 100644 GIT binary patch literal 20413 zcmYg&1yEbf_cl)P5`qW!QlPlI1=m6;+7jH|onl3T7m7PYij?49Ah>JL;_lL7f8O8B zH}hrYW|N!Uy}Rd}`|P=ApOa`!bwxaE3Tz}KBs?XsoHh~?^481e zn~aj~tCyGmD@fGKcPwYHf!j-A`QL$@%?!?YIZ5s=|G{0y$~R2!lDoL%b=Dytl0?fgMZa#MzT+6bsYk*rdUKwo7EE&Er?`%qXTU@)35b?^ z%Jt)_=HY|{PsulfgF8eY6dHmVR3c?NW5tr4D}{IE7;6w5dKjD#10vi@=9%M#U9K&)Cn5vVAbZw5Lg#R z*SVf01z?JDDezGV?NY0&qf2W26r5LWY4H(#*9oHy`)$21F0$uv*``{T|GI?P>$7w- z1a49O8s-&}BO1PRXp1P|H!acCdDm?hXBS(SxD+8^c@1@KDZrb%>FHlrRaamaRhL57 zJ5kFZGyNIieZ`wGIYvM#r{FL*`+LDNtSOKv?eVQj zQMMy8C|N7ej&W}n*>1_JGnU5+X#hnu-(|BQm>719&A6^1lO5KcXcmNYhw7avSJ+NO z7TceFh>AeATR3M%CaS`BLRG}vU8D4#kWdL82=;^>leg|{+OL5b0c^xtvhk3*kq+MM z!mI!*KdTsJp^~*6l(b!;2&?h{4QZ5flp=1w1BPi=Oi0Yw4t%z&LqCsuEj0G}3G|ey zj&!1s`49!D{sM^KXWP$tQ9hXBzaB4`-VtT^N@9pC{mVVN|5zlQo<5)G=|{vvXLW%! zrS63hs93TwafN`7tpOJ>v2GRM;doQN2!`%w2_CIn+y`vXr^6Dfta>Uy4OL>=(Ks(b z9BQsqOIN^H^@i6yHS&YOkBWqstAT(iMvQeawYc7-3&6PC!0>*EDa_#z^_2G0HN}+r zE|Sy2(@G-NJtZTVDY9k0%Qj&b4jAeXQo`+kv5cdNH}(v2Ejak{YmOAUISYUQsO|1G zWH;NA69w8|+ssjgs8pVu(yI9wLP8}+hpG~?M*9ptELdq?x+rGGz=+-|q#G2S3jT9BM+rsiXXQY*j(1|_sH?p6INNoI?a@6+ z(PF-u3PkP8&mpcf{W@aoS7`ve?xA2=vN^88^1Vrd37$5;=;q) zIEs}$Td#hX52EcQPkHlL&XwPbv&k2GG`Ma>I^9)AIF+lPPF{V7GULsr!7 zXg;tYA>`=ASf;KxNDqqXzh=TNsTG)V?4%`xH|8xY;b_?($HSg*Asrp~@`1rAlzH3V3IR2O;C#?`s0HJtM zg7%w&L6M}dT$*IV&ER2BX2zawr9z|b%emRm$a5M&pWv+e&filo#Rgx%f%7ww;*8c|dR0pfCVEIWJA za5@oQqA4Bc^hJwf^xVguGR$l8Oj(^dRGZvDJvX8xdyUlYt5^{ZSxdKZ-1`oIJP1Mc zMNCI=|<;!=OfEKUv|K*7{H)7dXR~}n2z`R)K4($Y6zbZ)KVDV zrVo)EJK!rJwfSS5J|BVX4P?q_LfMN`UC`exAMoEI7Jp@P*jebZC0;2}rTO+S#+AsK zlE=WwsWTlNk&D_PJO9j2al86DV?>nRq4o7$KHxw*!-(Jr-6*;CiHA?uMV&msi}nC| z6d}U7oBt{FC%fJ#7&6QFVh#}P@R89|`YPv^$0t0ju1PrX9=Qfd*gsCX=T5^6l@G&T zso#a_OlT^qQ!4KECu?-CH6)^g*juQq*H15!+_NM1c)5Op>@)zjHVywRHYTw~>vr$X zE{L45Dk&SyCUyy3yvKorKI2<7`4R{>a46W2pZ>a-c0fQXcHJR!9k>>~z5tuS;gAZ= z%99IMv5WOpnvCHfsX-BZ#q5OaqmM8YeCg@7eniJLbQ)m-cRgdLn3p6H@3jJp;IxO} zOlo%D?wMTIntL+4I93pVVnoz<6C?kk!>IRsYzz2t{g$p{Z~PZ?a4&{ zp@Z@kfN^W=$9{}1>U;498^St_7gIgw16b94fujb{0-6{SUq3V+`!#ZOS|Ab>%pZBR z6s??{a~|ziR2j_(6hbf9X1XapZ<|PG*J(`ft`d1bVl)S=RVom$u4=ewU{Pv2A=YMJ z*(G0hHT!=M@cy?F993lccRSC8DlttE;Zz&4i5v+E7nGpp+LX2mw64qO-%5-3sA~Ak zdhvu|Ad)lYTK$Pp{RMn6kwt0ket$?}bMT|BdgNsE9%mwNB|yKpgu77}*_cM7HOcCX z!%#dw&3bFlCu$Q7Kp9d8+h1IYR9vU2Z0t(P%G!RJhzU$(cg04R+|f` z8W92C2{Ve_!me8xc6k&(yGATC9~MHLsY0@T?a&=Ru=AN1M`exdFl;=6GCg73u4#tg zmO)=NK2n5%xTiF-{wnP7V=T(he}GpMHRz zJm*!6djn}^#S%?l&noulN?%7K_K=h1wjt)>oIG{6c&JAOqJ@KJtntgNI1qeju-K9& z;ex!6tXIcPYEzhF2~Ykv&XZ$R{%E3nv;LMHDgdgRxf$(mdwbY(`QL~c3BJI8-LbpA z$_(bqj+}g0%T4r|9qpXKQS5Puq5LRrwgfx{?%Aw?QH5r{dTXB$~x@r^m0bm_DYo^><;9amhs zLSZ~=ln?blp7JFv@E&W2?*CIPYF_(%PatEyj59%YNn$pU-z2KRo*(5 z=ac+@rW`+wW-~N8@y*39MWD9O!6~Fat(|0!D&spM@2xuBwU*ge3F{*tw&=(k49~1t zC?>3w>S7PSboEz_NCVa!zg)CJM}8d`tdTT7G)Kn zK&_jaei5L26s1|>Z0+TSF6zNm=oLvvTzJ8jndkA5S&(m`BM8aGoAy%I3bL15pI^g) z1dh&{FI(g|P1Z+$D=TP02=A?|oR7lMTE4uno=>!;_cc(YXQ!DQZuwjUo!;1G%^OuI zQjEH1S6<*o9Su6AvG>E=j_-IiO7Sf=>-D&zdO|Yz;>*tj)d{bB;P=j@+f3LaE#Kxk z6m%_yc1JeqdAB@<>TIZ4>ZcX^*I279n8+ajIkQ)i8jnTX=^FX3r$6??@J;ULVF_yK z7fH;#v8|8DqW1$tgZIyNR!%1ajN;q=QsxB<u;VBubok>WfE^S{!7WS(wWCR3`k|Haz|? zzj)Eu&95$dd2^3(?ThNc1A5m|DaiA(YWxUWdJE0Jng1!ki;pEJX}-?PxGo^KVHlvt zuIcZt_-FQsB~xi#{2@Sqlg80@9fe@-G`NW#x2#ihasWammV`dO-plD!&9kBm_W}P zzoasc#p>R9JM^g|6}KZWdK8NA%X9#sDQe2(*xsKJC3yS_(vI4UD6^tUk0w1XDxxK) z3HsXK7Lyb89`J|E^t5%`p$2;*y|E6(?eSn@0J>{YzYEW-JblBLTTRWZ%}L#MeK4S? z&D?@hA;i_6Y_5^rxg$dnO@jXD%nkR_l1b;%h%X##7@bBksF4c$ zlEU#GTD04=R1KGuM=;1e|__pO6$&<9*Wb*c(W1H(tcDd@qI+kHlCXUbwBN)}Z z>-v$KdyZ>BsOw+A)aJSY`>kC$JD{8dWaKn%>4>#`(%_n#qFEhqW@7X)!q>>*{;g-t za-ihy`a4V=s!HcUAaqH=fz-R9Joo!n1y6B3x+?V zmpYP}bT=l9=P|8g}W%vpF{R06%t*lmhiAqrne1}}hMp4Qzy5Y8dquk!qBJZZ`c~l;E7Ysb5 z?|#p$T{E%&cnQK;cIa%Swb&3PE&u4LVdLmVp^onohomjN z>dxW-GILSRSq==KylS)hdqX$OjmZ1dXsV4p^=E#bg-iyVQ7#UB{}uYID

Kk)GCl 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Idris + Idris + ~ + TT + Executable + desugaring + + elaboration + compilation + + C + JS + + + Add implicitly quantified variables.Conditional expressions replaced by function calls. + + proof tactics + + + + during elaborationmay contain holesand guesses + + Make explicit all types.Make explicit function and pattern match variables. + + + type checkerRaw -> TT + + Raw + PTerm + + diff --git a/docs/image/tree.svg b/docs/image/tree.svg new file mode 100644 index 0000000000..b994ce0574 --- /dev/null +++ b/docs/image/tree.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + λ n:t1 . h:t2 + x + + intro `{{x}} + solve + fill (Var `{{x}}) + + + + From 420f2b8d90ccca5021043c01bc4e2658b055abab Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 18:16:06 +0100 Subject: [PATCH 09/45] add readme file to explain image file formats --- docs/image/README.md | 17 +++++++++++++++++ docs/proofs/elabReflection.rst | 31 +++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 docs/image/README.md diff --git a/docs/image/README.md b/docs/image/README.md new file mode 100644 index 0000000000..d2574dc8a6 --- /dev/null +++ b/docs/image/README.md @@ -0,0 +1,17 @@ +Many of the images in this directory have two files with the same name but a different extension: + +* The SVG file, being vector graphics, is best for drawing and modifying. +* The PNG file, being raster graphics, gives more consistent rendering. + +The image has therefore been generated as an SVG file and then exported to the PNG file. + +So, if you need to modify an image, I suggest the following sequence: + +* Edit the SVG file using a suitable editor (I use Inkscape). +* Export the changes to the PNG file, overwriting the ond version. +* upload both files. + +Note, when exporting in Inkscape: +* Select everything first, this stops an enormous boundary being exported. +* After selecting the file to export to and clicking OK, don't forget to click on export button as well. + diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index 7311dde399..5f74e49b5b 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -3,25 +3,34 @@ Extending Idris using Elaborator Reflection Idris provides a mechanism to modify the language without having to recompile Idris itself. We can think of this in terms of metaprogramming or domain specific languages or just building in new capabilities. -In order to extend the language we need to know something about how Idris is complied. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_ . +In order to extend the language we need to know something about how Idris is compiled. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_ . -Here is a diagram of the multistage process at the top level when Idris code gets compiled: +Compilation of Idris proceeds through a number of stages. + +- First, Idris is desugared by inserting placeholders for terms to be guessed by the compiler and replacing certain syntactic forms, such as do-notation, with the functions that implement them. +- Then, this desugared Idris is translated into a much simpler core language, called TT. This translation process is called elaboration. +- Finally, TT is type checked a second time to rule out errors, and then compiled into the target language. .. image:: ../image/idrisTopLevel.png :width: 484px :height: 147px + :alt: diagram showing these stages of Idris compilation TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here the word 'tactics' is used to refer to these elaboration tactics - not to be confused with the old tactics mechanism. -.. image:: ../image/compareToProofAssist.png - :width: 229px - :height: 114px +.. list-table:: + + * - There are some similarities with a proof assistant but in Idris the elaborator is an interpreter of Idris source in the elaboration monad, where each syntactic construct of Idris is interpreted as a sequence of tactics. + - .. image:: ../image/compareToProofAssist.png + :width: 229px + :height: 114px + :alt: diagram comparing elaboration with proof assistant -This gives the opportunity to allow the primitives of the elaboration mechanism to be exposed to metaprograms. +The primitives in the elaboration library are not just useful for the implementors of Idris itself. They can also be used by authors of extensions to the compiler, using a mechanism known as elaborator reflection. During elaboration TT (Raw) structure contains: -- holes - terms yet to be inferred. -- guesses - Suppresses β-reduction while precise structure not known. +- holes - placeholders for terms that have not yet been filled in. +- guesses - similar to let bindings, except with no reduction rule, so that elaboration programs can control the precise shape of terms that are under construction. Type checker: @@ -31,12 +40,14 @@ Type checker: .. image:: ../image/elabOverview.png :width: 268px :height: 219px + :alt: alternate text As already mentioned the TT core language is kept syntactically very simple. Part of the reason for this is that its correctness is already well proven using logic. For instance, here are the binders in TT with corresponding code and logic type introduction rules: .. image:: ../image/binders.png :width: 310px :height: 203px + :alt: alternate text .. list-table:: @@ -44,12 +55,12 @@ As already mentioned the TT core language is kept syntactically very simple. Par - .. image:: ../image/elab.png :width: 141px :height: 145px + :alt: alternate text .. target-notes:: .. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf -.. _`David Christiansen's PhD thesis`: https://davidchristiansen.dk/david-christiansen-phd.pdf .. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932 - +.. _`David Christiansen's PhD thesis`: https://davidchristiansen.dk/david-christiansen-phd.pdf From 0fb8b7504bba639a9fb497cb201cdbbfd09b1bfe Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 18:19:49 +0100 Subject: [PATCH 10/45] fix typo --- docs/image/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/image/README.md b/docs/image/README.md index d2574dc8a6..6e2d3f87f0 100644 --- a/docs/image/README.md +++ b/docs/image/README.md @@ -8,10 +8,9 @@ The image has therefore been generated as an SVG file and then exported to the P So, if you need to modify an image, I suggest the following sequence: * Edit the SVG file using a suitable editor (I use Inkscape). -* Export the changes to the PNG file, overwriting the ond version. +* Export the changes to the PNG file, overwriting the old version. * upload both files. Note, when exporting in Inkscape: * Select everything first, this stops an enormous boundary being exported. * After selecting the file to export to and clicking OK, don't forget to click on export button as well. - From 5267e39a84703b9bbcf0584d93d0efa0c2913e9b Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 18:36:06 +0100 Subject: [PATCH 11/45] fix reference --- docs/proofs/tactics.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index b60966631a..741d72051c 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -8,7 +8,7 @@ Before looking at the Elab monad we need to know how to construct terms. Holes ===== -For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs McBride 1999`_. +For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. Proof State =========== @@ -436,4 +436,4 @@ However this would cause the application of f to be ill-typed, as it expects an letbind : (n : TTName) -> (ty, tm : Raw) -> Elab () ... target-notes:: -. _`Dependently Typed Functional Programs and their Proofs McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 +. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 From 5cd37d80c1b167188f9715563ef4e5ec915bddc4 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 15 May 2019 18:46:35 +0100 Subject: [PATCH 12/45] change as suggested --- docs/proofs/primative.rst | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/docs/proofs/primative.rst b/docs/proofs/primative.rst index 56a7c4dc65..2f523d0c02 100644 --- a/docs/proofs/primative.rst +++ b/docs/proofs/primative.rst @@ -419,14 +419,6 @@ Read and Write State lookupFunDefnExact : TTName -> Elab (FunDefn TT) - .. code-block:: idris - - lookupFunDefnExact n = case !(lookupFunDefn n) of - [res] => pure res - [] => fail [TextPart - "No function named", NamePart n] - xs => fail [TextPart "More than one function named", - NamePart n] * - lookupArgs - Get the argument specification for each overloading of a name. @@ -443,11 +435,6 @@ Read and Write State .. code-block:: idris - lookupArgsExact n = case !(lookupArgs n) of - [res] => pure res - [] => fail [NamePart n, TextPart "is not defined."] - xs => fail [NamePart n, TextPart "is ambiguous."] - * - check - Attempt to type-check a term, getting back itself and its type. From ae9484a31645b2b7689c2a050355e7fc64cca98f Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 16 May 2019 08:25:38 +0100 Subject: [PATCH 13/45] more suggested changes --- docs/proofs/elabReflection.rst | 6 ++++-- docs/proofs/tactics.rst | 6 +----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index 5f74e49b5b..c2346219c3 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -16,7 +16,7 @@ Compilation of Idris proceeds through a number of stages. :height: 147px :alt: diagram showing these stages of Idris compilation -TT is a core language which is syntactically very simple, this makes it easy for computers to process but very verbose and hard for humans to read. This elaboration is done by a logic language (proof tactics) similar to LTac in Coq. Here the word 'tactics' is used to refer to these elaboration tactics - not to be confused with the old tactics mechanism. +TT is a core language which is syntactically very simple. This makes it easy for computers to process but very verbose and hard for humans to read. The Idris elaborator is written in Haskell using an elaboration library that was inspired by the tactics in interactive proof assistants such as Coq. .. list-table:: @@ -32,6 +32,8 @@ During elaboration TT (Raw) structure contains: - holes - placeholders for terms that have not yet been filled in. - guesses - similar to let bindings, except with no reduction rule, so that elaboration programs can control the precise shape of terms that are under construction. +For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. + Type checker: - include universe levels @@ -61,6 +63,6 @@ As already mentioned the TT core language is kept syntactically very simple. Par .. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf .. _`Elaborator reflection: extending Idris in Idris`: https://dl.acm.org/citation.cfm?doid=2951913.2951932 .. _`David Christiansen's PhD thesis`: https://davidchristiansen.dk/david-christiansen-phd.pdf - +.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 741d72051c..376b2b5a3e 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -5,17 +5,13 @@ The Idris part of the code for elaborator reflection is in Elab.idr ``_ Before looking at the Elab monad we need to know how to construct terms. -Holes -===== - -For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. Proof State =========== Tactics operate on the proof state. The proof state contains various pieces of information, at this stage, the important ones for us are: -- A hole queue - This contains a list of the names of the holes used in the proof term. The solution to each hole may depend on the other holes. +- A hole queue - This contains a list of the names of the holes used in the proof term. The solution to each hole may depend on the other holes. For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. - A goal type - The type of the term that is under construction for the current goal. - A possibly incomplete proof term, which is being calculated and should be the goal type at the end of elaboration. - Context - A collection of open unification problems, representing recoverable failures of unification that may yet unify once more variables are solved. From 40c7a8a5425ddc05c1723dc70fe3446d48662917 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 16 May 2019 15:03:23 +0100 Subject: [PATCH 14/45] update copyright notice to 2019 --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 7cc70a99bf..bd1713126b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -51,7 +51,7 @@ # General information about the project. project = u'Idris' -copyright = u'2017, The Idris Community' +copyright = u'2017-2019, The Idris Community' author = u'The Idris Community' # The version info for the project you're documenting, acts as replacement for From dd2c42753305281908fad4e3af111c8ffbc314da Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 16 May 2019 19:09:51 +0100 Subject: [PATCH 15/45] update elabOverview image --- docs/image/elabOverview.png | Bin 20056 -> 25922 bytes docs/image/elabOverview.svg | 585 +++++++++++++++++++++++++++++++++ docs/proofs/elabReflection.rst | 16 +- 3 files changed, 593 insertions(+), 8 deletions(-) create mode 100644 docs/image/elabOverview.svg diff --git a/docs/image/elabOverview.png b/docs/image/elabOverview.png index f1a9bf6f36963c85a979d66387ff6d6549d4ca22..b1adcc3417127533d9c965bb83e51c13741f51f1 100644 GIT binary patch literal 25922 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 BJ2?OV diff --git a/docs/image/elabOverview.svg b/docs/image/elabOverview.svg new file mode 100644 index 0000000000..2e299b30a2 --- /dev/null +++ b/docs/image/elabOverview.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + data TT : Type where P : NameType -> TTName -> TT -> TT V : Int -> TT Bind : TTName -> Binder TT -> TT -> TT App : TT -> TT -> TT TConst : Const -> TT Erased : TT TType : TTUExp -> TT UType : Universe -> TT + globally defined variable from name + + local (de Bruijn) variable + + any kind of binderlambda, let etc. + + function application + + intager, char, string, etc. + + unknown term for erasing types + + type of types + + unique universe + + elements of core language + + TT + envgoalholesguess + Elab (List (TTName, Binder TT)Elab (TTName,TT)Elab (List TTName)Elab (TT) + + state + + Elab Monad + + + + + + solvefillapplyfocus... + tactics + + diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index c2346219c3..b94b9f98e2 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -14,7 +14,7 @@ Compilation of Idris proceeds through a number of stages. .. image:: ../image/idrisTopLevel.png :width: 484px :height: 147px - :alt: diagram showing these stages of Idris compilation + :alt: diagram illustrating these stages of Idris compilation TT is a core language which is syntactically very simple. This makes it easy for computers to process but very verbose and hard for humans to read. The Idris elaborator is written in Haskell using an elaboration library that was inspired by the tactics in interactive proof assistants such as Coq. @@ -22,8 +22,8 @@ TT is a core language which is syntactically very simple. This makes it easy for * - There are some similarities with a proof assistant but in Idris the elaborator is an interpreter of Idris source in the elaboration monad, where each syntactic construct of Idris is interpreted as a sequence of tactics. - .. image:: ../image/compareToProofAssist.png - :width: 229px - :height: 114px + :width: 206px + :height: 112px :alt: diagram comparing elaboration with proof assistant The primitives in the elaboration library are not just useful for the implementors of Idris itself. They can also be used by authors of extensions to the compiler, using a mechanism known as elaborator reflection. @@ -40,16 +40,16 @@ Type checker: - distinguish between global and local bound names. .. image:: ../image/elabOverview.png - :width: 268px - :height: 219px - :alt: alternate text + :width: 410px + :height: 282px + :alt: diagram illustrating TT language represented in a monad As already mentioned the TT core language is kept syntactically very simple. Part of the reason for this is that its correctness is already well proven using logic. For instance, here are the binders in TT with corresponding code and logic type introduction rules: .. image:: ../image/binders.png :width: 310px :height: 203px - :alt: alternate text + :alt: diagram illustrating basis of code in logic .. list-table:: @@ -57,7 +57,7 @@ As already mentioned the TT core language is kept syntactically very simple. Par - .. image:: ../image/elab.png :width: 141px :height: 145px - :alt: alternate text + :alt: diagram illustrating distinction between definition and term elaborator. .. target-notes:: .. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf From 7b70c6c3b8a5d60ed4b1111bdc4e72c37902e2c6 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Fri, 17 May 2019 17:02:28 +0100 Subject: [PATCH 16/45] improve some diagrams --- docs/proofs/elabReflection.rst | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index b94b9f98e2..eb9f263f5a 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -34,30 +34,22 @@ During elaboration TT (Raw) structure contains: For more information about holes and guesses see `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. -Type checker: - -- include universe levels -- distinguish between global and local bound names. +The following diagram is intended to illustrate a high level view of the tactics and how this eventually results in the TT language being generated. It is not necessary to understand the details at this stage. The intention is to help build up some intuition so that, when we get into the details, we can recognise how this fits into the big picture. .. image:: ../image/elabOverview.png :width: 410px :height: 282px - :alt: diagram illustrating TT language represented in a monad - -As already mentioned the TT core language is kept syntactically very simple. Part of the reason for this is that its correctness is already well proven using logic. For instance, here are the binders in TT with corresponding code and logic type introduction rules: + :alt: diagram illustrating overview of TT language being generated from tactics. -.. image:: ../image/binders.png - :width: 310px - :height: 203px - :alt: diagram illustrating basis of code in logic +As already mentioned the TT core language is kept syntactically very simple, for instance, here are the binders in TT with corresponding code and logic type introduction rules: .. list-table:: - * - There is an elaborator for both definitions and terms, the definition elaborator calls the term elaborator when required. - - .. image:: ../image/elab.png - :width: 141px - :height: 145px - :alt: diagram illustrating distinction between definition and term elaborator. + * - This diagram illustrates the basis of the compilation process in logic (in this case for binders). It is not necessary to be an expert logician to understand elaborator reflection. However, when learning about tactics, they may appear arbitrary without knowing some theory. + - .. image:: ../image/binders.png + :width: 310px + :height: 203px + :alt: diagram illustrating basis of code in logic .. target-notes:: .. _`Edwin Brady's 2013 paper`: https://eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdf From 893350512b7fee09b7e55d5e5d163e17bacea03f Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Fri, 17 May 2019 17:26:19 +0100 Subject: [PATCH 17/45] remove space which caused incorrect formatting --- docs/proofs/elabReflection.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index eb9f263f5a..44b1ed01fe 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -3,7 +3,7 @@ Extending Idris using Elaborator Reflection Idris provides a mechanism to modify the language without having to recompile Idris itself. We can think of this in terms of metaprogramming or domain specific languages or just building in new capabilities. -In order to extend the language we need to know something about how Idris is compiled. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_ . +In order to extend the language we need to know something about how Idris is compiled. This page explains only what is needed to customise the elaboration. For more information about the compiler's implementation see `Edwin Brady's 2013 paper`_ and for customising the elaboration process see `Elaborator reflection: extending Idris in Idris`_ and `David Christiansen's PhD thesis`_. Compilation of Idris proceeds through a number of stages. From efbb28766167ad95e85204b805ba4073878ac4e0 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Fri, 17 May 2019 17:46:18 +0100 Subject: [PATCH 18/45] change text around logic diagram --- docs/proofs/elabReflection.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/proofs/elabReflection.rst b/docs/proofs/elabReflection.rst index 44b1ed01fe..f2866f93ae 100644 --- a/docs/proofs/elabReflection.rst +++ b/docs/proofs/elabReflection.rst @@ -41,11 +41,11 @@ The following diagram is intended to illustrate a high level view of the tactics :height: 282px :alt: diagram illustrating overview of TT language being generated from tactics. -As already mentioned the TT core language is kept syntactically very simple, for instance, here are the binders in TT with corresponding code and logic type introduction rules: +As already mentioned the TT core language is kept syntactically very simple, for instance, here are the binders in TT with corresponding code and logic type validity rules: .. list-table:: - * - This diagram illustrates the basis of the compilation process in logic (in this case for binders). It is not necessary to be an expert logician to understand elaborator reflection. However, when learning about tactics, they may appear arbitrary without knowing some theory. + * - This diagram illustrates the basis of the compilation process in logic (in this case for binders). It is not necessary to be an expert logician to understand elaborator reflection. However, when learning about tactics, they may appear arbitrary without knowing some theory. For more information about this see `Edwin Brady's 2013 paper`_. - .. image:: ../image/binders.png :width: 310px :height: 203px From edd8da70baa42b3b74068293ec4f22142a42c2c4 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Fri, 17 May 2019 18:57:46 +0100 Subject: [PATCH 19/45] start to make changes to identity example --- docs/proofs/example1.rst | 55 +++++++++++++++------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index c05f064683..784d388b19 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -1,57 +1,46 @@ -Example 1 -========= +Elaborator Reflection - Identity Example +======================================== -.. list-table:: Nat identity +.. list-table:: - * - As an example of elaborator reflection here we step through this identity implementation: - - Nat identity. - - .. code-block:: idris + * - This example of elaborator reflection steps through this metaprogram that generates the identity function: + - .. code-block:: idris %language ElabReflection idNat : Nat -> Nat - idNat = %runElab (do - intro `{{x}} - fill (Var `{{x}}) - solve - ) + idNat = %runElab (do intro `{{x}} + fill (Var `{{x}}) + solve) -.. list-table:: Nat identity +.. list-table:: - * - We start off with a hole for the whole term (of type Nat->Nat). - We fill that with 'intro' which creates a lambda term with a hole for the expression. - - diagram + * - At the beginning of executing the elaboration script, the initial state consists of a single hole of type Nat -> Nat. - .. image:: ../image/tree.png + Fill that with 'intro' which creates a lambda term with a hole for the expression. + - .. image:: ../image/tree.png :width: 133px :height: 106px -After each tactic we will look at the state: +The following is a walkthough looking at the state after each tactic: -.. list-table:: evolution of state +.. list-table:: - * - We start with the type signature like this: - - Nat identity. - - .. code-block:: idris + * - Start with the type signature like this: + - .. code-block:: idris %language ElabReflection idNat : Nat -> Nat idNat = %runElab (do - * - In order to investigate how the program works we can look at the proofState at each stage as the tactics are applied. So here is the proofState at the start: - - state - - .. image:: ../image/elabProofStateEx1_1.png + * - In order to investigate how the program works this table shows the proofState at each stage as the tactics are applied. So here is the proofState at the start: + - .. image:: ../image/elabProofStateEx1_1.png :width: 310px :height: 124px - * - We can also look at the logic at each stage: - - logic - - .. image:: ../image/elabLogicEx1_1.png + * - This table also shows the logic at each stage: + - .. image:: ../image/elabLogicEx1_1.png :width: 126px :height: 33px @@ -64,9 +53,7 @@ After each tactic we will look at the state: getHoles - - state. - - .. code-block:: idris + - .. code-block:: idris getEnv=[] From 654c43178bd82e63d313a834e77f05b17d5b261d Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sat, 18 May 2019 09:17:02 +0100 Subject: [PATCH 20/45] rename file --- docs/proofs/index.rst | 3 +-- docs/proofs/{primative.rst => primitive.rst} | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename docs/proofs/{primative.rst => primitive.rst} (100%) diff --git a/docs/proofs/index.rst b/docs/proofs/index.rst index 7456892100..675c953ce1 100644 --- a/docs/proofs/index.rst +++ b/docs/proofs/index.rst @@ -28,6 +28,5 @@ A tutorial on theorem proving in Idris. elabReflection tactics example1 - primative + primitive generatingData - diff --git a/docs/proofs/primative.rst b/docs/proofs/primitive.rst similarity index 100% rename from docs/proofs/primative.rst rename to docs/proofs/primitive.rst From 540e76bb8917f42634dedba564436ac7aaf0862e Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sat, 18 May 2019 11:39:18 +0100 Subject: [PATCH 21/45] remove some duplicated definitions and tidy up --- docs/proofs/primitive.rst | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index 2f523d0c02..4b64ad21d4 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -1,7 +1,7 @@ Primitive Operators =================== -.. list-table:: Primitive Operators +.. list-table:: :widths: 10 30 :stub-columns: 1 @@ -329,7 +329,7 @@ Primitive Operators Read and Write State ==================== -.. list-table:: Read and Write State +.. list-table:: :widths: 10 30 :stub-columns: 1 @@ -375,13 +375,6 @@ Read and Write State lookupTyExact : TTName -> Elab (TTName, NameType, TT) - .. code-block:: idris - - lookupTyExact n = case !(lookupTy n) of - [res] => pure res - [] => fail [NamePart n, TextPart "is not defined."] - xs => fail [NamePart n, TextPart "is ambiguous."] - * - lookupDatatype - Find the reflected representation of all datatypes whose names are overloadings of some name. @@ -396,15 +389,6 @@ Read and Write State lookupDatatypeExact : TTName -> Elab Datatype - .. code-block:: idris - - lookupDatatypeExact n = case !(lookupDatatype n) of - [res] => pure res - [] => fail [TextPart - "No datatype named", NamePart n] - xs => fail [TextPart "More than one datatype named", - NamePart n] - * - lookupFunDefn - Find the reflected function definition of all functions whose names are overloadings of some name. @@ -427,14 +411,12 @@ Read and Write State lookupArgs : TTName -> Elab (List (TTName, List FunArg, Raw)) * - lookupArgsExact - - Get the argument specification for a name. Fail if the name does not uniquely resolve. + - Get the argument specification for a name. Fail if the name does not uniquely resolve. Signature: lookupArgsExact : TTName -> Elab (TTName, List FunArg, Raw) - .. code-block:: idris - * - check - Attempt to type-check a term, getting back itself and its type. @@ -448,7 +430,7 @@ Read and Write State Error Handling ============== -.. list-table:: Error Handling +.. list-table:: :widths: 10 30 :stub-columns: 1 @@ -460,7 +442,7 @@ Error Handling tryCatch : Elab a -> (Err -> Elab a) -> Elab a - Fixme - following does not work. + Fixme - following does not work. .. code-block:: idris From 73dfb0c005531965ff025eb3bfc5c335125418b6 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sat, 18 May 2019 16:01:50 +0100 Subject: [PATCH 22/45] update some diagrams for example --- docs/image/elabProofStateEx1_1.png | Bin 10443 -> 9899 bytes docs/image/elabProofStateEx1_1.svg | 45 +++++++++++++------------- docs/image/elabProofStateEx1_2.png | Bin 7147 -> 7219 bytes docs/image/elabProofStateEx1_2.svg | 50 +++++++++++++++++------------ docs/proofs/example1.rst | 9 +++--- 5 files changed, 58 insertions(+), 46 deletions(-) diff --git a/docs/image/elabProofStateEx1_1.png b/docs/image/elabProofStateEx1_1.png index 6040b56e93ee0693448b350182481814abccc13f..72c79da49fc5dab3680e74c28049e52f20d0e8a7 100644 GIT binary patch delta 9875 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 FV1itRCz}8O delta 10424 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 off empty + inkscape:export-ydpi="61.120499" + sodipodi:nodetypes="cc" /> this is the signaturewe are looking for machine chosennames for the holes y>Mf?!;tMx#cfaf`S>K2(egB0@+M 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 T;AS-(00000NkvXXu0mjfkgUc~ literal 7147 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 diff --git a/docs/image/elabProofStateEx1_2.svg b/docs/image/elabProofStateEx1_2.svg index f6b3c16a83..3a38cc2005 100644 --- a/docs/image/elabProofStateEx1_2.svg +++ b/docs/image/elabProofStateEx1_2.svg @@ -15,9 +15,27 @@ id="svg2" version="1.1" inkscape:version="0.91 r13725" - sodipodi:docname="elabProofStateEx1_2.svg"> + sodipodi:docname="elabProofStateEx1_2.svg" + inkscape:export-filename="/home/mjb/Idris-dev/docs/image/elabProofStateEx1_2.png" + inkscape:export-xdpi="61.120499" + inkscape:export-ydpi="61.120499"> + id="defs4"> + + + + (hole_2 , Nat) - machine chosenreplace the focussed holenames for the holes + id="tspan6225">with a lambda Nat. - Fill that with 'intro' which creates a lambda term with a hole for the expression. + As a first approximation, the state consists of a term with holes in it, an indicator of which hole is focused, a queue of the next holes to focus on, and miscellaneous information like a source of fresh names. The intro tactic modifies this state, replacing the focused hole with a lambda and focusing on the lambda's body. - .. image:: ../image/tree.png :width: 133px :height: 106px @@ -34,10 +35,10 @@ The following is a walkthough looking at the state after each tactic: idNat : Nat -> Nat idNat = %runElab (do - * - In order to investigate how the program works this table shows the proofState at each stage as the tactics are applied. So here is the proofState at the start: + * - In order to investigate how the program works this table shows the proof state at each stage as the tactics are applied. So here is the proof state at the start: - .. image:: ../image/elabProofStateEx1_1.png :width: 310px - :height: 124px + :height: 115px * - This table also shows the logic at each stage: - .. image:: ../image/elabLogicEx1_1.png @@ -87,7 +88,7 @@ The following is a walkthough looking at the state after each tactic: .. image:: ../image/elabProofStateEx1_2.png :width: 312px - :height: 124px + :height: 84px * - logic now looks like this - logic From a13f2ab452b9b4c92b8a6c38b005dba8612c0503 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sun, 19 May 2019 11:30:28 +0100 Subject: [PATCH 23/45] more small changes --- docs/proofs/example1.rst | 40 ++++++++++--------------------------- docs/proofs/primitive.rst | 42 ++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 55 deletions(-) diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index a950364b83..2f742e672a 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -84,16 +84,12 @@ The following is a walkthough looking at the state after each tactic: - intro \`{{x}} * - state now looks like this - - state - - .. image:: ../image/elabProofStateEx1_2.png + - .. image:: ../image/elabProofStateEx1_2.png :width: 312px :height: 84px * - logic now looks like this - - logic - - .. image:: ../image/elabLogicEx1_2.png + - .. image:: ../image/elabLogicEx1_2.png :width: 126px :height: 45px @@ -106,9 +102,7 @@ The following is a walkthough looking at the state after each tactic: getHoles - - state. - - .. code-block:: idris + - .. code-block:: idris getEnv=[( `{{x}}, { @@ -138,16 +132,12 @@ The following is a walkthough looking at the state after each tactic: - fill (Var \`{{x}}) * - state now looks like this - - state - - .. image:: ../image/elabProofStateEx1_3.png + - .. image:: ../image/elabProofStateEx1_3.png :width: 312px :height: 124px * - logic now looks like this - - logic - - .. image:: ../image/elabLogicEx1_3.png + - .. image:: ../image/elabLogicEx1_3.png :width: 131px :height: 45px @@ -160,9 +150,7 @@ The following is a walkthough looking at the state after each tactic: getHoles - - state. - - .. code-block:: idris + - .. code-block:: idris getEnv=[(`{{x}}, {λ ({`{{Nat}}.["Nat", "Prelude"]}: {type const tag=8,0}). @@ -184,9 +172,7 @@ The following is a walkthough looking at the state after each tactic: getHoles=[{hole_2}, {hole_0}] * - getGuess - - state. - - .. code-block:: idris + - .. code-block:: idris {TT:Parameter name ref NameType=NameType just bound by intro @@ -204,9 +190,7 @@ The following is a walkthough looking at the state after each tactic: - solve * - logic now looks like this - - logic - - .. image:: ../image/elabLogicEx1_4.png + - .. image:: ../image/elabLogicEx1_4.png :width: 131px :height: 14px @@ -219,9 +203,7 @@ The following is a walkthough looking at the state after each tactic: getHoles - - state. - - .. code-block:: idris + - .. code-block:: idris getEnv=[] @@ -243,9 +225,7 @@ The following is a walkthough looking at the state after each tactic: getHoles=[{hole_0}] * - getGuess - - state. - - .. code-block:: idris + - .. code-block:: idris {TT:Bind name=`{{x}} diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index 4b64ad21d4..71f131ac0e 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -269,19 +269,17 @@ Primitive Operators debug : Elab a - Only seems to compile if 'debug' is last tactic so comment out following tactics like this: + If 'debug' is not the last tactic then make sure its type is sufficiently constrained. In particular, its type is Elab a, but there's no way for Idris to find out which type was meant for a. This can be fixed by either writing an explicit type (e.g. debug {a = ()}) or by using a helper that constrains the type (such as simple in Pruviloj, e.g. simple debug as a line). .. code-block:: idris %language ElabReflection idNat : Nat -> Nat - idNat = %runElab (do - intro `{{x}} - debug - -- fill (Var `{{x}}) - -- solve - ) + idNat = %runElab (do intro `{{x}} + debug {a = ()} + fill (Var `{{x}}) + solve) * - debugMessage - Halt elaboration, dumping the internal state and displaying a message. @@ -294,18 +292,16 @@ Primitive Operators debugMessage : (msg : List ErrorReportPart) -> Elab a - Only seems to compile if 'debug' is last tactic so comment out following tactics like this: + If 'debugMessage' is not the last tactic then make sure its type is sufficiently constrained. In particular, its type is Elab a, but there's no way for Idris to find out which type was meant for a. This can be fixed by either writing an explicit type (e.g. debugMessage [TextPart "message"] {a = ()}) or by using a helper that constrains the type (such as simple in Pruviloj, e.g. simple debug as a line). .. code-block:: idris %language ElabReflection idNat : Nat -> Nat - idNat = %runElab (do - intro `{{x}} - debugMessage [TextPart "error message"] - -- fill (Var `{{x}}) - -- solve - ) + idNat = %runElab (do intro `{{x}} + debugMessage [TextPart "error message"] {a = ()} + fill (Var `{{x}}) + solve) * - metavar - Create a new top-level metavariable to solve the current hole. @@ -442,21 +438,17 @@ Error Handling tryCatch : Elab a -> (Err -> Elab a) -> Elab a - Fixme - following does not work. - .. code-block:: idris %language ElabReflection - id1 : Elab () - id1 = do - tryCatch (intro `{{x}}) - (\err -> (intro `{{x}})) - fill (Var `{{x}}) - solve + f : Err -> Elab () + f (Msg _) = fill `("message error") + f (CantUnify _ _ _ _ _ _) = fill `("unification error") + f _ = fill `("other") - idNat : Nat -> Nat - idNat = %runElab id1 + s2 : String + s2 = %runElab (do tryCatch (fill `(True)) f ; solve) * - fail - Halt elaboration with an error @@ -482,5 +474,5 @@ Error Handling solve idNat : Nat -> Nat - idNat = %runElab id1 + idNat = %runElab id1 From d85b8c6e5a528dedca99ce0e905e142b4071adfe Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sun, 19 May 2019 17:07:15 +0100 Subject: [PATCH 24/45] more small changes --- docs/proofs/example1.rst | 16 ++++++++-------- docs/proofs/primitive.rst | 7 ++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 2f742e672a..2599423f98 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -83,17 +83,17 @@ The following is a walkthough looking at the state after each tactic: * - Introduce a lambda binding around the current hole and focus on the body. - intro \`{{x}} - * - state now looks like this + * - The state now looks like this: - .. image:: ../image/elabProofStateEx1_2.png :width: 312px :height: 84px - * - logic now looks like this + * - The logic now looks like this: - .. image:: ../image/elabLogicEx1_2.png :width: 126px :height: 45px - * - term now looks like this + * - The term now looks like this: - ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} * - getEnv @@ -131,17 +131,17 @@ The following is a walkthough looking at the state after each tactic: * - Place a term into a hole, unifying its type - fill (Var \`{{x}}) - * - state now looks like this + * - The state now looks like this: - .. image:: ../image/elabProofStateEx1_3.png :width: 312px :height: 124px - * - logic now looks like this + * - The logic now looks like this: - .. image:: ../image/elabLogicEx1_3.png :width: 131px :height: 45px - * - term + * - The term now looks like this: - ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} * - getEnv @@ -189,12 +189,12 @@ The following is a walkthough looking at the state after each tactic: * - Substitute a guess into a hole. - solve - * - logic now looks like this + * - The logic now looks like this: - .. image:: ../image/elabLogicEx1_4.png :width: 131px :height: 14px - * - term + * - The term now looks like this: - ?{hole_0} ≈ λ x . x . {hole_0} * - getEnv diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index 71f131ac0e..7e3d37b0f3 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -457,7 +457,9 @@ Error Handling fail : List ErrorReportPart -> Elab a - Return type is given by last term so fail cant be at the the last term, we would expect fail to be in some sort of conditional statement: + Note: we may need to make sure the return type 'a' is sufficiently constrained. If required add an explicit type {a = ()}. + + Below is some code which includes 'fail'. This will always fail but we could replace 'True' with some more useful condition. .. code-block:: idris @@ -469,10 +471,9 @@ Error Handling fill (Var `{{x}}) if True then - fail [TextPart "error message"] + fail [TextPart "put error message here"] else solve idNat : Nat -> Nat idNat = %runElab id1 - From 6255c0d1c0b744d3cf47e2de6f52f79e55f38d21 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Sun, 19 May 2019 17:42:46 +0100 Subject: [PATCH 25/45] add svg diagram --- docs/image/compareToProofAssist.svg | 73 ++++++++++++++++------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/docs/image/compareToProofAssist.svg b/docs/image/compareToProofAssist.svg index 4218be6895..76cfe93d42 100644 --- a/docs/image/compareToProofAssist.svg +++ b/docs/image/compareToProofAssist.svg @@ -18,6 +18,20 @@ sodipodi:docname="compareToProofAssist.svg"> + + + image/svg+xml - + @@ -167,56 +181,37 @@ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4436)" inkscape:export-xdpi="61.120499" inkscape:export-ydpi="61.120499" /> - High level program(unification algorithm) Tactics + x="314" + y="326.36221" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">Idris source fill holes(implicit variables, etc) + Tactics From 566daf7f7109433fd3dcf09864c74673ce883478 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Mon, 20 May 2019 19:04:41 +0100 Subject: [PATCH 26/45] changes to generatingData.rst --- docs/proofs/generatingData.rst | 171 +++++++++++++++++---------------- 1 file changed, 90 insertions(+), 81 deletions(-) diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 16950cc101..6599b545a1 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -1,11 +1,88 @@ Generating Data and Functions at Compile Time ============================================= -We can construct a data structure at compile-time in an Elab monad. +We can construct a datatype at compile-time in an Elab monad. This can allow proofs to be generated for user defined types or it could allow types to be automatically generated to support user defined types. An example is the code, from `Elaborator reflection: extending Idris in Idris`_, that automatically generates accessibility predicates using the Bove-Capretta method. -The following simple outline example is adapted from -``_ + +Here is a simple example constucting a boolean type: + +.. code-block:: idris + + module TwoDef + %language ElabReflection + + addTwo : Elab () + addTwo = do let twoname : TTName = `{{TwoDef.Two}} + declareDatatype $ Declare twoname [] `(Type) + defineDatatype $ DefineDatatype twoname [ + Constructor `{{F}} [] (Var `{{TwoDef.Two}}), + Constructor `{{T}} [] (Var `{{TwoDef.Two}}) + ] + + %runElab addTwo + +.. list-table:: + + * - This type is now availible to us as if we had compiled it in the usual way: + - .. code-block:: idris + + λΠ> :printdef Two + data Two : Type where + F : Two + T : Two + + * - The constructors are T and F: + - .. code-block:: idris + + λΠ> F + F : Two + λΠ> T + T : Two + +We can now add some function definitions to the above code: + +.. code-block:: idris + + let perm1 = `{{TwoDef.perm1}} + let F2 = `{{TwoDef.F}} + let T2 = `{{TwoDef.T}} + declareType (Declare perm1 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname)) + defineFunction $ DefineFun perm1 [ + MkFunClause (Var F2) (Var F2), + MkFunClause (Var T2) (Var T2) + ] + + let perm2 = `{{TwoDef.perm2}} + declareType (Declare perm2 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname)) + defineFunction $ DefineFun perm2 [ + MkFunClause (Var F2) (Var T2), + MkFunClause (Var T2) (Var F2) + ] + +.. list-table:: + + * - Here are the functions: + - .. code-block:: idris + + λΠ> :printdef perm1 + perm1 : Two -> Two + F = F + T = T + λΠ> :printdef perm2 + perm2 : Two -> Two + F = F + T = T + + * - This is what happens when we call the functions: + - .. code-block:: idris + + λΠ> perm1 T + F T : Two + λΠ> perm2 T + F T : Two + +Here is an example with parameters: .. code-block:: idris @@ -18,9 +95,9 @@ The following simple outline example is adapted from declareDatatype $ Declare dataname [MkFunArg `{{n}} `(Nat) Explicit NotErased] `(Type) defineDatatype $ DefineDatatype dataname [ Constructor `{{MkN}} [MkFunArg `{{x}} `(Nat) Implicit NotErased] - (RApp (Var `{{DataDef.N}}) (Var `{{x}})), + (RApp (Var dataname) (Var `{{x}})), Constructor `{{MkN'}} [MkFunArg `{{x}} `(Nat) Explicit NotErased] - (RApp (Var `{{DataDef.N}}) (RApp (Var `{S}) (Var `{{x}}))) + (RApp (Var dataname) (RApp (Var `{S}) (Var `{{x}}))) ] %runElab addData @@ -46,80 +123,8 @@ Which can be used like this: λΠ> :t MkN MkN : N x -Here is another, more complicated, example from the same test file. This also creates a function. -.. code-block:: idris - - module DataDef - %language ElabReflection - - mkU : Elab () - mkU = do - let U = `{{DataDef.U}} - let el = `{{DataDef.el}} - declareDatatype $ Declare U [] `(Type) - declareType $ Declare el [MkFunArg `{{code}} (Var U) Explicit NotErased] `(Type) - defineDatatype $ DefineDatatype U [ - Constructor `{{Base}} [] (Var U), - Constructor `{{Pi}} - [MkFunArg `{{code}} (Var U) Explicit NotErased, - MkFunArg `{{body}} `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U)) Explicit NotErased] - (Var U) - ] - defineFunction $ DefineFun el [ - MkFunClause (RBind `{{code}} (PVar (Var U)) - (RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U))) - (RApp (Var el) - (RApp (RApp (Var `{{DataDef.Pi}}) - (Var `{{code}})) - (Var `{{body}}))))) - (RBind `{{code}} (PVar (Var U)) - (RBind `{{body}} (PVar `(~(RApp (Var el) (Var `{{code}})) -> ~(Var U))) - (RBind `{{x}} (Pi (RApp (Var el) (Var `{{code}})) `(Type)) - (RApp (Var el) (RApp (Var `{{body}}) (Var `{{x}})))))), - MkFunClause (RApp (Var el) (Var `{{DataDef.Base}})) `(Bool) - ] - - %runElab mkU - -This code generates the following data and function: - -.. code-block:: idris - - data U : Type where - Base : U - Pi : (code : U) -> (el code -> U) -> U - el : U -> Type - el (Pi code body) = (x : el code) -> el (body x) - el Base = Bool - -.. list-table:: Usage - - * - We can then use U the data structure, like this: - - examples - - .. code-block:: idris - - λΠ> :t U - U : Type - λΠ> :doc U - No documentation for U - λΠ> Base - Base : U - λΠ> DataDef.Pi - Pi : (code : U) -> (el code -> U) -> U - - * - el is the function that has been defined: - - examples - - .. code-block:: idris - - λΠ> :t el - el : U -> Type - λΠ> el Base - Bool : Type - -So these are the functions that we can use to create data and functions in the Elab monad: +These are the functions that we can use to create data and functions in the Elab monad: .. list-table:: Generating Data and Functions :widths: 10 30 @@ -153,8 +158,10 @@ So these are the functions that we can use to create data and functions in the E * - addImplementation - Register a new implementation for interface resolution. - - @ ifaceName the name of the interface for which an implementation is being registered - - @ implName the name of the definition to use in implementation search + Arguments: + + - ifaceName the name of the interface for which an implementation is being registered + - implName the name of the definition to use in implementation search Signature: @@ -163,7 +170,9 @@ So these are the functions that we can use to create data and functions in the E * - isTCName - Determine whether a name denotes an interface. - @ name a name that might denote an interface. + Arguments: + + - name - a name that might denote an interface. Signature: From 08c0900d6271b7dd60e415b7a93944812a1f6507 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Tue, 21 May 2019 17:05:06 +0100 Subject: [PATCH 27/45] changes to generatingData.rst --- docs/image/generateDatatype.png | Bin 0 -> 23863 bytes docs/image/generateDatatype.svg | 540 ++++++++++++++++++++++++++++++++ docs/proofs/generatingData.rst | 35 ++- 3 files changed, 569 insertions(+), 6 deletions(-) create mode 100644 docs/image/generateDatatype.png create mode 100644 docs/image/generateDatatype.svg diff --git a/docs/image/generateDatatype.png b/docs/image/generateDatatype.png new file mode 100644 index 0000000000000000000000000000000000000000..8c67974eb975264b6f2939afa34fd426f748a5bc GIT binary patch literal 23863 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 WAb6JakoG + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + declareDatatype + defineDatatype + + Declare + name:TTNamearguments:List FunArgreturnType:Raw + TyDecl + + + MkFunArg + name:TTNametype:Rawplicity:Plicityerasure:Erasure + FunArg + ExplicitImplicitConstraint + + + ErasedNotErased + + + DefineDatatype + name:TTNameconstructors : List ConstructorDefn + DataDefn + + + Constructor + name:TTNamearguments:List FunArgreturnType:Raw + ConstructorDefn + MkFunArg + + + diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 6599b545a1..7ccc436c55 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -1,11 +1,29 @@ -Generating Data and Functions at Compile Time -============================================= +Generating Datatypes and Functions at Compile Time +================================================== -We can construct a datatype at compile-time in an Elab monad. +Program elements, such as datatypes and functions can be constructed at compile-time in the Elab monad. This can allow proofs to be generated for user defined types or it could allow types to be automatically generated to support user defined types. An example is the code, from `Elaborator reflection: extending Idris in Idris`_, that automatically generates accessibility predicates using the Bove-Capretta method. -Here is a simple example constucting a boolean type: +Generating Datatypes +-------------------- + +There are two main 'tactics' associated with generating datatypes: + +- declareDatatype +- defineDatatype + +Which declare and define the datatype as the names suggest. + +.. list-table:: + + * - These 'tactics' and the data structures associated with them are listed in the tables later on this page, for now, here is a summary: + - .. image:: ../image/generateDatatype.png + :width: 332px + :height: 246px + :alt: diagram illustrating data structures associated with declareDatatype defineDatatype. + +Here is a simple example constructing a boolean type: .. code-block:: idris @@ -24,7 +42,7 @@ Here is a simple example constucting a boolean type: .. list-table:: - * - This type is now availible to us as if we had compiled it in the usual way: + * - This type is now available to us as if we had compiled it in the usual way: - .. code-block:: idris λΠ> :printdef Two @@ -40,7 +58,10 @@ Here is a simple example constucting a boolean type: λΠ> T T : Two -We can now add some function definitions to the above code: +Generating Functions +-------------------- + +We can now add some function definitions to the above datatype: .. code-block:: idris @@ -289,6 +310,8 @@ The above functions use the following data/records: ||| fully-qualified, and it must have been previously declared as a ||| datatype. name : TTName + ||| A list of constructors for the datatype. + constructors : List ConstructorDefn * - CtorArg - CtorParameter From 231d842304908f8976bf28e89a3688ec5d36d533 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Tue, 21 May 2019 17:36:58 +0100 Subject: [PATCH 28/45] changes to generatingData.rst --- docs/image/generateFunction.png | Bin 0 -> 21310 bytes docs/image/generateFunction.svg | 588 ++++++++++++++++++++++++++++++++ docs/proofs/generatingData.rst | 24 +- 3 files changed, 610 insertions(+), 2 deletions(-) create mode 100644 docs/image/generateFunction.png create mode 100644 docs/image/generateFunction.svg diff --git a/docs/image/generateFunction.png b/docs/image/generateFunction.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1b7277bc153b042023a3eaf8e9d4e1d614d68f GIT binary patch literal 21310 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 LNkvXXu0mjf>7@Ew literal 0 HcmV?d00001 diff --git a/docs/image/generateFunction.svg b/docs/image/generateFunction.svg new file mode 100644 index 0000000000..a5c37e0eb4 --- /dev/null +++ b/docs/image/generateFunction.svg @@ -0,0 +1,588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + declareType + defineFunction + + Declare + name:TTNamearguments:List FunArgreturnType:Raw + TyDecl + + + MkFunArg + name:TTNametype:Rawplicity:Plicityerasure:Erasure + FunArg + ExplicitImplicitConstraint + + + ErasedNotErased + + + DefineFun + name:TTNameclauses : List (FunClause a) + FunDefn + + + MkFunClause + lhs:arhs:a + FunClause + MkImpossibleClause + + lhs:a + FunClause + + + diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 7ccc436c55..a03c1bb589 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -61,6 +61,21 @@ Here is a simple example constructing a boolean type: Generating Functions -------------------- +There are two main 'tactics' associated with generating functions: + +- declareType +- defineFunction + +Which declare and define the function as the names suggest. + +.. list-table:: + + * - These 'tactics' and the data structures associated with them are listed in the tables later on this page, for now, here is a summary: + - .. image:: ../image/generateFunction.png + :width: 332px + :height: 246px + :alt: diagram illustrating data structures associated with declareDatatype defineDatatype. + We can now add some function definitions to the above datatype: .. code-block:: idris @@ -144,10 +159,12 @@ Which can be used like this: λΠ> :t MkN MkN : N x +Table of 'tactics' for Generating Data and Functions +---------------------------------------------------- These are the functions that we can use to create data and functions in the Elab monad: -.. list-table:: Generating Data and Functions +.. list-table:: :widths: 10 30 :stub-columns: 1 @@ -199,9 +216,12 @@ These are the functions that we can use to create data and functions in the Elab isTCName : (name : TTName) -> Elab Bool +Table of Datatypes Associated with Generating Data and Functions +---------------------------------------------------------------- + The above functions use the following data/records: -.. list-table:: Generating Data and Functions data/records +.. list-table:: :widths: 10 30 :stub-columns: 1 From ff054c14eca57692078b32c7e2491567435d5523 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 22 May 2019 08:00:09 +0100 Subject: [PATCH 29/45] changes to generatingData.rst --- docs/proofs/generatingData.rst | 78 ++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index a03c1bb589..299464ed42 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -23,7 +23,17 @@ Which declare and define the datatype as the names suggest. :height: 246px :alt: diagram illustrating data structures associated with declareDatatype defineDatatype. -Here is a simple example constructing a boolean type: +.. list-table:: + + * - As a first example, the following boolean-like type can be constructed. When the compiler has run it will be available to us as if we had compiled it in the usual way: + - .. code-block:: idris + + λΠ> :printdef Two + data Two : Type where + F : Two + T : Two + +This was generated by the following code: .. code-block:: idris @@ -42,15 +52,7 @@ Here is a simple example constructing a boolean type: .. list-table:: - * - This type is now available to us as if we had compiled it in the usual way: - - .. code-block:: idris - - λΠ> :printdef Two - data Two : Type where - F : Two - T : Two - - * - The constructors are T and F: + * - The constructors T and F can be called as would be expected: - .. code-block:: idris λΠ> F @@ -76,7 +78,23 @@ Which declare and define the function as the names suggest. :height: 246px :alt: diagram illustrating data structures associated with declareDatatype defineDatatype. -We can now add some function definitions to the above datatype: +Note: FunClause - holds a 'let' clause, the left hand side (lhs) and right hand side (rhs) must have the same type. TT does not have 'where' clauses because they are desugared out. + +.. list-table:: + + * - Some function definitions can now be added to the above datatype. This is what they will look like: + - .. code-block:: idris + + λΠ> :printdef perm1 + perm1 : Two -> Two + F = F + T = T + λΠ> :printdef perm2 + perm2 : Two -> Two + F = F + T = T + +This was generated with the following code: .. code-block:: idris @@ -98,18 +116,6 @@ We can now add some function definitions to the above datatype: .. list-table:: - * - Here are the functions: - - .. code-block:: idris - - λΠ> :printdef perm1 - perm1 : Two -> Two - F = F - T = T - λΠ> :printdef perm2 - perm2 : Two -> Two - F = F - T = T - * - This is what happens when we call the functions: - .. code-block:: idris @@ -118,7 +124,21 @@ We can now add some function definitions to the above datatype: λΠ> perm2 T F T : Two -Here is an example with parameters: +So far these datatypes and functions could have been written, statically, in the usual way. However, it is possible to imagine situations where we may need a lot of functions to be generated automatically at compile time. For example, if we extend this Boolean datatype to a datatype with more simple constructors (a finite set), we could generate a function for every possible permutation of that datatype back to itself. + +A Different Example which has Type Parameters +--------------------------------------------- + +.. list-table:: + + * - Here is an example of a datatype with type parameters: + - .. code-block:: idris + + data N : Nat -> Type where + MkN : N x + MkN' : (x : Nat) -> N (S x) + +This was produced by the following code: .. code-block:: idris @@ -138,15 +158,7 @@ Here is an example with parameters: %runElab addData -So this declares and defines the following data structure 'N' with a constructor 'MkN' which can have an implicit or an explicit Nat argument. - -.. code-block:: idris - - data N : Nat -> Type where - MkN : N x - MkN' : (x : Nat) -> N (S x) - -Which can be used like this: +So this declares and defines the following data structure 'N' with a constructor 'MkN' which can have an implicit or an explicit Nat argument. Which can be used like this: .. code-block:: idris From 1b71663573563e2741507ac7183e9a94a5009fbb Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 22 May 2019 08:19:39 +0100 Subject: [PATCH 30/45] changes to tactics.rst --- docs/proofs/tactics.rst | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 376b2b5a3e..632b472215 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -7,7 +7,9 @@ Before looking at the Elab monad we need to know how to construct terms. Proof State -=========== +----------- + +The terminology 'Proof State' is used by analogy to proof assistants but, as used here, it's really more of a metaprogramming state. Tactics operate on the proof state. The proof state contains various pieces of information, at this stage, the important ones for us are: @@ -75,9 +77,9 @@ A user defined name can be constructed like this: ) Quasiquotation -============== +-------------- -Since names are used frequently in elaborator reflection there is a shortcut for constructing them: +Since names are used frequently in elaborator reflection there is a shortcut for constructing them: .. list-table:: Quasiquotation @@ -150,7 +152,7 @@ quasiquotation summary: +------------+-----------+----------------------------------------------------------+ TT -== +-- There is a notation for a term in TT as it is being constructed (based on a BNF-like grammar), this is used for example in the debug output, it is a compact way to see the state of the term so it is used here. So internally the program is stored as a tree structure using the following syntax: @@ -239,6 +241,7 @@ De Bruijn index which is a integer where: Raw --- + Raw is similar to TT except it is used before types are known. The types should be resolved by the type checker. .. code-block:: idris @@ -258,7 +261,7 @@ Raw is similar to TT except it is used before types are known. The types should RConstant Const | Expression Syntax -================= +----------------- There is a way of notating expressions such as those used in the proof state (example: goal type and proof terms) which is reasonably standard in the papers written about this subject. @@ -337,7 +340,7 @@ which introduces another guess. The solve tactic completes the proof Binders -======= +------- Here we look at each tactic in turn to see how they affect the proof state. From 543a382a0f141ed5d21231c262bd822ae9a1e51c Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 22 May 2019 08:47:53 +0100 Subject: [PATCH 31/45] changes to tactics.rst --- docs/proofs/tactics.rst | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 632b472215..71033c2094 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -81,21 +81,17 @@ Quasiquotation Since names are used frequently in elaborator reflection there is a shortcut for constructing them: -.. list-table:: Quasiquotation +.. list-table:: * - An unresolved variable "x" is wrapped in backtick and double braces: - - example - - .. code-block:: idris + - .. code-block:: idris Idris> `{{x}} UN "x" : TTName * - Single braces are used for existing variables: - - example - - .. code-block:: idris + - .. code-block:: idris Idris> `{x} No such variable x @@ -105,9 +101,9 @@ Since names are used frequently in elaborator reflection there is a shortcut for * - brackets are used for an expression: - - example here type is inferable - .. code-block:: idris + here type is inferable + - .. code-block:: idris Idris> :let a=2 Idris> `(a) @@ -115,18 +111,14 @@ Since names are used frequently in elaborator reflection there is a shortcut for * - Expression with explicit type: - - example - - .. code-block:: idris + - .. code-block:: idris Idris> `(a:Integer) P Ref (UN "a") (TConst (AType (ATInt ITBig))) : TT * - If we want the value we can escape from quasiquotation by using anti-quotation (tilde) - - example - - .. code-block:: idris + - .. code-block:: idris Idris> `(~a) 2 : Integer From 671bb4d633ec02560908f72aadee7e7a32fe414f Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 22 May 2019 08:55:45 +0100 Subject: [PATCH 32/45] changes to primitive.rst --- docs/proofs/primitive.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index 7e3d37b0f3..a8c9d59e91 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -323,7 +323,7 @@ Primitive Operators Read and Write State -==================== +-------------------- .. list-table:: :widths: 10 30 @@ -424,7 +424,7 @@ Read and Write State check : (env : List (TTName, Binder TT)) -> (tm : Raw) -> Elab (TT, TT) Error Handling -============== +-------------- .. list-table:: :widths: 10 30 From b093a14c56348b20e8a2a3f3aa5676adfe2ff56f Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Wed, 22 May 2019 17:00:47 +0100 Subject: [PATCH 33/45] add diagram to illustrate Raw structure used for function definition --- docs/image/generateFunction2.png | Bin 0 -> 9734 bytes docs/image/generateFunction2.svg | 430 +++++++++++++++++++++++++++++++ docs/proofs/generatingData.rst | 13 +- 3 files changed, 441 insertions(+), 2 deletions(-) create mode 100644 docs/image/generateFunction2.png create mode 100644 docs/image/generateFunction2.svg diff --git a/docs/image/generateFunction2.png b/docs/image/generateFunction2.png new file mode 100644 index 0000000000000000000000000000000000000000..70ccd22b083f95c6f1f2faa44c19a3e78dba0881 GIT binary patch literal 9734 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 bzgpi1Xjt;?4ID0Owy5sto9Wf)BC-Dq(W(i9 literal 0 HcmV?d00001 diff --git a/docs/image/generateFunction2.svg b/docs/image/generateFunction2.svg new file mode 100644 index 0000000000..10008bf4a6 --- /dev/null +++ b/docs/image/generateFunction2.svg @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + RBind TTName (Binder TT) TT + lhs:arhs:a + FunClause + + Raw + + PVar a (Binder a) + + RApp Raw Raw + + + Binder a + `{{code}} + `{{body}} + + + + + diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 299464ed42..5b72780230 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -76,9 +76,18 @@ Which declare and define the function as the names suggest. - .. image:: ../image/generateFunction.png :width: 332px :height: 246px - :alt: diagram illustrating data structures associated with declareDatatype defineDatatype. + :alt: diagram illustrating data structures associated with function declare and define. + +Note: The left hand side (lhs) and right hand side (rhs) of FunClause typically is of type 'Raw'. + +.. list-table:: -Note: FunClause - holds a 'let' clause, the left hand side (lhs) and right hand side (rhs) must have the same type. TT does not have 'where' clauses because they are desugared out. + * - Bound pattern variables are represented by 'PVar' binders: + This diagram shows an example of a possible Raw structure that might be used in a function definition. + - .. image:: ../image/generateFunction2.png + :width: 264px + :height: 239px + :alt: diagram illustrating data structures associated with functions. .. list-table:: From 75feef7e0bca615a2071beed7b3240a9a520f14d Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 23 May 2019 08:17:37 +0100 Subject: [PATCH 34/45] fix example code for generating functions --- docs/proofs/generatingData.rst | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/docs/proofs/generatingData.rst b/docs/proofs/generatingData.rst index 5b72780230..9c43e7bb6d 100644 --- a/docs/proofs/generatingData.rst +++ b/docs/proofs/generatingData.rst @@ -42,10 +42,12 @@ This was generated by the following code: addTwo : Elab () addTwo = do let twoname : TTName = `{{TwoDef.Two}} + let F2 = `{{TwoDef.F}} + let T2 = `{{TwoDef.T}} declareDatatype $ Declare twoname [] `(Type) defineDatatype $ DefineDatatype twoname [ - Constructor `{{F}} [] (Var `{{TwoDef.Two}}), - Constructor `{{T}} [] (Var `{{TwoDef.Two}}) + Constructor `{{F}} [] (Var `{{TwoDef.Two}}), + Constructor `{{T}} [] (Var `{{TwoDef.Two}}) ] %runElab addTwo @@ -96,31 +98,29 @@ Note: The left hand side (lhs) and right hand side (rhs) of FunClause typically λΠ> :printdef perm1 perm1 : Two -> Two - F = F - T = T + perm1 F = F + perm1 T = T λΠ> :printdef perm2 perm2 : Two -> Two - F = F - T = T + perm1 F = T + perm1 T = F This was generated with the following code: .. code-block:: idris let perm1 = `{{TwoDef.perm1}} - let F2 = `{{TwoDef.F}} - let T2 = `{{TwoDef.T}} declareType (Declare perm1 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname)) defineFunction $ DefineFun perm1 [ - MkFunClause (Var F2) (Var F2), - MkFunClause (Var T2) (Var T2) + MkFunClause (RApp (Var perm1) (Var `{{TwoDef.F}})) (Var F2), + MkFunClause (RApp (Var perm1) (Var `{{TwoDef.T}})) (Var T2) ] let perm2 = `{{TwoDef.perm2}} declareType (Declare perm2 [MkFunArg `{{code}} (Var twoname) Explicit NotErased] (Var twoname)) defineFunction $ DefineFun perm2 [ - MkFunClause (Var F2) (Var T2), - MkFunClause (Var T2) (Var F2) + MkFunClause (RApp (Var perm1) (Var `{{TwoDef.F}})) (Var T2), + MkFunClause (RApp (Var perm1) (Var `{{TwoDef.T}})) (Var F2) ] .. list-table:: @@ -128,10 +128,14 @@ This was generated with the following code: * - This is what happens when we call the functions: - .. code-block:: idris + λΠ> perm1 F + F : Two λΠ> perm1 T - F T : Two + T : Two + λΠ> perm2 F + T : Two λΠ> perm2 T - F T : Two + F : Two So far these datatypes and functions could have been written, statically, in the usual way. However, it is possible to imagine situations where we may need a lot of functions to be generated automatically at compile time. For example, if we extend this Boolean datatype to a datatype with more simple constructors (a finite set), we could generate a function for every possible permutation of that datatype back to itself. From 19d6e296c26dd11666773d93caa911e3d9e30191 Mon Sep 17 00:00:00 2001 From: Martin Baker Date: Thu, 23 May 2019 11:53:47 +0100 Subject: [PATCH 35/45] tidy up diagrams for example --- docs/image/elabProofStateEx1_3.png | Bin 7147 -> 4466 bytes docs/image/elabProofStateEx1_3.svg | 86 ++++++++++------------------- docs/proofs/example1.rst | 8 +-- 3 files changed, 32 insertions(+), 62 deletions(-) diff --git a/docs/image/elabProofStateEx1_3.png b/docs/image/elabProofStateEx1_3.png index 228582bd128de389313c9b39bdeead17ae347582..53204fd52c0f4942defd0a648ddfd726e5810afe 100644 GIT binary patch delta 4412 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 diff --git a/docs/image/elabProofStateEx1_3.svg b/docs/image/elabProofStateEx1_3.svg index fd4d243e21..4c4aee2643 100644 --- a/docs/image/elabProofStateEx1_3.svg +++ b/docs/image/elabProofStateEx1_3.svg @@ -63,7 +63,8 @@ style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve" inkscape:export-xdpi="61.120499" - inkscape:export-ydpi="61.120499"> + inkscape:export-ydpi="61.120499" + inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" /> + inkscape:export-ydpi="61.120499" + inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" /> + inkscape:export-ydpi="61.120499" + inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" /> - + inkscape:export-ydpi="61.120499" + inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" /> + inkscape:export-ydpi="61.120499" + inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/example1/elabProofStateEx1_3.png" /> (hole_2 , Nat) - - machine chosennames for the holes - Date: Mon, 1 Jul 2019 08:05:25 +0100 Subject: [PATCH 36/45] update hole diagrams & remove reference to logic --- docs/image/elabLogicEx1_1.png | Bin 2424 -> 2603 bytes docs/image/elabLogicEx1_1.svg | 48 ++++++++++++++++++---------------- docs/image/elabLogicEx1_2.png | Bin 2421 -> 2456 bytes docs/image/elabLogicEx1_2.svg | 33 +++++++++++------------ docs/image/elabLogicEx1_3.png | Bin 2421 -> 2494 bytes docs/image/elabLogicEx1_3.svg | 41 ++++++++++++++--------------- docs/proofs/example1.rst | 20 +++++++------- 7 files changed, 69 insertions(+), 73 deletions(-) diff --git a/docs/image/elabLogicEx1_1.png b/docs/image/elabLogicEx1_1.png index 3282350c2990446b070519fdf0d9698a4985b78d..603082aba9746124b2495350b9c04dfe3bb82cc4 100644 GIT binary patch delta 2555 zcmV;CS!zu%qvyCXy8 z{jT*}^EMnuoBMt@u z{bSJQV;^znMU+2CCV(#DO@MsyPoO;peHZXrOdf}UBQfZYSe-aH1SDh7f48H)=Za3C zC6+|c3j8|;{Wjpym^|{qO~92o(#9Rvxb~DZ9&zwG@UIy3`Pgh5&=G^aH|!&ydC`Jo zBLUPJ!`7IMyoLs`fC36Apnw7jDB$Rz&#@MufHxK13rqo?&VhCS@L7~r?~BQ&-0H_! zc7~x2?Hj~h()1Jqjjxlxe+ccvbYV-3qXfq%8Q@cb#xl+_FbzY1^}y*l(tilJCl5X+ z1M`8&dDIP}1Z_B0^st?LFbg;_P_6^c=moyx(dN3_R2yjJ5xu~>r&tSY$&t1k8TW#i zJicZ1lEAGo>-zX5@WURqkq?$5`9EOgx6u7qTmXE!hkUDyPjJ6&eNJ{IN3NN4qs?{!E= zpR;m}l`qOt=ZnD2J>>gFz&Vw%z)aFl8^!=<0+m+woyq`U8gNRM_NQB&24J?mpXSk= zYW#z!1||UGjE9q}e;#;S7JgO6Yn+vffl1bf8TPFV1)ECy%|H2>Lgs{YPUU43IDMy5 zhU{pfm5&F04(tfX5{1#-^v5~mdG^hBDwC`~C1_9f<3>Lp^*;m7sVqSmzyeZ7cw>O8 zfJR`HeOpHQMEan8J12|a`+=_q1m5obemt5u{&Ce+z}dhTe^7@LNKv0hgC5nNB_`85 z?At6f5Es~cKVT8C6dB?ouZ_{b3NnukThLhDYvrI*83Zgu#^H|a8;$-xG?r1QCuJ;Q za89MwWb>WMyMV6%m!UCyCo;C(!27eb+Z$Mm#;6$ulnwTM5jp|cgZkA#x>FenJOdm+ zCo*dy+FyjyfA%6|;7Q_y{sBCPmPf0skF8d|D?(m}7T`hP-DDom zJE!tjG!{cicPjTA@0X2cRG?qYz{oI$&Z#t^fpx|@e-bHlvoY8Q3?tpCtUzne`_NI} zf^Irj3_ObrEr@!gcz@z`B4ur`_bbsdDoJ?sF9KcywgNvz13nHZ@CeE>E<@>Z8}K7E z;7wjTQ%#;q?|Tc1x?L#32A#@7$XI@0@|}$`g(UC@ii%N~Yi<4pIX>U}Ux(JW+ifg@ zPURe{fBS8ux! zf1byH7l7N5vv9ZqIlNNfe5AOQ$iVNmIu5hZk`Uy0)*)v#*UDcdGo|f94&n)9%nng*m9CJHN26h6y3mn)oHdx4X>p)Ce}Vzis=n=`a_)R$tDeUE+5f9Kv! zBXSbKJ&o1KpzbA=jz?h^@Z-RHC34vFP*hzXQEv;%NLB>ConiDhBfb4EobK&KPGTyG zw$n&=x>&gb?T<90{fgg)wDmk1>q(?CyyrZc6VW7j#rr-OP5jBo&USYr_hOT4CfX|t zyB)j>Wf#??_TGHdBm0Xw;kpzpe_tIgMsuwe>G`Afy(>b7%f0eTD7#q=e3$5bz>UDe z=)~>-3Tz)i^L9J1Gr$)VAb{MjJU@;c%SFH^tbxY^zqg|lsRKp*O=!sxhNbr0g4S#e zq^J19kS7isplSA;N#^#3Chxk7~k{JJn4^u%t>gqkPUN?9o$6shb&hh zoq+aHcA!2zg7j8_baD_m))T@SsX(dG94l`^CkG%!zKT4&JF!_zDqXBYsdyV&H%~|V zBDH~MI8t_#_Y4cja0>FKHJ)sp$gmFB-!W)sz6mL})_clq09w&NfA2)8oCyK>GzRZO zM)fS(OncD!G6;AN8n=yE+U*TglG@}SiuB}AjvTHFCPnspX`nnFP2dDNKK1R$)g4dt zDM;9oVHKME!_kCuf6jO$Iyku9C=*MIWmlToR2SrL$tBqf)fIcJsCZ&D*HJ`-WmKsUxZ+n&kPS z6J3T1gWDhrK9}a$?hLd)GZ9V5V?FT-$PG0p%MCvHF87>MQHjDtkI%Fm+pR*G?0&SB zu!i3GKf3~Q#C~#j6mf7KT7n!#spZ(Cz@vcwZdB9#9$miZkD`0jwTJ&Z{0FvtR+`Gd RL8Jfx002ovPDHLkV1h?F+jjr} delta 2375 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 diff --git a/docs/image/elabLogicEx1_1.svg b/docs/image/elabLogicEx1_1.svg index 6f94e00bc4..a7861538f4 100644 --- a/docs/image/elabLogicEx1_1.svg +++ b/docs/image/elabLogicEx1_1.svg @@ -14,9 +14,9 @@ viewBox="0 0 744.09448819 1052.3622047" id="svg2" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" sodipodi:docname="elabLogicEx1_1.svg" - inkscape:export-filename="/home/master/euclid/prog/idris/elaborator/elabTactics/elabLogicEx1_1.png" + inkscape:export-filename="/home/mjb/Idris-dev/docs/image/elabLogicEx1_1.png" inkscape:export-xdpi="61.120499" inkscape:export-ydpi="61.120499"> + inkscape:window-maximized="1" /> @@ -47,7 +47,7 @@ image/svg+xml - + @@ -56,15 +56,14 @@ inkscape:groupmode="layer" id="layer1"> hole_0 : pi_arg : Nat -> Nat + x="428.125" + y="472.23718" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : pi_arg : Nat -> Nat + inkscape:connector-curvature="0" + inkscape:export-xdpi="61.120499" + inkscape:export-ydpi="61.120499" /> + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:export-xdpi="61.120499" + inkscape:export-ydpi="61.120499" /> diff --git a/docs/image/elabLogicEx1_2.png b/docs/image/elabLogicEx1_2.png index 7c534698788a9fac683993353e00694789482606..b5368724166ce7a344eadbfc2019dbaae84d5571 100644 GIT binary patch delta 2407 zcmV-t37Gcv5||SqiBL{Q4GJ0x0000DNk~Le0003O0000Q2nGNE0G&D*zL6nJe+d;y zL_t(|obB9s(3Mpk!0`{8qM~S~35ZrED4FBZ;!=|+I;B%uDP@wHCI+~cnp@bIgO+V( ziKaD~+Jv-Nnq^{crJY62`e<0`M6Yf&1FkG zhAu3@6*v&jr}Tf?2k(%{WY$2o6+&PE?!th|{f)40C9DuGAH}P}0NTJy* z6&lhv@UK33gG?r~%B*g)2>yxNg=ut!5E5lx#4AnW-Y7JYZlzGMP*!lgVTM^>H_Ud~NH}KO zWeA3Kn8&abuU!VIIh)(1(?4N===f_gcZpfJ)y-x&ugSfkLWp)kqpcvV=#7x>>pa$m z_OPm4jZahq2aDCP?Tmmgh^gOpSt_QG+hrLZ$MO#1EXPY7JWq_;%Q|>|g?RT)Sfu$v z!Djrg!{?V^affl9e-~5vOFE3#E`!BvUQhYA%L1LhW2g1FSZDRIQoKheblM*JBahy+ z>xH6US7{WM$z(E_Or|gB#N=IDcrCtDCew|vxLGWKY=_T?{b-%CC#K=;9me})5BVL0 zqk2)ERppI1MEI}@J}gceXooL}tv9R6h*XX(OJN7-yq>|Pf5P6YbIvs344vEW>)}ky z#)a6t&3NbN?kpUS%Y?(V85`@|!IxQmyi>HNcAdwUYcT8315<>}KS%h|4sA2u_IOI` zeQu|So%sFD5u)B^mBJR{{1$PJ!=KXc;o|s`@vB&l15!C|QS-}oso%a+<}f^hb^2oC zVo%Hz6>)zmf5`XRjCU~3N^ywMaI)4@c8^;<5lj=l4m=||=%X$2K2+@BpDqSwLI6xm z=?um0>Gx!utzOVh(Of&4i1#%Je|JjrLZKawNzaZIf9?GRac0sPEy_;p(K}4f)82cl z^}8~=;_K)ijGEF*kjVY!GL2F(vh9Tq#bAYs6ESiWw>W z>Pd2A#IX&HRKOMZs`}}}ZEzj_h98N&NHfLs`LXy&ld@#`hl%0{j+xj`bg$e=ti3iedzx*d*<(@bC1y3tLz2ZinhEjzNp@$7$NGR5p#s_DhtLPQksR}x=rIHA9vurT5Im> z;9^mK7vN1T%27Qfay0G~rrWqwj&4gynhBRde?l6K7t(wWp^O$dTf_yB%VxxWD4#eW*a{k52Kn^6g$CRF0%MC1LO7|oUnn}2STvSj*))78wC z?ZxOeUyO!FixG6c(({{&jy)F-3Zc&Zeejue{La&cN+BSDqvUtUe$gTzSuV!AHA%cFCl#cU>2@89ANP11cv&F{7$p6;ML zjoN>)ZmOplm!pK=aD`~A<+Wmq()ZAm&mz6!IpOy?Rn2tSMQD9ni4IQVb!vq+fAeZ7 z>W1%uiw6>a!=GOEDrW7L~nj>9eTv z+)`oA%oYyYva~I;fiQ;#3d!H;0-PK1Gu>^#S=dn=G}YB%dYS&`CZWMh7K6(Y(P0X@ zgkyJ@&{mh>fhK9)D$e#fM9l8oe^$9a7MG~^xpb)=Bu}*OsY2^rF3u%t#m=JhKP=4f zMyAP~Dcu=3p-DQ&sy}DC%vJb(Dg7OVHgs>wm*`82g&W}D6gEOA0Z*3FdRdq_bHrh8 zTc_tQ5|+eN%@@`cr$iP)Zk!OF^VD1*MLFQ`b{)Fc3L)_0^jVt13RViUe`s%^vP~0} z(1ehf93)ihF45>$3X}OUp^|SQ2CiKzpHaf;d$$l$Hwm-6%y8k8t7;;@Qq#7H z5q>w}6FDZ8D2WKWL`LE8Sm6=@%>QPZFkTmvE0U~TZ*W3YomyYmfV0GG&Z)x2`?;E}JODosjbN|z5@)CINy1!te?mBlCh5M}=^>$h zl}8N1Syb4+!-XU75-~CqoGhHd*QDzMh2Q5~A)KZO_4H}+CtobQ>W7MozfERsW{_x$ zWiAyeeQy{gOy}{UElt;a@6#7_ckC|Kdhjb4EPR)@2%&YR=pXm?s>JOxTD;pnYSYvG zPG9eeo}o5HM@ZjRJ#*xlOn)*#tmSw>Xi=^FguP*i7aUh{1n$KjhVv Z{{wZB=%ana!W#ep002ovPDHLkV1n$1&p-eG delta 2372 zcmV-K3A^@~6ZH}yiBL{Q4GJ0x0000DNk~Le0001k0000j2nGNE0F8^-_>mz@e+cqP zL_t(|ob8-zf4RRrpbXf|TyG7O`0nWrbO>ob0caIa-VE3c=w`0l zAVL@kbX<@5T4Wj3z-vHHU@dThul^(89$%Tm8GZonAe}Rm0X4w4K)tCS2K)~E1w53E zhp=cIbVrL;3%m;C`0CpMg}yR}7>1d)2jLRK?!YM1?oMEZX)_I2)cDiie{|8?v3n1UA7i(k=>4#K0r9N=zG*$QAd@CI-MP}G={wQ!LQV%QtlANU-}^gLgEH(<+% z_U8j#JlCfo9bue`{l|w?g8=iw;0bU)g4+T~t52BTJ(USLf)7IEICVg@uKM zMRwu$0a$FfXoYmCxX1@uht#bCmiY^FfXhP~6ap<03=UERlMq;QlKTxdPk4V3$xP5( zpl!l2S|XQuT;$;@$NvQ$22S)B<^W$3y?}MV>V$*+mhk@7W}LW4e*w!Aj`1hq&aNP= z!}WH?#UIEFj*GvMTRjO@A~%0r)FV#d#jn8PgyULRSXfwCc(EmtC&$LTeHT4w<=eNlse{5In3(P_b<(OH=n6gTga^^=nU=r{Oa4X>^;}*bWz{RGop1%5W zU_R-QO9v@nBANLR9TBH_8Ra|_0XLhv5x_nnbFuIsj2Jotvw@RHpFtd_(zF}pD<22!e}M8Q&O>4FYE!om_%38F z77_4^iEq%09)om=97I4Xfva%EL;-T0xKX1kxe*+wvus;ifxSII0$j?0$cmNT@bDsLOz*9gU#9a;{JOg?+65riF!tg@uKM zg+&%&)84|dA!cFa;2vs@ixy7}XB8AVgQ@s!~xRuTu-qZrNlqSVY|J5Sm1 zC?J>^O_Av|1jQvPk*xIRCWN6BMMXPD+%p_Se@vSigVB4d@{}zD#z(X{1NhARZjPe8 z1J`pNhnjhKKa#Q-1sKC{BKk5;L6`<#4opUi?U*Hdn6kTpT>{z^q70@75Os$2eGZC( z4lsS4>#HwCpXTv@3+hZ1K>Hd6!)`*~Znz&M$$*rqsPh0vqMV1@%s2qoqGX&&C|j$S ze|gT!QI2MRUmvFy;z;OZPdm_S^h$5(6(2ng2T#Xde$!5GLl$h}wvex>dq$EFf zL+OT-(L3A~DfKz}SkvJ$uJ97c)N9aKhIub<_#{!pz^u0B(#Qgrw zTzgH|0%U6XkCOF62{9mIyb680VH*@Nf9--64kbGyfQ(K_LpM$Kp)udY<^O0DIN)XORn_vk_Ix3Ht$E~D) z6r}{MTRXH7su58+7T=06Vz>kC#9A}pP-K=2MQlC~INEc69uh4JQTX~3!dYGcf3ErH ze4xW?+Ac;rc!{rFDVgU3Pc?HYz~v5Mn1e#X{Zvo-*+M7#sn9&YtLEW?@H6htYH21N z=eXE9f}LM=h^QJmlsW{-&TGsZyaed%4(FNt$I;?q6>uT&B(6`U2O`ArXb~XTuj6dY zdQaJpxSZ}s^u9(R5mSP=acw|fbto5f2Ci>mdz3IdC2SsXy?#}QH8Od|ay(giC zxdQkCE$F_a`^A4iGOsn#FWx6pwd3W%O>EH2AUV?OlPf$kK6h!1NnfqFx{LvXmEyyZf!c58vX%fS^C&gw_-#90000 hole_0 : (pi_arg : Nat) -> Nat + x="422.5" + y="472.23718" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : (pi_arg : Nat) -> Nat x : Nat + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x : Nat diff --git a/docs/image/elabLogicEx1_3.png b/docs/image/elabLogicEx1_3.png index 7c534698788a9fac683993353e00694789482606..0fb2abfffd5d43ba1d5fe3b3d6fd4fa248efc53c 100644 GIT binary patch delta 2445 zcmV;833B%J62225iBL{Q4GJ0x0000DNk~Le0003Z0000Q2nGNE02AO*!jU0Ne+fHD zL_t(|ob8=|kXBV0$3MHvE-bh}5G*XZjjI_yT5ScJsmLioEQ68$D20lj3A308mZc=a z+8`nnT56Le!dO!>X*SY^KUPf&v?if6xS+1g4qmQRaGnjx^JNS>0PLkH_;)P+H*p%7O7f zwYeS#oaMwh4;T@X{tjS3M0kJT!@xP_dN|Msd<{7J|ERCWzuGApcB{+tR_<&_n12_(>0pFiQubVVK0)AK6s(U=1Q$eApW&k^ZXVCQP2NCxVAwd(m z-?qX!fa`!qfsX-|1*)gV<0%rlLl9jEOaxv8t_RAT`}N4i6USA+d#vmEz`M~@?_n#v z6WNYD9*-x3GT=|ZW@My3e~JW)&EJ6AoUkUO`2?&WoSJCoJO{9RW8bafho)A5A-#EzXt40nch>JR091{#4ka0l6qgojwg!K%W%x`w$x0iJ!T*mK; ze}qYshPQ}!+Ki$DIGnPKBj}war4xNa@+hmjs3m@MPWzqSAbndn zOuF`V3}{PP#v$Zpl9Z!Bd&)BYlQMq0DJLm*+eu1X`%KejJsyw8*RN#9#;+G(g z?KIYY vXwY{W9^e>tCX;vFALN^se+=smPpVS9nQ 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 + inkscape:window-maximized="1" /> @@ -56,15 +56,14 @@ inkscape:groupmode="layer" id="layer1"> hole_0 : (pi_arg : Nat) -> Nat + x="439.375" + y="472.23718" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">hole_0 : (pi_arg : Nat) -> Nat x : Nat + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold'">x : Nat diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 42e16fa436..8fdf44415b 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -40,10 +40,10 @@ The following is a walkthough looking at the state after each tactic: :width: 310px :height: 115px - * - This table also shows the logic at each stage. The aim is to illustrate the tactics by analogy with proofs, as a line with the premises above it and the conclusion below it. The conclusion is the hole we are trying to fill and the premises may be sub-goals: + * - This table also shows the holes and what they depend on. The aim is to illustrate the tactics by analogy with proofs, as a line with the premises above it and the conclusion below it. The conclusion is the hole we are trying to fill and the premises may be sub-goals: - .. image:: ../image/elabLogicEx1_1.png - :width: 126px - :height: 33px + :width: 277px + :height: 15px * - The term is: - ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} @@ -88,10 +88,10 @@ The following is a walkthough looking at the state after each tactic: :width: 312px :height: 84px - * - The logic now looks like this: + * - The holes and what they depend on now looks like this: - .. image:: ../image/elabLogicEx1_2.png - :width: 126px - :height: 45px + :width: 279px + :height: 26px * - The term now looks like this: - ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} @@ -136,10 +136,10 @@ The following is a walkthough looking at the state after each tactic: :width: 312px :height: 57px - * - and the logic like this: + * - The holes and what they depend on now looks like this: - .. image:: ../image/elabLogicEx1_3.png - :width: 131px - :height: 45px + :width: 290px + :height: 26px * - The term now looks like this: - ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} @@ -189,7 +189,7 @@ The following is a walkthough looking at the state after each tactic: * - Substitute a guess into a hole. - solve - * - The logic now looks like this: + * - The holes and what they depend on now looks like this: - .. image:: ../image/elabLogicEx1_4.png :width: 131px :height: 14px From a4da735395f5cf9bc2db6d3070cd5f9e4eefb1ae Mon Sep 17 00:00:00 2001 From: martinbaker Date: Tue, 2 Jul 2019 15:29:46 +0100 Subject: [PATCH 37/45] fix markup error --- docs/proofs/tactics.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/proofs/tactics.rst b/docs/proofs/tactics.rst index 71033c2094..be34a4e6a3 100644 --- a/docs/proofs/tactics.rst +++ b/docs/proofs/tactics.rst @@ -426,5 +426,5 @@ However this would cause the application of f to be ill-typed, as it expects an letbind : (n : TTName) -> (ty, tm : Raw) -> Elab () -... target-notes:: -. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 +.. target-notes:: +.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 From 00f95a47c13cf836c6d04a5d58c111feb67dc39d Mon Sep 17 00:00:00 2001 From: martinbaker Date: Wed, 3 Jul 2019 09:17:15 +0100 Subject: [PATCH 38/45] add a page about the notation for holes and guesses --- docs/proofs/holes.rst | 177 ++++++++++++++++++++++++++++++++++++++++++ docs/proofs/index.rst | 1 + 2 files changed, 178 insertions(+) create mode 100644 docs/proofs/holes.rst diff --git a/docs/proofs/holes.rst b/docs/proofs/holes.rst new file mode 100644 index 0000000000..467eb335be --- /dev/null +++ b/docs/proofs/holes.rst @@ -0,0 +1,177 @@ +Elaborator Reflection - Holes +============================= + +The process of doing proofs and elaborator reflection tends to involve stating with a desired conclusion and working back to known premises. This often needs intermediate sub-goals which may only be partially solved, these are encoded using 'holes' and 'guesses'. + +* A hole is a term (an expression - a chunk of code) which is yet to be determined. We do have information about its type (this process tends to be type driven). +* A guess is like a hole that is not yet bound. + +The theory around this was developed in `Dependently Typed Functional Programs and their Proofs by McBride 1999`_. + +Notation for Holes and Guesses +------------------------------ + +There is a notation used in the McBride 1999 thesis which is adapted for the TT language. When working on elaborator reflection it is useful to know this notation, for instance when reading the output of the 'debug' tactic. + +* A focused hole is notated like this ?x:t . t +* A guess is notated like this ?x ≈ t:t . t + +The following example shows how this is used: + +Simple Example +-------------- + +Start with a code file that just contains: + +.. code-block:: idris + + %language ElabReflection + + testFn : Nat + testFn = %runElab (do debug {a = ()}) + +when this is loaded the following is displayed: + +.. code-block:: idris + + Holes: + ---------------------------------- + {hole_2} : Prelude.Nat.Nat + + ---------------------------------- + {hole_0} : Prelude.Nat.Nat + + Term: + ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} + +This shows information about the state when debug is encountered, during tactic execution, which allows us to investigate what is happening at each stage. + +* The "Holes" part shows the types of the holes and the local context of each +* The "Term" part shows where these holes are in the expression being constructed. + +So starting with the "Term" part we have. + +.. code-block:: idris + + ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} + +.. sidebar:: attack tactic + + This kind of thing tends to arise from "attack", which helps keep binding forms in order. + +The meaning of this is not immediately apparent so it helps to add some parentheses to make the structure clearer: + +.. code-block:: idris + + (?{hole_0} ≈ (? {hole_2} . {hole_2}) . {hole_0}) + +First lets look at the inner part: + +.. code-block:: idris + + ? {hole_2} . {hole_2} + +We can substitute in the type from the "Holes" part: + +.. code-block:: idris + + ? {hole_2}:Nat . {hole_2}:Nat + +So we are looking for a hole of type Nat and all we know is it has type Nat. + +Going back to the full term, the above is wrapped in a guess, so it means: 'a guess that is itself a hole'. + +Example Showing Patterns +------------------------ + +In this example a parameter 'n' has been added to the function. This allows us to see how patterns are used. Starting with this file: + +.. code-block:: idris + + %language ElabReflection + + testFn : Nat -> Nat + testFn n = %runElab (do debug {a = ()}) + +when loaded gives: + +.. code-block:: idris + + Holes: + n : Prelude.Nat.Nat + ---------------------------------- + {hole_3} : Prelude.Nat.Nat + + n : Prelude.Nat.Nat + ---------------------------------- + {hole_1} : Prelude.Nat.Nat + + ---------------------------------- + {hole_0} : patTy n : Prelude.Nat.Nat . Prelude.Nat.Nat + + Term: + ?{hole_0} ≈ pat n : Prelude.Nat.Nat . + ?{hole_1} ≈ ? {hole_3} . {hole_3} . {hole_1} . + {hole_0} + +The ns above the lines show the context of the holes on the right hand side - they include the variable n that is an argument! + +patTy is a binding form in Idris's core language that introduces a pattern variable. The idea is that the left-hand side and right-hand side of each pattern should have the same type. Because pattern variables may occur multiple times on either side of the equation, we can achieve this by documenting their types with a binding form that wraps each side. This new binding form is why an "attack" was necessary prior to elaborating the RHS. + +patTy is a type former, and pat is the corresponding introduction form. So you can think of patTy as being a bit like a dependent function type, and pat as being a bit like lambda, except they don't introduce functions (they instead are used for pattern-matching definitions). + +More Complicated Example +------------------------ + +This example does not introduce any new notation but the extra complexity gives a more realistic idea of how it is used. Here we start with this file: + +.. code-block:: idris + + %language ElabReflection + + testFn : (n : Nat) -> (n = plus n Z) -> (S n = S (plus n Z)) + testFn k ih = %runElab (do debug {a = ()}) + +when loaded gives: + +.. code-block:: idris + + Holes: + k : Prelude.Nat.Nat + ih : = Prelude.Nat.Nat Prelude.Nat.Nat k + (Prelude.Nat.plus k Prelude.Nat.Z) + ---------------------------------- + {hole_4} : = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k) + (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z)) + + k : Prelude.Nat.Nat + ih : = Prelude.Nat.Nat Prelude.Nat.Nat k + (Prelude.Nat.plus k Prelude.Nat.Z) + ---------------------------------- + {hole_2} : = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k) + (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z)) + + k : Prelude.Nat.Nat + ---------------------------------- + {hole_1} : patTy ih : = Prelude.Nat.Nat Prelude.Nat.Nat k + (Prelude.Nat.plus k Prelude.Nat.Z) . + = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k) + (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z)) + + ---------------------------------- + {hole_0} : patTy k : Prelude.Nat.Nat . + patTy ih : = Prelude.Nat.Nat Prelude.Nat.Nat k + (Prelude.Nat.plus k Prelude.Nat.Z) . + = Prelude.Nat.Nat Prelude.Nat.Nat (Prelude.Nat.S k) + (Prelude.Nat.S (Prelude.Nat.plus k Prelude.Nat.Z)) + + Term: + ?{hole_0} ≈ pat k : Prelude.Nat.Nat . + ?{hole_1} ≈ pat ih : = Prelude.Nat.Nat Prelude.Nat.Nat k + (Prelude.Nat.plus k Prelude.Nat.Z) . + ?{hole_2} ≈ ? {hole_4} . {hole_4} . {hole_2} . + {hole_1} . + {hole_0} + +.. target-notes:: +.. _`Dependently Typed Functional Programs and their Proofs by McBride 1999`: https://www.era.lib.ed.ac.uk/handle/1842/374 diff --git a/docs/proofs/index.rst b/docs/proofs/index.rst index 675c953ce1..a4db17a478 100644 --- a/docs/proofs/index.rst +++ b/docs/proofs/index.rst @@ -27,6 +27,7 @@ A tutorial on theorem proving in Idris. interactiveOld elabReflection tactics + holes example1 primitive generatingData From 810528de9043d55d49d291b9d5631cb0613f709d Mon Sep 17 00:00:00 2001 From: martinbaker Date: Wed, 3 Jul 2019 15:51:05 +0100 Subject: [PATCH 39/45] corrections to identity example --- docs/proofs/example1.rst | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 8fdf44415b..1bd23275c9 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -40,7 +40,7 @@ The following is a walkthough looking at the state after each tactic: :width: 310px :height: 115px - * - This table also shows the holes and what they depend on. The aim is to illustrate the tactics by analogy with proofs, as a line with the premises above it and the conclusion below it. The conclusion is the hole we are trying to fill and the premises may be sub-goals: + * - This table shows the hole types and what they depend on. The aim is to illustrate the types by analogy with proofs, as a line with the premises above it and the conclusion below it. - .. image:: ../image/elabLogicEx1_1.png :width: 277px :height: 15px @@ -48,11 +48,7 @@ The following is a walkthough looking at the state after each tactic: * - The term is: - ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} - * - getEnv - - getGoal - - getHoles + * - It is possible to read the state from the script by calling getEnv, getGoal and getHoles. To show the results I hacked this: `my code`_. - .. code-block:: idris @@ -88,7 +84,7 @@ The following is a walkthough looking at the state after each tactic: :width: 312px :height: 84px - * - The holes and what they depend on now looks like this: + * - The hole types now looks like this: - .. image:: ../image/elabLogicEx1_2.png :width: 279px :height: 26px @@ -96,11 +92,7 @@ The following is a walkthough looking at the state after each tactic: * - The term now looks like this: - ?{hole_0} ≈ λ x . ? {hole_2} . {hole_2} . {hole_0} - * - getEnv - - getGoal - - getHoles + * - Again we can check the state by calling getEnv, getGoal and getHoles: see `my code`_ - .. code-block:: idris @@ -136,7 +128,7 @@ The following is a walkthough looking at the state after each tactic: :width: 312px :height: 57px - * - The holes and what they depend on now looks like this: + * - The hole types now looks like this: - .. image:: ../image/elabLogicEx1_3.png :width: 290px :height: 26px @@ -144,11 +136,7 @@ The following is a walkthough looking at the state after each tactic: * - The term now looks like this: - ?{hole_0} ≈ λ x . ?{hole_2} ≈ x . {hole_2} . {hole_0} - * - getEnv - - getGoal - - getHoles + * - Again we can check the state by calling getEnv, getGoal and getHoles: see `my code`_ - .. code-block:: idris @@ -189,7 +177,7 @@ The following is a walkthough looking at the state after each tactic: * - Substitute a guess into a hole. - solve - * - The holes and what they depend on now looks like this: + * - The hole types now looks like this: - .. image:: ../image/elabLogicEx1_4.png :width: 131px :height: 14px @@ -246,3 +234,6 @@ The following is a walkthough looking at the state after each tactic: } } } + +.. target-notes:: +.. _`my code`: https://github.com/martinbaker/Idris-dev/blob/uglyTTPrinter/libs/prelude/Language/Reflection/TTPrinter.idr From 8f8303ed162b97881c409e9979a03aa00a222dc9 Mon Sep 17 00:00:00 2001 From: martinbaker Date: Wed, 3 Jul 2019 16:42:35 +0100 Subject: [PATCH 40/45] corrections to identity example --- docs/image/tree.png | Bin 4115 -> 5572 bytes docs/image/tree.svg | 186 +++++++++++++++++++++++---------------- docs/proofs/example1.rst | 4 +- 3 files changed, 111 insertions(+), 79 deletions(-) diff --git a/docs/image/tree.png b/docs/image/tree.png index 0727a4d700519280acdb126a0b915a76eb249415..edfa6d71e65e64135fa3f72e67d601fb0676d8a6 100644 GIT binary patch delta 5548 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 delta 4079 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 diff --git a/docs/image/tree.svg b/docs/image/tree.svg index b994ce0574..a80014f6ad 100644 --- a/docs/image/tree.svg +++ b/docs/image/tree.svg @@ -14,7 +14,7 @@ viewBox="0 0 744.09448819 1052.3622047" id="svg2" version="1.1" - inkscape:version="0.91 r13725" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" sodipodi:docname="tree.svg"> @@ -32,21 +32,6 @@ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " id="path5206" /> - - - image/svg+xml - + @@ -84,97 +69,144 @@ id="layer1"> λ n:t1 . h:t2 + x="348.5" + y="334.92474" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#0000ff;fill-opacity:1">{hole2} :Nat->Nat x - - intro `{{x}} solve + x="381.0625" + y="470.23721" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#000000;fill-opacity:1">solve fill (Var `{{x}}) + + state + state + state + λ x:Nat . ? {hole 2} + λ x:Nat . x diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 1bd23275c9..6d425a5d53 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -20,8 +20,8 @@ Elaborator Reflection - Identity Example As a first approximation, the state consists of a term with holes in it, an indicator of which hole is focused, a queue of the next holes to focus on, and miscellaneous information like a source of fresh names. The intro tactic modifies this state, replacing the focused hole with a lambda and focusing on the lambda's body. - .. image:: ../image/tree.png - :width: 133px - :height: 106px + :width: 119px + :height: 109px The following is a walkthough looking at the state after each tactic: From eda6a8761f2d4938e1521103cd42e6d82e479fbd Mon Sep 17 00:00:00 2001 From: martinbaker Date: Thu, 4 Jul 2019 09:55:23 +0100 Subject: [PATCH 41/45] extend holes example --- docs/proofs/holes.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/proofs/holes.rst b/docs/proofs/holes.rst index 467eb335be..731b0a8b4c 100644 --- a/docs/proofs/holes.rst +++ b/docs/proofs/holes.rst @@ -81,10 +81,29 @@ So we are looking for a hole of type Nat and all we know is it has type Nat. Going back to the full term, the above is wrapped in a guess, so it means: 'a guess that is itself a hole'. +Since the elaborator does not have any further information it has to be given a value: + +.. code-block:: idris + + %language ElabReflection + + testFn : Nat + testFn = %runElab (do fill `(Z) + debug {a = ()} + solve) + +Now we have a guess for hole_2 which is itself a guess for hole_0: + +.. code-block:: idris + + ?{hole_0} ≈ ?{hole_2} ≈ Prelude.Nat.Z . {hole_2} . {hole_0} + +The guesses can be accepted by calling the 'solve' tactic. + Example Showing Patterns ------------------------ -In this example a parameter 'n' has been added to the function. This allows us to see how patterns are used. Starting with this file: +In this next example a parameter 'n' has been added to the function. This allows us to see how patterns are used. Starting with this file: .. code-block:: idris From d73e3c531cf88be77ca74a3e1c4ffa83bf2b8bd0 Mon Sep 17 00:00:00 2001 From: martinbaker Date: Fri, 5 Jul 2019 07:58:47 +0100 Subject: [PATCH 42/45] add example and diagram for fill --- docs/image/fill.png | Bin 0 -> 5475 bytes docs/image/fill.svg | 127 ++++++++++++++++++++++++++++++++++++++ docs/proofs/primitive.rst | 15 +++++ 3 files changed, 142 insertions(+) create mode 100644 docs/image/fill.png create mode 100644 docs/image/fill.svg diff --git a/docs/image/fill.png b/docs/image/fill.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a212471ae37a5fed8971b2ad689efd9dbd528 GIT binary patch literal 5475 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 Z{|D{v&W%b!jF$ia002ovPDHLkV1hOBUW@<$ literal 0 HcmV?d00001 diff --git a/docs/image/fill.svg b/docs/image/fill.svg new file mode 100644 index 0000000000..d4d848d964 --- /dev/null +++ b/docs/image/fill.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} + ?{hole_0} ≈ ?{hole_2} ≈ Prelude.Nat.Z . {hole_2} . {hole_0} + fill `(Z) + + + diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index a8c9d59e91..0b36cf45bd 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -30,6 +30,11 @@ Primitive Operators * - fill - Place a term into a hole, unifying its type. Fails if the focus is not a hole. + - .. image:: ../image/fill.png + :width: 259px + :height: 46px + :alt: diagram illustrating fill tactic + Signature: fill : (e : Raw) -> Elab () @@ -46,6 +51,16 @@ Primitive Operators This unification can result in the solution of further holes or the establishment of additional unsolved unification constraints. + Example: + + .. code-block:: idris + + %language ElabReflection + + testFn : Nat + testFn = %runElab (do fill `(Z) + solve) + * - apply - Attempt to apply an operator to fill the current hole, potentially solving arguments by unification. From c2690a975e2560f6a11be0686cea5115d342a410 Mon Sep 17 00:00:00 2001 From: martinbaker Date: Fri, 5 Jul 2019 16:56:28 +0100 Subject: [PATCH 43/45] add example and diagram for solve --- docs/image/fill.png | Bin 5475 -> 3804 bytes docs/image/fill.svg | 62 ++++++++++++--- docs/image/solve.png | Bin 0 -> 3725 bytes docs/image/solve.svg | 163 ++++++++++++++++++++++++++++++++++++++ docs/proofs/primitive.rst | 27 ++++++- 5 files changed, 235 insertions(+), 17 deletions(-) create mode 100644 docs/image/solve.png create mode 100644 docs/image/solve.svg diff --git a/docs/image/fill.png b/docs/image/fill.png index a79a212471ae37a5fed8971b2ad689efd9dbd528..a8356715edea3f59d1751c3dc6f1e66d7ab6acf9 100644 GIT binary patch delta 3765 zcmV;m4odOkD%>3)iBL{Q4GJ0x0000DNk~Le0001t0000=2nGNE0BLc&kswWf4p~V= zK~#90?VWpc6~!ILKQ}KPX@Gz{6bvmEv7msURa8)D5KysFL_~|$Qc=-b+a6jM8kN(E6}29qJ|KdMmB!Knf=WaLfh3S$|M<>&_ukyx+{nFzB>OpM zPwvjn&dl!bw==(a{3ehz>}Ozqd%%8|yfg!vDAoq78tgu>6C1iT0jVP`N$ETQgn$7+ zPq1vTUxGaWHUq4sqFFDnBCw@km$|SxU{l=h8^bk}4F`K1Y!O&~lFAuygd|I0UUq*s z0Pg`00pA2(0j2==g0%wv4s-){0!zXA0mFea-2DTA5nvsGCxQO~9|KQ+gLO$#Spym# z%L6m8v0xcsm0;7|wF0o+U_)G-v%u28t_M3AY(3aRE^Z;%8(?k0J_1_ytXc^Bx1l;(V}Zvz)74LjR~ZwKZB#{nIZU)F#I!a9Mi1RLzm zJA*9%d(Aa7?OpgeV1EPqr_azG0QQ2r|8B7PE_||Ul2$uq3J3@Y2nYxWI7(P64Z2yY zhAv4!qrkrG#$I|fbV&k|Ln_8$0-7*^!UWWdKw$#vMT!*0E(XhgiVDjDyC^mJ1sp9> zRl~FZo*_JclnJZ^vTD5}pgCi0!1lSJeFIwywl|n{4v2%T2di)jQ=xgKfW}TLjouZ6 zo1jd09uQC)))%bY)iArj`ZRQj0*-lXi&K~_4PBCekoJ=1ss46TBxEm3v?<*UtbJ0AHwQS(+ues4IN{I85wb(qDjw zfjrcc8k1n!bCADMZJZBO0*SiT4t4Q61IvKt6TGh*D)+d5TCS%fSK-+Srq?J)Rk!*p zz<-hV;#5>CWJkq06}?c8Ho!zAaF64FtB_El@Ao(t__oUnmu99bLn538Yz5x;g$)6& z0sOtYp)Q}=My$IafAX)RS^C4kdY67cf@Gp)4sQ_IEQNp%fNv45VYUHpy5AQ9om|*v z_jd!(lE@l=<|n{GU=4D~9frQ_gGg|Ra61w#sD{~(yfpU%PrL9rz^7=_flA;~B5RmD z_dIX7zg~^{TVPd!nLA8v_phvw=4rzyWg{sYi|yJa0uBsph?syEB7hD4KDn6 z;2f96)peAk(U4Jhlq2Fxz;x6+`8j}$;tce1L0@h)svWYBFZB*!A5eybc7iXB_CRZ3 z6!29S_KEwO?b0#gbI9fEZ|*9i%Ge1hr#HRv4mItqZthtgap$iA?c8s3WoZ(mdTL-k zT4@)5O#u?j*W%n;ifW&Jz{N-)rM~OCP)+liOJ^pk(b9o$0Kal^JlY{!%HK4;iT1J? z8>bvwQ7thFDe2Itasa%J6yti-T-^z50xoxPm&QrIQITqeDMp51EcOyU_q9hoD1Vx5edlSYCTii%N1`Smmi^KqM%a0% zY3h#bB~N);5^h#-kGjD}%dCV=i7;rc2{11_NUpCm1|w@w@QHJk4HV&`9*J-EVKW zA2gVE0UCFijHVv|2x%1fS>U&(t~6+Wx+4t@6TBMZ$OHa^mP7;`%hYD{8uT?-XHaTz zfx&48qusUj1`78p#i&U z)Vv%-OBm|AP5n?{M@VyCe(pwtfj0nz;3HFQb199q*Ve3?q!1LMr44IB@Pi|NNa`e_ z7IiuMW)d(Zq$Lj?+ku`(kXM7!tQ97SWT5E<08G;Zg}}m4&56fK8u7L#OGR~(#o`QASmb(|fMXGZ2Ym`tX0e^>0urQusT;kZrJe`e z?|+5rUKk$GoN-2IxwBs;G<10a8Ud~;sPmV`nz{H_|DG~|NX8Z92mj350ox*)&e+Bg$m&1Ob# zGc47|o;_Gu8CG4LSo|%2Td?x-)R*gX9$$_lv$K%zRu2-NrsNd6oJGQrmPIh&(|?(6n5*a*yhcNzvOxIFu*D*5{uut zGd68nVsUT28N2dItg1@qD^{qS@f2?TdTjgl$gsnQ!_VkHN=g!cR+xL79EUrZ^{ype zG*1xeRT|B5;4zSLEJBNjUO>wX$D+B8Nx<9$GprADQTMi9Yg_m2gJ++GoE+%e7hZf3 z1`UE;yXw9-)x7cwJoXsecc0F;Z&z6>Dr&!H=umj@!J6R%2ZoOiK7bcqfD>a*Hq;;l zdMM&G_+#ZG`B=!4(v3)_SyTgL$Tz^$m|_#Tq`<7ml;M{6XrG9<6b zXa}$@XyMlo&t92;Y?+JECOyS2G5@PsLU{j^PDp9iqP^(~@w!b+zK%eYcvVu5N)thYqlKF`R$C?6A^OSh7UT9>}Qw$3OJ@iYwrM^2@_{ zWM{J&ZPhm4m$mmk>ylXs+C*sp@HSEok2lZwvp)73x*}6ZQAkp?z-mxr{cUT4fPZye?=jm=e@fU4^#gsG2p4j=;^C zZj>i24SMv@3-x0r1sXOCI(3SFyjEEWy?d)?0kUCQwvxES z-Mf|7`0-Mhv(JXpPlt~`R=K-(mr>lWpN!^n&Vlyr)hy=bD!m@Qe-&SUTuf1UIje|V zYFdr<>U$1-y!%lFu;0noli3<4vr=TI>_r_IzsztlTZ$@$KB$SBMI3%jSb>tsO7wLA zM{nS+i5<0#!^}n>Z?Z@5|4M=$o2l@hiAXb0n4~I9%4Js90;m_zBF%s>DV14s fSaBDSME(yRj=LO~6|JKT00000NkvXXu0mjfn@1H* delta 5449 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 + + + + inkscape:isstock="true" + inkscape:collect="always"> image/svg+xml - + @@ -72,36 +87,36 @@ id="rect22" width="31.75" height="5.5562501" - x="80.697914" + x="70.114571" y="114.96667" inkscape:export-xdpi="61.120499" inkscape:export-ydpi="61.120499" /> ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} + x="65.352081" + y="105.17709" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';stroke-width:0.26458332">? {hole} . {hole} ?{hole_0} ≈ ?{hole_2} ≈ Prelude.Nat.Z . {hole_2} . {hole_0} + sodipodi:role="line">?{hole} ≈ Prelude.Nat.Z . {hole} + focus + diff --git a/docs/image/solve.png b/docs/image/solve.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b7081c81728eb34583133768ffeedecda546cc GIT binary patch literal 3725 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 literal 0 HcmV?d00001 diff --git a/docs/image/solve.svg b/docs/image/solve.svg new file mode 100644 index 0000000000..314be94cbd --- /dev/null +++ b/docs/image/solve.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Prelude.Nat.Z + solve + + focus + + ?{hole} ≈ Prelude.Nat.Z . {hole} + + diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index 0b36cf45bd..aeaf59f90e 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -21,19 +21,38 @@ Primitive Operators * - solve - Substitute a guess into a hole. + + .. image:: ../image/solve.png + :width: 141px + :height: 74px + :alt: diagram illustrating solve tactic + + Substitute the focused guess throughout its scope, eliminating it and moving focus to the next element of the hole queue. Fail if the focus is not a guess. Signature: solve : Elab () + Example: + + .. code-block:: idris + + %language ElabReflection + + testFn : Nat + testFn = %runElab (do fill `(Z) + solve) + * - fill - Place a term into a hole, unifying its type. Fails if the focus is not a hole. - - .. image:: ../image/fill.png - :width: 259px - :height: 46px - :alt: diagram illustrating fill tactic + + .. image:: ../image/fill.png + :width: 140px + :height: 74px + :alt: diagram illustrating fill tactic + Signature: From c8917509b5266bb846cd4e445081bd1a3a082786 Mon Sep 17 00:00:00 2001 From: martinbaker Date: Sat, 6 Jul 2019 10:39:36 +0100 Subject: [PATCH 44/45] add diagram for attack --- docs/image/attack.png | Bin 0 -> 3861 bytes docs/image/attack.svg | 199 ++++++++++++++++++++++++++++++++++++++ docs/proofs/primitive.rst | 9 +- 3 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 docs/image/attack.png create mode 100644 docs/image/attack.svg diff --git a/docs/image/attack.png b/docs/image/attack.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b1844ca4640e2f1e8f8ff1c15f4e8406302262 GIT binary patch literal 3861 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 X$^!jg7mA%900000NkvXXu0mjfO^Y<+ literal 0 HcmV?d00001 diff --git a/docs/image/attack.svg b/docs/image/attack.svg new file mode 100644 index 0000000000..57a0840373 --- /dev/null +++ b/docs/image/attack.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + ?h ∶ t1→t2 . f h + ?h ≈ (?h' ∶ t1→t2 . h')∶ t1→t2 . f h + attack + + focus + + focus + + + diff --git a/docs/proofs/primitive.rst b/docs/proofs/primitive.rst index aeaf59f90e..89b87ab3fb 100644 --- a/docs/proofs/primitive.rst +++ b/docs/proofs/primitive.rst @@ -144,9 +144,14 @@ Primitive Operators unfocus : TTName -> Elab () * - attack - - Convert a hole to make it suitable for bindings - that is, transform it such that it has the form + - Convert a hole to make it suitable for bindings. + + + .. image:: ../image/attack.png + :width: 152px + :height: 70px + :alt: diagram illustrating attack tactic - `?h : t . h` as opposed to `?h : t . f h`. The binding tactics require that a hole be directly under its binding, or else the scopes of the generated terms won't make sense. This tactic creates a new hole of the proper form, and points the old hole at it. From cf3071d32430b65f334149a7df43a473344dc2fc Mon Sep 17 00:00:00 2001 From: martinbaker Date: Tue, 16 Jul 2019 08:27:26 +0100 Subject: [PATCH 45/45] explain getEnv, getGoal, getHoles and getGuess better --- docs/proofs/example1.rst | 141 +++++++++++++-------------------------- 1 file changed, 47 insertions(+), 94 deletions(-) diff --git a/docs/proofs/example1.rst b/docs/proofs/example1.rst index 6d425a5d53..9ba1e97e2c 100644 --- a/docs/proofs/example1.rst +++ b/docs/proofs/example1.rst @@ -48,28 +48,20 @@ The following is a walkthough looking at the state after each tactic: * - The term is: - ?{hole_0} ≈ ? {hole_2} . {hole_2} . {hole_0} - * - It is possible to read the state from the script by calling getEnv, getGoal and getHoles. To show the results I hacked this: `my code`_. + * - It is possible to read the state from the script by calling getEnv, getGoal and getHoles. - - .. code-block:: idris + - The output of these calls contain structures with TT code. To show the results I hacked this: `my code`_. TT code is not really designed to be readable by humans, all the names are fully expanded, everything has a type down to universes (type of types). This is shown here to illustrate the information available. + + .. code-block:: idris getEnv=[] - getGoal=({hole_2}, {TT:Bind - name=`{{__pi_arg}} - binder={ - Π ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}).{ - TT:TType tt=ext=./Prelude/Nat.idr#20 - } - } - tt={ - TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat","Prelude"]} - TT={TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - }) + getGoal=(hole_2, __pi_arg:(Nat.["Nat", "Prelude"]:{ + type constructor tag=8 number=0}.Type:U=(20:./Prelude/Nat.idr)->. + {name ref{type constructor tag=8 number=0}Nat.["Nat","Prelude"]: + Type:U=(20:./Prelude/Nat.idr) + }) + }) getHoles=[{hole_2},{hole_0}] @@ -96,24 +88,14 @@ The following is a walkthough looking at the state after each tactic: - .. code-block:: idris - getEnv=[( - `{{x}}, { - λ ({`{{Nat}}.["Nat", "Prelude"]}:{type const tag=8,0}). - {TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - )] - - getGoal=({hole_2},{ - TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat", "Prelude"]} - TT={TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - ) + getEnv=[(x, {λ (Nat.["Nat", "Prelude"]:{ + type constructor tag=8 number=0}). + Type:U=(20:./Prelude/Nat.idr) + })] + + getGoal=(hole_2, {name ref{type constructor tag=8 number=0} + Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr) + }) getHoles=[{hole_2},{hole_0}] @@ -140,38 +122,24 @@ The following is a walkthough looking at the state after each tactic: - .. code-block:: idris - getEnv=[(`{{x}}, {λ ({`{{Nat}}.["Nat", "Prelude"]}: - {type const tag=8,0}). - {TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - )] - - getGoal=({hole_2}, - {TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat", "Prelude"]} - TT={TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - }) + getEnv=[(x, {λ (Nat.["Nat", "Prelude"]: + {type constructor tag=8 number=0}). + Type:U=(20:./Prelude/Nat.idr) + })] + + getGoal=(hole_2, {name ref{type constructor tag=8 number=0} + Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr) + }) getHoles=[{hole_2}, {hole_0}] * - getGuess - .. code-block:: idris - {TT:Parameter name ref - NameType=NameType just bound by intro - TTName=`{{x}} - TT={TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat", "Prelude"]} - TT={TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } + {name ref bound x: + {name ref{type constructor tag=8 number=0} + Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr) + } } * - Substitute a guess into a hole. @@ -195,45 +163,30 @@ The following is a walkthough looking at the state after each tactic: getEnv=[] - getGoal=({hole_0}, {TT:Bind - name=`{{__pi_arg}} - binder={ - Π ({`{{Nat}}.["Nat", "Prelude"]}: - {type const tag=8,0}).{TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - tt={TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat","Prelude"]} - TT={TT:TType tt=ext=./Prelude/Nat.idr#20} - } - }) + getGoal=(hole_0, __pi_arg:(Nat.["Nat", "Prelude"]:{ + type constructor tag=8 number=0}. + Type:U=(20:./Prelude/Nat.idr) + ->.{name ref + {type constructor tag=8 number=0} + Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr) + }) + }) getHoles=[{hole_0}] * - getGuess - .. code-block:: idris - {TT:Bind - name=`{{x}} - binder={λ ({`{{Nat}}.["Nat","Prelude"]}:{type const tag=8,0}).{ - TT:TType - tt=ext=./Prelude/Nat.idr#20 - } + x:({λ (Nat.["Nat", "Prelude"]:{ + type constructor tag=8 number=0}). + Type:U=(20:./Prelude/Nat.idr) + }.{ + name ref bound + x:{name ref {type constructor tag=8 number=0} + Nat.["Nat","Prelude"]:Type:U=(20:./Prelude/Nat.idr) + } + }) } - tt={TT:Parameter name ref - NameType=NameType just bound by intro - TTName=`{{x}} - TT={TT:Parameter name ref - NameType={type const tag=8,0} - TTName={`{{Nat}}.["Nat", "Prelude"]} - TT={TT:TType - tt=ext=./Prelude/Nat.idr#20 - } - } - } - } .. target-notes:: .. _`my code`: https://github.com/martinbaker/Idris-dev/blob/uglyTTPrinter/libs/prelude/Language/Reflection/TTPrinter.idr