From 355d09145d40fac3a05d24c3a1aca560e7ba3809 Mon Sep 17 00:00:00 2001 From: Michael Sippel Date: Sun, 29 Sep 2024 22:52:59 +0200 Subject: [PATCH] improve directory structure --- beamer/{lc-beamer => }/Makefile | 0 beamer/README.org | 37 + .../{lc-beamer => }/beamercolorthemeccc.sty | 0 beamer/{lc-beamer => }/beamerfontthemeccc.sty | 0 .../{lc-beamer => }/beamerinnerthemeccc.sty | 0 .../{lc-beamer => }/beamerouterthemeccc.sty | 0 beamer/{lc-beamer => }/beamerthemeccc.sty | 0 beamer/{lc-beamer => }/ccc_img/cfaed.png | Bin beamer/{lc-beamer => }/ccc_img/footer.png | Bin beamer/{lc-beamer => }/ccc_img/header.png | Bin .../{lc-beamer => }/ccc_img/titlefooter.png | Bin beamer/{lc-beamer => }/example.tex | 0 beamer/lc-beamer/intro.pdf | Bin 14943 -> 0 bytes beamer/{lc-beamer => }/morphisms.dot | 0 beamer/{lc-beamer => }/morphisms.png | Bin beamer/{lc-beamer => }/sea-of-types/makefile | 0 .../sea-of-types/sea-of-types-0-bytes.dot | 0 .../sea-of-types/sea-of-types-1-ieee754.dot | 0 .../sea-of-types/sea-of-types-10-u8.dot | 0 .../sea-of-types/sea-of-types-2-real.dot | 0 .../sea-of-types/sea-of-types-3-real.dot | 0 .../sea-of-types/sea-of-types-4-degrees.dot | 0 .../sea-of-types/sea-of-types-5-turns.dot | 0 .../sea-of-types/sea-of-types-6-radians.dot | 0 .../sea-of-types/sea-of-types-7-angle.dot | 0 .../sea-of-types/sea-of-types-8-hue.dot | 0 .../sea-of-types/sea-of-types-9-u8.dot | 0 .../target/sea-of-types-0-bytes.png | Bin 0 -> 2289 bytes .../target/sea-of-types-1-ieee754.png | Bin 0 -> 6780 bytes .../target/sea-of-types-10-u8.png | Bin 0 -> 104356 bytes .../target/sea-of-types-2-real.png | Bin 0 -> 10116 bytes .../target/sea-of-types-3-real.png | Bin 0 -> 18421 bytes .../target/sea-of-types-4-degrees.png | Bin 0 -> 13940 bytes .../target/sea-of-types-5-turns.png | Bin 0 -> 16023 bytes .../target/sea-of-types-6-radians.png | Bin 0 -> 21056 bytes .../target/sea-of-types-7-angle.png | Bin 0 -> 22085 bytes .../target/sea-of-types-8-hue.png | Bin 0 -> 35209 bytes .../sea-of-types/target/sea-of-types-9-u8.png | Bin 0 -> 56761 bytes beamer/{lc-beamer => }/solution-traits.dot | 0 beamer/{lc-beamer => }/solution-traits.png | Bin beamer/{lc-beamer => }/solution-wrappers.dot | 0 beamer/{lc-beamer => }/solution-wrappers.png | Bin beamer/{lc-beamer => }/sot-int.png | Bin beamer/{lc-beamer => }/sot-json.png | Bin beamer/texput.log | 21 + share/cc-beamer-template-master/Makefile | 41 + share/cc-beamer-template-master/README.org | 37 + .../beamercolorthemeccc.sty | 31 + .../beamerfontthemeccc.sty | 11 + .../beamerinnerthemeccc.sty | 182 +++ .../beamerouterthemeccc.sty | 0 .../beamerthemeccc.sty | 31 + .../ccc_img/cfaed.png | Bin 0 -> 26332 bytes .../ccc_img/footer.png | Bin 0 -> 1495 bytes .../ccc_img/header.png | Bin 0 -> 27518 bytes .../ccc_img/titlefooter.png | Bin 0 -> 17728 bytes share/cc-beamer-template-master/example.tex | 64 + share/popl08-tutorial-Fsub/.Makefile.d | 36 + .../popl08-tutorial-Fsub}/AdditionalTactics.v | 0 .../AdditionalTactics.v.crashcoqide | 109 ++ .../popl08-tutorial-Fsub}/Atom.v | 0 share/popl08-tutorial-Fsub/Atom.v.crashcoqide | 265 +++++ .../popl08-tutorial-Fsub}/Environment.v | 0 .../Environment.v.crashcoqide | 697 +++++++++++ .../popl08-tutorial-Fsub}/FSetDecide.v | 0 .../FSetDecide.v.crashcoqide | 1057 +++++++++++++++++ .../popl08-tutorial-Fsub}/FSetNotin.v | 0 .../FSetNotin.v.crashcoqide | 183 +++ .../popl08-tutorial-Fsub}/FiniteSets.v | 0 .../popl08-tutorial-Fsub}/Fsub_Definitions.v | 0 .../Fsub_Definitions.v.crashcoqide | 493 ++++++++ .../Fsub_Infrastructure.v | 0 .../popl08-tutorial-Fsub}/Fsub_Lemmas.v | 0 .../Fsub_Lemmas.v.crashcoqide | 408 +++++++ .../popl08-tutorial-Fsub}/Fsub_Soundness.v | 0 .../Fsub_Soundness.v.crashcoqide | 593 +++++++++ .../popl08-tutorial-Fsub}/ListFacts.v | 0 share/popl08-tutorial-Fsub/Makefile | 999 ++++++++++++++++ share/popl08-tutorial-Fsub/Makefile.conf | 71 ++ .../popl08-tutorial-Fsub}/Metatheory.v | 0 .../popl08-tutorial-Fsub}/_CoqProject | 0 81 files changed, 5366 insertions(+) rename beamer/{lc-beamer => }/Makefile (100%) create mode 100644 beamer/README.org rename beamer/{lc-beamer => }/beamercolorthemeccc.sty (100%) rename beamer/{lc-beamer => }/beamerfontthemeccc.sty (100%) rename beamer/{lc-beamer => }/beamerinnerthemeccc.sty (100%) rename beamer/{lc-beamer => }/beamerouterthemeccc.sty (100%) rename beamer/{lc-beamer => }/beamerthemeccc.sty (100%) rename beamer/{lc-beamer => }/ccc_img/cfaed.png (100%) rename beamer/{lc-beamer => }/ccc_img/footer.png (100%) rename beamer/{lc-beamer => }/ccc_img/header.png (100%) rename beamer/{lc-beamer => }/ccc_img/titlefooter.png (100%) rename beamer/{lc-beamer => }/example.tex (100%) delete mode 100644 beamer/lc-beamer/intro.pdf rename beamer/{lc-beamer => }/morphisms.dot (100%) rename beamer/{lc-beamer => }/morphisms.png (100%) rename beamer/{lc-beamer => }/sea-of-types/makefile (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-0-bytes.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-1-ieee754.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-10-u8.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-2-real.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-3-real.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-4-degrees.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-5-turns.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-6-radians.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-7-angle.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-8-hue.dot (100%) rename beamer/{lc-beamer => }/sea-of-types/sea-of-types-9-u8.dot (100%) create mode 100644 beamer/sea-of-types/target/sea-of-types-0-bytes.png create mode 100644 beamer/sea-of-types/target/sea-of-types-1-ieee754.png create mode 100644 beamer/sea-of-types/target/sea-of-types-10-u8.png create mode 100644 beamer/sea-of-types/target/sea-of-types-2-real.png create mode 100644 beamer/sea-of-types/target/sea-of-types-3-real.png create mode 100644 beamer/sea-of-types/target/sea-of-types-4-degrees.png create mode 100644 beamer/sea-of-types/target/sea-of-types-5-turns.png create mode 100644 beamer/sea-of-types/target/sea-of-types-6-radians.png create mode 100644 beamer/sea-of-types/target/sea-of-types-7-angle.png create mode 100644 beamer/sea-of-types/target/sea-of-types-8-hue.png create mode 100644 beamer/sea-of-types/target/sea-of-types-9-u8.png rename beamer/{lc-beamer => }/solution-traits.dot (100%) rename beamer/{lc-beamer => }/solution-traits.png (100%) rename beamer/{lc-beamer => }/solution-wrappers.dot (100%) rename beamer/{lc-beamer => }/solution-wrappers.png (100%) rename beamer/{lc-beamer => }/sot-int.png (100%) rename beamer/{lc-beamer => }/sot-json.png (100%) create mode 100644 beamer/texput.log create mode 100644 share/cc-beamer-template-master/Makefile create mode 100644 share/cc-beamer-template-master/README.org create mode 100644 share/cc-beamer-template-master/beamercolorthemeccc.sty create mode 100644 share/cc-beamer-template-master/beamerfontthemeccc.sty create mode 100644 share/cc-beamer-template-master/beamerinnerthemeccc.sty create mode 100644 share/cc-beamer-template-master/beamerouterthemeccc.sty create mode 100644 share/cc-beamer-template-master/beamerthemeccc.sty create mode 100755 share/cc-beamer-template-master/ccc_img/cfaed.png create mode 100755 share/cc-beamer-template-master/ccc_img/footer.png create mode 100755 share/cc-beamer-template-master/ccc_img/header.png create mode 100644 share/cc-beamer-template-master/ccc_img/titlefooter.png create mode 100644 share/cc-beamer-template-master/example.tex create mode 100644 share/popl08-tutorial-Fsub/.Makefile.d rename {coq-Fsub => share/popl08-tutorial-Fsub}/AdditionalTactics.v (100%) create mode 100644 share/popl08-tutorial-Fsub/AdditionalTactics.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/Atom.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Atom.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/Environment.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Environment.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/FSetDecide.v (100%) create mode 100644 share/popl08-tutorial-Fsub/FSetDecide.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/FSetNotin.v (100%) create mode 100644 share/popl08-tutorial-Fsub/FSetNotin.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/FiniteSets.v (100%) rename {coq-Fsub => share/popl08-tutorial-Fsub}/Fsub_Definitions.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Fsub_Definitions.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/Fsub_Infrastructure.v (100%) rename {coq-Fsub => share/popl08-tutorial-Fsub}/Fsub_Lemmas.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Fsub_Lemmas.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/Fsub_Soundness.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Fsub_Soundness.v.crashcoqide rename {coq-Fsub => share/popl08-tutorial-Fsub}/ListFacts.v (100%) create mode 100644 share/popl08-tutorial-Fsub/Makefile create mode 100644 share/popl08-tutorial-Fsub/Makefile.conf rename {coq-Fsub => share/popl08-tutorial-Fsub}/Metatheory.v (100%) rename {coq-Fsub => share/popl08-tutorial-Fsub}/_CoqProject (100%) diff --git a/beamer/lc-beamer/Makefile b/beamer/Makefile similarity index 100% rename from beamer/lc-beamer/Makefile rename to beamer/Makefile diff --git a/beamer/README.org b/beamer/README.org new file mode 100644 index 0000000..323b7a7 --- /dev/null +++ b/beamer/README.org @@ -0,0 +1,37 @@ +* CCC Beamer Template + +** Install + + To use the template, simply copy all ~*.sty~ files and the ~ccc_img~ + directory to your project directory. + + You can also install the template in your system, so that you can use it + from all your projects. Simply run: ~make install~ + +** Usage + + Simply include ~\usetheme{ccc}~ in your document. + + #+BEGIN_SRC latex + \documentclass{beamer} + \usetheme{ccc} + \begin{document} + \begin{frame}{This is an Awesome Theme!} + \end{frame} + \end{document} + #+END_SRC + +*** Options + - ~cfaedlogo~ places the cfaed logo on every slide + - ~noccclogo~ removes the ccc logo from all slides except the title slide + +** Build + + To build the examples, run ~make example~. + + To build your own presentation, please note that this template does not work + with ~pdflatex~. Use ~lualatex~ instead! Please contact me, if you need + pdflatex support. + + + diff --git a/beamer/lc-beamer/beamercolorthemeccc.sty b/beamer/beamercolorthemeccc.sty similarity index 100% rename from beamer/lc-beamer/beamercolorthemeccc.sty rename to beamer/beamercolorthemeccc.sty diff --git a/beamer/lc-beamer/beamerfontthemeccc.sty b/beamer/beamerfontthemeccc.sty similarity index 100% rename from beamer/lc-beamer/beamerfontthemeccc.sty rename to beamer/beamerfontthemeccc.sty diff --git a/beamer/lc-beamer/beamerinnerthemeccc.sty b/beamer/beamerinnerthemeccc.sty similarity index 100% rename from beamer/lc-beamer/beamerinnerthemeccc.sty rename to beamer/beamerinnerthemeccc.sty diff --git a/beamer/lc-beamer/beamerouterthemeccc.sty b/beamer/beamerouterthemeccc.sty similarity index 100% rename from beamer/lc-beamer/beamerouterthemeccc.sty rename to beamer/beamerouterthemeccc.sty diff --git a/beamer/lc-beamer/beamerthemeccc.sty b/beamer/beamerthemeccc.sty similarity index 100% rename from beamer/lc-beamer/beamerthemeccc.sty rename to beamer/beamerthemeccc.sty diff --git a/beamer/lc-beamer/ccc_img/cfaed.png b/beamer/ccc_img/cfaed.png similarity index 100% rename from beamer/lc-beamer/ccc_img/cfaed.png rename to beamer/ccc_img/cfaed.png diff --git a/beamer/lc-beamer/ccc_img/footer.png b/beamer/ccc_img/footer.png similarity index 100% rename from beamer/lc-beamer/ccc_img/footer.png rename to beamer/ccc_img/footer.png diff --git a/beamer/lc-beamer/ccc_img/header.png b/beamer/ccc_img/header.png similarity index 100% rename from beamer/lc-beamer/ccc_img/header.png rename to beamer/ccc_img/header.png diff --git a/beamer/lc-beamer/ccc_img/titlefooter.png b/beamer/ccc_img/titlefooter.png similarity index 100% rename from beamer/lc-beamer/ccc_img/titlefooter.png rename to beamer/ccc_img/titlefooter.png diff --git a/beamer/lc-beamer/example.tex b/beamer/example.tex similarity index 100% rename from beamer/lc-beamer/example.tex rename to beamer/example.tex diff --git a/beamer/lc-beamer/intro.pdf b/beamer/lc-beamer/intro.pdf deleted file mode 100644 index cc147702d92161e769617400f2dfee26bc0d121d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14943 zcmd6O1yCK^wk__#Ay{DJ!QI{6-Q68F?(Q1gf?KfQ1P|`+5In&N?(iWw=iGDa-uvFG z_v=^vz4z+wHJA2WtGnhLV{TG;VNn_eS{69c`lHHwIA#Dnz|PPTj++}mCv9SD1~dn- zyoeOx0001;sD(Aq#PQ{9Z2&Y8HZig@Hi6^ig>wQrni$x?xn)*p4BL|QqqJVDT_~`2 zsnN_z?-s1XP<9ZXgpHk~Qdb-Q zOk4h7l%?T#+1KRm%J#^J?c?#l>FaCqy-IGHfUdX(>vk&>5oh-+H3b9}6ZK%q`lFXS zo42o%0j=@e?V0JFtuOb=yW^_t>+|8q%ct+IDSQX6pVpoM=L-ZLMg+i)j_i&@yQ(KA zH#hel#Cf{#-KAtOldOQU9#~;6kX58L3 z+TD{!VNykh&tb5oklqvVIbBSjZ*@P;-`e^*`^G)ng)a04s~ac5Hx7uRxsVZ$)jg|y z_Vw-XY)ZCZ5Y)y@#w!cgDCRi!jGNEf8RJ3HEN_kH$i z;vADxWAnszb@T90(0cY-B)W?27=aod_;}kfb;Wjje||CDQ7}6)uax@C`^>22GV4pa z)KJt*B8J!$_q}Ctu4zW`yY<_QRjUOF zoYLx9MuFBeP2oC@np*6zxVFU~f^B^|Y|pc7a$Hl1VJz-xNyMe32@VA~mwVNY5cI}# zX;q;JpvN)~*`dTk6>Zk?KQ46tnC!$3vn&1}qTj)u14X4lVw$vF^WX=iRbBegG@K_d zMGT7+h}ty0n%=v_P2M6-HZU_5VUU~Cm3-#XLQq`wp*0C;ud#KK#r8R~;O9rqK@!%p zwvl4K_vd-mJ#gnxTe1kQthC>X7MH4fB!{<%NGz~m7@&jnvSc<@dQoHF;R;fqX+^+W z4{VC9r&BvbcgDw05GtVJ(+mnbAZmKeB_r?mKvCri1|s27V+H7tnZiO4ib zPNMMMS}^Y-qa74QS_@otQuGXVPVT0IejUc#exup59{#3Jj5UlK{z_^vl`*;vRxZm- zYG8>tSX^6YAIrr=(WG%t(VU>TIzoiVIet4_Dr%G#yf$dLK5b|B>=xkh&%F5HEe$QqDKY($;;&wz0TOr~ws2;B<*cl~oTOb4c|^)k5*iiojrX3CAFWOx0Pt7V%>To5g0RAdm-siUjnXx8tfs0(EI98F)KnCluhTWBd>ag8gDTB6cM5v>A*Ynrve zjAv(d`HHwxd-paXt0>-LA*^1PX)?LtGLD5!X|{sWSFEN=6XcVv+~tNf;qaymp|FSC z0IOO3hmNOEr;9`77UZsd(eGhy(U`e~+cyfqO_OIfkujVBWx=TQ>8v!Uxo4I$5<(;v zvEHY9brwuRw}l}$y4{?j+&XhV(?!AqKZeC&g;T;Q6JLdIo!$tw{eGWsVFAVX!dBq99L{vHXZ| z!OlTu+bhv5w$Pwz@+l$~H%iGW(xH073KRXUr!(WoksJT6F(F8PT+TctGA(p)y;+cqmmptq=yl>)p|)qwkqf?TSK9d-GkZ)AlWn?-e6jkyjq;i zL5_zZ(D@yD7NS`GQqbo3X^`F_8~cGhR)k4A00L0MbCeATde>)Fn( z2A+jc3`e@zk8^XO@#X@Uu8vN_LQlUN;qEo&fz~xn=|6G(&Vd41+`vD(ZXb&xm~9|- zY}7_qKv;Q@1rUP5k}a!D#67+om_sdyTw+%zun=q|oxwr^Re=pNT_1TIh1}e+#egJ$ zq{#^(&4Q9fc3vT{}68;pE0(Nvz&vQiGm_&wD3Fi6O5*@V?aloL8--%m5doB{nmk|4huRo++kx~l(dUS$+VHM+(ILFrXidH%{@D`h%_b-6*vs@W?<;P+7Ihz zX%;JtG7bmItQMz6-~jhpV2OGoCU)`wQ%q#FB17r8RQ7)Ox1$e?V9+0xXtuY+mT@lM zTYXQ{-6&5;;8%85XEr&<_7}L#g$?*oUcc_3{2Vq*ibCUN#ZmA5jccLPVS zlYIZ46EaWhQ1GChGa5*X%!*p)hEp<&@Wyj=fmgYXFOSoR7aylVwg;*(d zIwB-ZO6IGA=gGvLlu?~pp&_Q{yLf0)i%h69AS@&s&Q$DYyejW5LJ&pP0A+}Xm3p@f z43O^;^WmaJvo6mtyac@|#4}+>d}P)z4Kznj-D?&YB{a(Nq;gRSdYAy`~{k zl2FC;<{0l=0#(%)oK+#)B!Q~1EA8@-6&<*x0d}D%5~MJ8;DO4Zje%Vh0`ixArT&5^ zLu({JM2YQ=s9w4A2<_R<3DWbm#bH6{M7`1J--;?jO^?juN7Xi zOn({czsz$HH=vjj@WnI-aC5&3UOsdN^e-6zosa;40YGPD@N#@H*k1~MAL&HxY=M8P zZAwE=Ll0p4)8K#Y;8nx`VEM37LHCp0P`Q$|FuiOq(r|S@jYS(32KqZ8u$Qm`$F)RtB7iWTGAJ#kg=3 ztvW#D05JN?Jna2iJh!>80vG5GH989ImhBj`yL^zYJm+k7qre`X)~cVG4y&{Xj+V{C zmKi}4Jr0L)*<9`L9@ck-59#`!!~p#Fmtw(TH;9&2eyFL4jkn23^a92e`fZMK5DQoy?+{8nx_)hI93Nb0k;+Hw%+vu*I~4Y7^6fbjU#c zfg0l?$!6P6!<&>fP1GY~6p+11Nh&Hy(~(JFgE`K{YAWt_4(x}lgPn5ZQ?tY-*`8-t0lO+~i8(J48{_zGWq6KRd${ zQrvp@a!WyxFukwLXm&k!Z95qDoFz=&yvm>4g*MNJb{O#1Q6Kfji-{Df)t_NqQy>uw ziKwHm6T&|dtbf$D8=D#~YSi%j%n|gAd|P%XBS@(>G7>JTNSn=xy|qzU#Z0QegpCFJ1u<9?(8zjm6bYwDo6P+rOf}MZY@1K&`?O9c)_nFvPswgq`{nMn zHp%Z?=Ho%TT4KGf--2`j(g-0BCq7vz_zer8JA>=thUL{w4Um*p%IFv1{q&-V#To1| zL#_Un5fy8)@2N;y2eOyMkQJaX|hf zQeq_f7MX31KFh&i_qZA4W>H&iro&-VdI~-|HuB}M^KRz{Qrmtd7A(9k3r!QTn; zwix&v*fvq7PNI~(oT04P=*KKJJI<5%ovZd?per}C;r7kJTRG%20^RD1v`{fO+v_iF zZ&cumqVxs7g3KjCI;TS@Y9akjUv{6Fc z!Vd(hRzF*cmNv1tsR*4SSP7v-E`BuL<~?mTH7U`_C0U$NO(kjfcD??Z?bh1+OKI53 zu}W`)%g<_CZ(|OZIUo5$$z-@K$bi?|43`z?u~jRj%G3t;`os(BRs0UsK|ar+dr3u%3V5?Q}V1}D5BT$ zGp2YE>~Wqj21U}hAMhcd&^s+SeRSlnCzV_fp7MgjiF0#`Mgsj57Zas zIKv5ut+$0{%s$g+JAH?3?R2WZa-Yuot*6_pA>bdTELflQQ)U)O0 z^P}YIlgK%;P^^y6Zg%3w2kvjPJQ-5gELIHOXa~M1OL1?qc$u=b`7b~A$QSpp&nT?l zu;jC|2G*5h$UkboX`n}M+v;J~T`)6?11Xz9uT==JPPUmL^s7;&s9vUkN2ej4z-sq6 z)fY;-9=ns%a8-RM%>AU+A{Ry=2mE$m?{$*jHm|#taqZKzk1YD(jQ_pFjaTTgek2o8 zAXUM}=iz!yMvl}2Jlw4WqYYtZfP#|x0Z>?sLFU4#i=%I{M%2ug0!O14Qj=M9+%#&y zIMA@P;hUmLS}ACHcNgm{Z^Pkw_*GKX^~Ze)9`2yYCUlP+;85E`qvqQy->1V5DM&{; zblLTK?%Vx87AJMr2G-0*{TUumePLNs52@5{<1=c3~25&ZGx7r^#3nN&>s&Ny3Yt-aNE{qdZS@A@f}Aba{T)Kwr?JT>O_Aq4*? zu(gUF_dCmc#G+qmyhAsLRaXyver8k}lJo*KYO07cefKgF)=zF$EXz0NnRgzvI*2Z- z+7mzU={|rs$#{`^NpRv_ZFr+!j*g{=lo)?bmAz4eEDI)~2%+v$(Zr&UhYRRSc~$lySEa8UMrsjht% zy_p*gH)@=h3J%pib$R zMdcM$RCbHe8`3_q5brtc`u32e&Zy4By@>jfFV%ovW)y=rTiH!rfL4X|%de=+1?Nk6 z;nMPTft8$~J}N4k>d7#bdtG8*i+!F%O=_vk6dwZ`?Fck6I=l>a@8JouJl5vW`tQ{` zII69r4zC(d7Oz)UPcgU}j~3btKH2|FU2WY>%0I~%P2LahZLB-iwcl>;3$!w8kkkEA zP*`vG?aLg7**tH{SB0}B{gb6G9xYl$AA^|l=U@(9xM}a{5?(1Xvkhm|lYVuUyLSPM zx=c9ZxKJVy-O2G#h2_dU!gN#86xrIc;m0z0gxH${*#mnl^4!f!8|#z}1oCq>+Rw^2 zYTaCGXX6$3-}gN|T9@Z5-MvmL32Z!ewdtpR&Lo@IV93;?WsYXptzNs??|-LAvSFe! zl^y*!@x^Gi@39th&gSP>o;G`EGrzM$s(Z`$X0_Qmwn?Ah_uU6mr;DDku6v$uaqJ2$ zox2g0-!N&+gINiEO6ldB;R`OcJGsSA)w- z?G9YS>Ew`~`C$9wM71%v;h^;j6{NAAPlUoY#8M1m6eom%O>ud7xipwT%GcC+%S%+@ zng}Lqy@z1e=eygqn@H;uxy_CZ?nAm$-Z=u-D6dYRk_vCQ&r?ARgTa<-z%Lxer#G?z zY!vHS1{bRQrHL0zxu&L^hNiT`G6hr7cB-jT9+VE_V+5&_lQ)mc**C!9WW9G>*W&%1 zfsbWhR=IX!zN`oOdR{Fg+1ai&Z3ceK@|Efz$toF!I<*}^9I^NUu3q~SF|ZNjXoCD5 z&Qe07B297aQ998rwH}^tiPbFE)sk`;N4Cnq<4u8w%BE--md6mf>Rv0dB1tqi0#+4ZXVuXF^>7gJK1r=-X016hW^ZRg6pp$|B$ zPhj(_QLZrf{_tvjonYBD%Dqm`>~bp;5THWFHG5_Rl~$YdO^4ZpJ~FMTwO*W#!QStE zyb9I1agll>#lCHte%A9pR>0q_!Y_5}iwi*`L=&4bAlEj7*GRnle814W!nH!~_?cTJ zo3LY-vdJgw2_Ljy13D7${0(9);$cbQX_OD)`X-2HET+cjh9~=`J#g)M!E=Dk=jibH zfZQ{2=r;6+^8+;@BoYFzh&NA+9%(CkdYtJhLZTPlBgGgG7s1s;zLrLQH0AR$Mc* z=U9rYN|*x?${+-W;+rTi7(D{EgT(Yum=v+p4NmNEN#!vtEzUdHMy6*7Y>8ezYZKLN3d*|BFWudUeHOTI z_(`sxuK2^Ql-~LC3wBbt4(_M9sJz!@)&4pK7M&GcHiP9@>ZQ=MHHQqx1uayw^esk+ zH&N9ptPD1ECzUoDCuvco|U{XVsoQ`-AI$-8^fyCmV$MCEXyEqMk>&D|S8kOs~0M+y%cj4Brc zCI0g0A{hw&S8j;EEzQ zW6M^`W+@MZMU;gs(k#yg3T!yjNjoXiROP+n>BEHs(i=?2t0~@rML#Ldn{O7l*-95E zdt-bT#Q-z+5Vplr&O=uoU0g5lE2%+ClC})bRml_Zj;za&R)crIWbc>8<)c{5#|ARe zVBCnV^p-Y#Ellmf&c^CzDbtzMPfOnuP|#3i0&}teC7~CzB)jCSPATmj4uChYl#QQ+ z&T6W)gcaWI3MhS4z|>6oKh>&j^t?OmKl;N zP4ug|1k?UnR6ZNj0U2Qws5-`l8h>zz0k?X+`63T8c%_4a_^9H8V}5$fUP_VvkOAeA zJxKs(=Fp&lTbO#+$@K?v>k^nVL)Lt))e{%YoHac2@>QK8Q%}RFY>r(wkMACa+&t&p z4F1`&a?%AqAmpU;%-YFKbAAZRjfjs+WT%E_+r}m!1W}4i>_li+)-0D;4=Inc7a1is zOPD1`8)3#WvK>e-f?I~%n?il4sM>8v$lW?}%JpX4SMj@=R1&z~)d;(qtc5wsH)B{5 z8y_?$;E|f(^^konhOBZ!2kTQFovRyvctEWxm?2ZMLQnG>${ z`cO?di4%}o>WZW*t`g1WQ%YH$Gv1rJkw?rM zhIJ~CqzsP+z1dyj2n-yRWD1agk>d~2<4(84s$HJwWIj374+Rc0)7~ zXf@bKtUyA;ui<){7-}S>5#q4;zG!ir4R6T=y{FzX#zgeO>b<|*ElSI$o-IGkNHkqa z%v+$}7i1K@u7isd+;QZ|J}mGylqYLL&6O`CIvmCJ4WA6WQCZ9mOBSTyv&tm%H*O*V zPT%GY4kF(p^9>C~%2>JpW{!KhRVtBE`imHG=Z+3>o8FCG;Wj;0W!^h8f#Exc+#j$a zc+7BK1NKEZLPS@U(ZMwOophQZ9gpra6^(c-@^n3+TBrHf34dx+F<845o@IF*cFcPLA z=ZO9iz0GV1IcPB>xm1f14s#?SoOnfIi1BhJAM^qbr%fQt%Pt}9$Ie?hd5C_|UWniG2<2HvD_P|8cfwzq9f!uDahKAXVP zbyFiFZZYoziBk$$H!7o+!`aBB%E_F^QWS4i0roO5p{H?+6W0G7rv%vbE(z>PWX+rW zgVo|o=F==riOrUma@VbqpicZO690SW1cq>FPlt@Qa) z|DKA!57fFN|M?`(=0m>(vOh09c>nDUFMAl5H~A_ex6kR$T^nL+S*?(p_k>(tGz0yO z9%L%dD5)TYvsdYP5Lxb!y7dS{*!LcJXtorqxS>LcJl4d0-(`i~1qZsZ!DXYjkibBJK0!Zw@xlHZ#Q0Ct`~~r4VPR$d3p4&V zp)U;o^Vk=i1R1+PdW4XZTMS;8(1=*Y8c7(7eOkP$+|Q37;+eElFbX-)Pmh~T`vva+ za=IN2ne2E z<~ReqhV~lWP%Y#whZ{`gI2NciR zrx|SLZ3w2H@IGdUy`OGhPo61vI1T(t-vl2)Hm+qJWdX_gNT-U=VZyxc36obEJDL8& zA-p^l<23wMxIB%8fsxpuOItWuWwR-)XaudFbYEMq= zlXJy+fS~UI+*Sp_kw#8buQ`XKRCh)DktYv9NXrynn3# zc&$P4y8~+jGbaEO<6pfA3fj2=v;Z^=?2JqRnio9*7#JB}4@~p`onN&ifCknUMgq2G z)+PY@UlIW)Ba;`hg@cjlSN3&|uX!3KdbVEzAp?7H6ALqQ;ID3eiIjjQHmU&j-|b&B z;(umd@A4%Y%j9*;U$n+QNSRmm=9Lh6rG5UPlHdI~8v=jPG|G<7Ca-0`q=E)cCck)~ z|5`n-q>Yfdf#aWgkT&=u&%pQxt@BTs2Qa*@&2PR%#P%gr%)-_TK&NJ5D`4wn@u%R| z_-Yo$Ky#-Tb+R(B&@!bB@s9qF79$B@UiU@tqg)yhsS#AGz>nVQbqZm}-1OK^Rd@?dQ^e=m^{64xXznIj?5 z06`KYT*&(9e}nS0`We0evJ71SQXHmK@PQw2`r!<`K8b=T|rA*U?PTNOjK+H0;K zUf18wn_@NeK_(!~1VVad_LRIXxTpxA<9x!Gs6u7&c%Sy=zrO>y#p1X6{`0dLVwYY+U}B)A3=(`o2EaOyP-YDBMU+Mg_Fa zAaPBI!@HH!ljy7w2$rKGkoJ+C!zu5oMQtu;CHRa$z<($@1zpY?w=I&N4x!Vi7raec zVKESSQkf<%TO=DDa*tkEAX2zKKPO-EMZlG=O=Q*E2o+{ILW`{PH~ zn37oE8*hn07Z=ki^PSaY7dAF44@ovuu9z4+p4o<*^bXmCa2@W#X-~Su%S8ii6r@ zY+><;l4I32NJz<&d?v0s&sMWd^Tiul`2wfhd&wmu^$s73Vtbx%DcPLnk zclkSfuGvKAVi8F<D@J??Dusq;ps7C8-L~@rWl*;P=_aMAR@qO=CQCi9BMrhEp8u zE9R(S9ZwKV;9kx|$d*Rjf&6jywf1nu#QlM>rOEz#O`XpM`u%s(tE1rJy=GxlujFy7 zn>LuYD%#;gmVS_8JWg9WCg;(vZ!!EXkTy^9cG^69q6A|fd zImBM_!x2myv_T;q9IC+#1A+9#c4Y_8p_{RW5bzfPXA)+vExgPw@3mQrk~c@Cjg)gdT^CB=}U4jYVeEQ%||M3Fw%5RQY6 zu|eoOyxe9Umh2#e{YQ=W$Ok>3wG(+a5kwa^QZkGMK z?$Ks#^lMJ@X$m@LH8>)}2r@3dP%Yj84|I`kM*C(gRTXh)Bv{tqm@siY0p_&KR-4{x zboK!Y2!#vnJh#Hm8-jTa6}ma9c2{)ls9R*k^e#aeb9z=$fJC~$ zk#^}Yix~v0JWf20*UL=6>M5<+4lHIO1xgTy9wo|`rywIRTqt^b;%ol(cJMR+)h zK?|9}$t#wrolSY4W2P9)d+8!~_1nqK(NTlGiWJFt-HyG5h7ax|$xpFr>N&yVN_O5t zq^){Ob%RXS$rPq)E%1ZftS{@bWYLlFQMu1XC2jTU!-*69fs>tHi(n1o41EEXCel9z zC{LV(TMSNX%zJm{4c8O83sXg-LwO$x@&g4>&YWS#tMFshVxgD>sf3nIMi=ZB= zPt4}+OJaLTNPS{Q9#OGNx-Y4Pp4amJHOcUzman`alU?3$;C@UsgRbvgU66}(&8J}9 z?uA-O&9Ik?IyD)xR1ST^xxtr|t90SYW_i?TX`<<2sPwU_MtZSpIzDfum4s*50ZN(| z%Z)cIKREM@{728Dr!6>ecBy>JB-Zj~<3 z%zTK+<_+ge^*({;@i;NfN2)j{Nd0Iy$03{<@Ue&~oA_qB8vspDH}-5G zc%l^K%&(5_=kkr{TC>rYGx|ir8>!MUTFQv8b_ZJ8DZ0J z>D@Ezl#7LDD-0!RU`#ZYn=*|C9Y^Ew4=nsnt@G&emDs5Uud$LJh4`a}aQL0*#$Rn> zt4N!=l^zXYTyMurF1Fb5q>6hmdyvvM@vZUmsFN91z0mE}MH^hw>T-I8U|chtK=NTI zVX*vpzT?3&qrrfU>TX66E{NfQ-G>XU8*C!G^@7IrCns5>AD(Z;c+kWJVi%DWW6cD`FX%Sdoxi3Ci3gdzq$+^x{ifSEq$2;b zB}}*vYmo3W&Q&>DJH8+hH-R8grqHo>V}9@ zC5KxtMmle?xFhy6&j!P;raMX&ildrIgM-G~fam!e^Pdm!AKtceEwY};g$e7DUh4Tg zZ}0_NA-OtxRo{7tDHRUFrz%bm@4gN9@q&CFj6hQL-DXkQzsn#H>3WPDzrO*%Klih7 zg0&#?D%t@k6QJ-%1QAF|-;aMKRer2y34ES2>E!#=k=?1LcSX}0)BWKw2npq&AB2l_ zM|qbx7i+CBic)AY+gwaIdR7H(O4g!fuBt)>TxG?B$(hEzVn=hDr2>YMIiJ>|4Ys$J zZcn$LB6r*MGrZ@|-RAW;Zk;nviFTY|dC(iolPdCA+{xO`#LeJR?>FGy5vLKr4(9Sp z%dE1cCD)`?cDh8Vn@WXrwPKd{Ngz+~k&2M2|Hf&3HG=<$O=DzZX88+g_hxyMNi}$PZg~(<8SYP+g_s2N?dagdl9bnSge_1Fdn{fwPn--wAx?t-;e?f`m0S zGs6gdutP$SN!7_xbZUkSMfh%H-KM@`x`+}18C9zGeYp+`o}stfAdlQd=me8oBSG7 z=`T>^MH#=Lmj9VD{sb`qbbsC-jrgw~e?vRQ1}_lJi;iEBjbCe`_!}AenIA+_BEjP4`AuPdwr80$2#t`n~ z2iiFy5r*KfrY95_`P}Q29kEKnUCa42-=iQ>cj3X^f!7cTfC}m>s>HSFYQ0(1om(OY ziQ~zr4Q1okxA(i|)m*NG?fkG)Lw+@u%~kkLI+1w{OwK)xNScY+{ej#JV^ z28D0FK5$Yv?Qpj{4NZ4vy*=dffg~SEBtE%ZnAVS2%IrLo0k1cMzZ#lhO3SPTvy2k+ zbG!55G$E(rzVX)bf`(408+4bmN68$}GQT5gD)fjl#2EQJ@T$Q{(sQ6cTMSI4DcsFt z(6`14d%L*er1B!dRfY2cJPa$q{@=Wf{tiddv;X;GXZ%+i4=3IyFsQd!MFpH`t{pl(;jakYdOPyYex0`HUp%Q%hj-6-+Nk zk||vX&47*jztgikq}kb2KJrMB?oPgNEb{R1@F+NZqRuI6*t1q;{&0uNELH+dF{Jpb zGcYi$tgM(9AzLiPlaji-k>VK%8|F7|B+2S~%a8{%B$g=)3k%FbG5W9Ca|N{@Z|>9Q zvKBGve^;27<}yKgwat8V$}1`+>Rr<2(wCN&>~xjZxD>CB+cWB;P`4smTUC|+S`2v9 zy*@wh`sB&+(s2GWLRaX1V`F2@i;)r$d3p0I=O@)A-7-Zo1|3_xZ#z0V8W|aRc}eou zR8}6I9BbW@;vOnBN~?43;=g!tnL@z~z5TEc3Di9PF_)6~$Qh(sb46-TEUc16RX7M0dKJUj!=9YO1@e$&21 zC@U+gfPn3T19ha5>c6%}?o0ae%qg-%600amP{q^h_H(nIR&J;&j2xyniM2G$s z?&v)_3enQi0$iIWJv=-J1OmD&;PKrZ!S2`9$zf{!?d|!M?$31}@6%nL#I3G+a}X@8tYqWEx5#~!l~RDQsVS6` zbG&_(PLCjeU<1;J7D2*IwA(v7&rVHgs;E3VJvnx0yPqpyF9~z*4%5)q{{1-@0mmX; zzL_y-nlrT6%VrEZcZGoT(ncT%)E$(*K1jjc2#TyjtM9iz8GtM2O&&gMB7RlF%?3Vt z6dM;88XB6P{~TRbRbOwkw?K%49vNJ}E{YO4my?6WEJeJ}9K^D*vB}BFwY0P>^BKTm z`aUWo4}0RKnk(PDdDGDmdbqs^SlHRw+1kFLC(AP)MZ|lZ306n~F}w7HzrsQo8KFn> z>$zZ~SI#yzH3idW*MIzg2?_b#hw$<7p-?F8KX8kmGC>e&=T2b&;NmjZ*{O}q&dN$n zO`sU4MUtv?Z?EFRfOtfr#3EsYzI4}T2Zf^(R^FmKgbheX|la;&T z6y;@LO!ETQ01vK#s8*_I&EkxR&tum%fQ zv6Bg3O;r%>+X9u!0$?y0C=?2iMn^{{CV1g+&n+`)Iju6w1WkwlSk=w7&#r3UW@qo0 zg~1ac-QmZH(~fcz#at(CsjVZV9#GXjE)}$Vi2GLw4Pb7YGbQc%9PBwY~7FJd}2V0n9lXo2*L!UkYA_&9EWF_*$I>O4h}6Dr<)6SHYzCGqH4OjJ!!(a zpRkQS6Lk!cg@xZiLTrqaNUk^>7r@EM3CcfxwkscGUQW*P`ns&7q+VJAsK>`@-!|8y zc&^&ybhCLj7!a9c9-I49KBkmMgr^vm+EjOScBbo|T*_m!;HpH~*kq+n<5{?7W@eJb z;N0AzndqMq{Ws!ra&qhtil&~PE22Y|-dX;P=yug~o%gaH7^Bcz@%&yi2$1#ig~i{DOk8)iEidwkN;#68gxX+O{<} z#~YLs=|(7B$%^Acq`1tvypBYwb6LhqZ<}bIy78+51-$rlul`hfR)+fq{W1FDIpefpLWaeojJQ!s}x<2@?2r z-Aqwd3ghDP>tl6R37sFZg zoTs`uL9C&7?sZpatQGdZblWI;R#*B5W9MUf`p29i=`?A3BEv$~1vUI@(E*e?Sn~+^ z8vpjK!>XckIZP4SU9XD+PM)rIhWQw;6t6`uNdy)q76$2aUTqJIfN0D>JdE&%1y>&4 zLhxbS!>qfGAx$%k@ezSVfkE`bwiDUWP4$L{zF2-=-3!PFYlKM4g_s~ zZ?EKOes{OpYGs;I!NStgZ4IRaUilQWBD<*?Us4^qtQ_5Z)_y5j*^uqck&%(z^?~8x zdshD85fQSHSYv_La2$vF`ud#0qoZ%B zWM^kbXMNyxa&p=&lXhZ!H1m=`th>LTvf{*JV^mv1gWL5$(Pg=t_Q{jEmA)*8vC_zs z!4Njmk>G~SiAoD8X9tJ;u&|qwPupVI2tA@+zm7dKGO@KCccAt=I~dxkz3}_9KBA+e z^YV1}WNv1r2Z~^5DB?6L6`n}dNi(cP!@`oCmSzeEsi>$t>X%YfY|B(m)ca@fcyB3Q zX%Sh1NtB+pihoKV{_iTulR}~V&rgpnEiJiQeGVr)5NWmN2l=fB%2ZdbT*1S`gN!DL|%TwL6$s;YPP(xt=0 z!|({6dwUa{Du%pENLXE1urM{PGb@BU>Ce`DBq?b>QNgIOzEL(sobtfU)peb}EF)uX zd*+wByZh+qsF0A5%Tj0Lt5@qD8qECsLv3v~r$;*p2?rf1H1@(WIf`Y>H=M@dv`Y#?L$;qGZFROEZ zF1%b^_wTQbm%A{lrfB6c>p45`Hc|VZ&Nkw3e=h%bef&tn&ApqI>bJYIqh7IV%2gCe z>E`C9n`fBTw;~}S!5uCwEzS10XnuF0jS@ekZK1TJMD+RoJ$82cmEOh*-wz08EvUv8ab;gll^L!x=6@KVH`rX>I3FUVz-GdL4 z8$~5bPRr|m?z1xvZ8&=#`YC2+zf*WCbW3`Xn-urPjSx83%s3o>ZE195By7ujZIF#T zG8mcOw*n7@u3S)1P=Ms-wM5Qcp|QbS1L>l#IXNXICATD%nD+i`jM0@dGBW-{j6?e= zBSRB~;xH~2F)`2RTpP-dq85Mssp}{vFfb4s8+$O%$i~*T-JDxlNog=2h0@YOt2(c) zt?}Cq)70o18&5*>h>D1~Z;lJ<`NCvBwz6WDZ2tXQM#N*_tM*(|lx~GHdz|<5&nwX_ zy&hA(Bq1L1^70-YWzFo+kiT`?#ZQ*$t*oq~4M|Ai4%UY555LeIE zF3ZyHbFixI>iXSTS&iJb_xjKL+H?K8_tpF3d8~}9Jh`6y#w8&kv9=f=AIHL!aCPN9 z##8Pc92E0C;Z^BsZ*TADxYKE8W3#uj(=#+A?y~sms78T@lk+FVP@YkYz#}zX-NW?} zo(0yS{(i$Bj%jk~!NI{nLDwWho8}(y^W#`S9~)J=<2m>r&4duH85Ubc5{k|^my@s? z{v4zB-H&eI1|)5uSn5jEO}~k?WUEzgMSg~F!>tt0-8e9C$06dI2=>jJ*}1uq5fQ)Q z+HT+^cKk-+QQ}*j?62Iwr~HzaNA<0h?Vo>mc^Q;?BJT3d=?k0zoEox|ICQ0m z8ki*$%1--DRC|*UOk+vN<-}KoY8V;ij<+*lC1SE0{-AMsTp$v2R0|;S_;EZmYj2a_ zu<%yZOa9IA@<&We442DxqQdQXcj0QbVfyf}9_3GEWo2mn;_u(T7Z#2bK9MyxPBAg5 z<>#|(Ck*K37gXE$_3PJnPc8JY#-N$5 zVb)EZ|0(0oAPn0Mvi0}(XJgBK(f`P=xtT*(ER~v&Ffj4W5eo|&TO*^WsA!86KR>^q z!S~Wqb~d&Nz!WdJ$HvA~WMnI|vu5`8RCn(xvkU7GNg%P`J2*HrQ5=a~53_hDjP^TN zeJ{CSps)Y$brUPLcX!`X6EF0 zFL$TG6NPO8@o`VX=mB`^7__*QjuD*goYvGe7qFm*hnVFfMk1nAqBfq3XJ1n8)T3>Z_HJt}3J{_Wz zc4%=^|7)jno#)|CKi4k-m1Wjj$ccAJ4N)zR;S+H-oU60 zU8390v_74So15%&(7pEKKTPfI&j$@0k_DV3MGotOa0m(Vn#p>|cr0nHR^`N7@%T0&>3Bv&}i1$({__Sl?u%T4t=$xhc4CdC@-u7DebT_$$u zJiTJ`?AdCS*B(2nX1uqzcW7v6c-RwqA8JTUOiYJXQdYk4T~hUJKtKR+aBOTW5Y~*v z4?Sh&$e0*SGc&r7Un^^C-heXzPoADfOR4^^k#M4u{XW$jW#YX8f`T*Jry^8a)rXUR z7ZV)-0?Q5UVS=Qj8de8#EK+w`O`vy4NMy76yhJ9$@7xD^-X@F%BDz69<#W6cx4F3q zj}0Fmzjca&v1>dcw5m$Px+Fe6zC}}sZ${hhR~F&I^bRvGuU1MubOtE97+;R0oSd~{ ztFDvWuT!f2-rkjtUPbCc$&;g_3Ymuo2aOF4(~Wh6WTd2@va(_pTCOG0)&Keh)A&_8 zhhY&q4jT(l95bvOxbV&$WmdKTq>rj0_Oj#F^1mm)9%Oh147 zhKpL=-rqm%@;}d5-8>~A9r;NS-o zh=gQL7Im<{zr3=doGRwq7=Gvc{QSt2_80PB%i;1rxDZWo|I?ii=R^9d1A!xQ2gUXi zLZ8;zS{??OnE&?%<-c+<|IdR?#S+OuG5wCD;BOX>iHW%-nWK|Sr%BAF|NUtX-JN~h zdzgXBc;i)GE>IdUFftjm=9R2KF0_I4>Z+;L@(Tie)B z_Vo`SoaWT9t2+BL21<)i9(v~6w{KeV{sHMG=9(0B5 zpu5O#ZB74Aa{TN{{3~6=ncs$+tr5d?(W9MAeF4X6<1wd-B8{G zIE|%`kI(k+U_1(~vD+W-3B1zc$v3X%=Hz^cc<|r>$ON5%i7VLMYHl|I%v@bvW7!OX zk%4lW!bsayt6#x*1*95x>r6kLtgNm|B7nTIE9f6`{cBh)>972E9=5qzpTg_n{49i8YqyljJe0<#mH+|Dkt zDSYNqpb7Mvn{dYiK+LBS5^zoW1V*DzojcmvVvOFNs()Bsej5D^3IOU_HAN)ehk%Eh z`+80YocxE1jm=u!R~I>OHa$;y@ggq{bL|`)IJ%5?FX$&390$`lg_3J*M~c3G=iR+c zOhJ(|%AVcY7RTZ1>l?3Rsi*hh>)-V2G{f)At*r&U|JYU;X=tR6c79P%Q&TfCnixX) zi-J1VK9t6L)$LL$k(QD1lK=Vh=gke_;n-o~pBC5GmBdimr`YK7axV~DzP_S0I25$| zCkHk&F_h@;_IRGpq8{@gF2F})NsyA0gOE^f8Or#0bad3v(D44guHT;#t2lO}^i1`V z>vfq7VyP${o!~MchL(ML+1Hf9?n+fYKwPDze3STicz5Ed1RSRyLUaJKMJ}^{U|=Sm zP(w#2HZd_#E;%|ndS_<`y4yS*LWsCHUDzL#O(S249qKkxWD${_y^^h&6`c2;9~Ud} zEk30{fb3;~eE+(0`?kJg0pYu_umG%#NNb5<1}8&BLf;0^d;2nQ(a_fi!}knk!P4?l zP#3+Q z6=y4DWo73uQ&LiT6OPu4yO5G}m2H9)$8fn*maLwqDBlBZU0o8Dt(6r)=Xpd*IhnBg zIyhCvO=DQv+KhkizA=S)M5Ikrdc?2*CpAn2kI0eH3^S}99!^8eGcq!Sg@j-R2M2$f z6(S{Fg^XsIYl@3wIxH#3$PWJe!Om(UvxWGfp%H{aqf175y5r{Gty+#03QEdXE{7Xq z%o#VWv2k#K-jkA&ei*XHBkGt45PU7oCdEZX&Ua?#=Xt$$%}<)V#JvikAQ8Ty;f0K3B0!b<8Z#^_RK#%pQ(V` zMW|H&{H2)`1vuqPWYb{7N)$0!t)+(XZX!Tlh?J?@UchkW^G+ruFEKM1BxezPl~VJeKVrc&uJKk})%9S@&hW zkBxN}NSdFYe_%8C<}t`_HdfZ%?QNuSFkNkZy<`=nLQ?DmZ<=M9NQjAp(daiTyyR@q z#&mRnbtd;JTGt`;02Mn5`n1Ar?cFk8fQjZLgj#fTbl}SWo}A!QiQMzcWuc*=;pHWw zCAxi^p3>IyM5^2rk9Pm`*rnw;PyXnGpRVN64KqMj37TV(4?&+wj)B1R+osLe+U9aP# z0fFQ>*Cl?jzPd_SZlS2E>d=w!;O5Pnm@lS>3!lI^BhmmUAlQO@g()W6Faxm1vkEMI zUy7*r^*`A24@~Q^X1vX%Km*MwoVTafu4&K=c{mhwiTnco5b>CEve0R#p3*B`Epq z&WBZAF5&Z)=K!ogBIxdyHwf$}t5^zCKtli$fM9gK!knF%c|F8lTU+~rgAkVr!N*wb zxl`ZPhC}dxm)s6!p;zJL_!uHxbT_nT%-gryVM(tN*x1-^NdhFpYzbVGefR$Tz!&ul zq~w#|ufjq@e?A7xgs6w^0q9d7kkTSlU7ely7fRU$kjKn*i+cb0Mwd^DOO#Z6MzH%r zeEv2!D=RBnRq}_Sy{2a0##q^HLc;BJO37tN2_ekvUFGHF1p&@jLpU)sw6wOClby|y zK>+ct_x|#&sHQ#8GJAVal&MM&4oSJARUIH7YwHyP@zd?2ohJqcV}SL;BO~!0mi&Bt z=ZCcyqCo8i1{8@MVji1GM;10!l8|*-v=Vtuk;nt)2<9myouqP_)|+$$)zE5Hqk}Zg z@(ABL@!pFDQx6bcyOH_%b9Cjq*w|L~@!{d8mX=Jtms~YAHYTkg0~kwPOtQ4RtY>V@ zKBr8BkR0W<5QHSB&CjLgXcou%@9Xvjea@nPH{T1EAApmdo}Pk&0#YQhs|f{-5hRK6 z@dJZ{?0N-1AVeSMCQU>=(g#Z=8lfsDI3=!c$8!$SG%W;X1!g$2#vCQuIJDaVQ~iY zA3k>Hh3&O(m{EE?E2Z zh0G{{joRFF-Ag(GHn9I@5)xOANnJR(BSGeo-)2^6n3@HqLZKk>GX>GTO~i^pfB6|p gw*UX-W0!LR-KkS6tRts2_&5neURp&ePtqjtKdnv~ga7~l literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-10-u8.png b/beamer/sea-of-types/target/sea-of-types-10-u8.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3850533201803819277fc2b16da6bf67b880d8 GIT binary patch literal 104356 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ð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 z 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 literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-3-real.png b/beamer/sea-of-types/target/sea-of-types-3-real.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec9d6948bbf8529ab90740bfcaa1a5a4389d9dc GIT binary patch literal 18421 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

*Egn0pwR$rsLnqa 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 literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-4-degrees.png b/beamer/sea-of-types/target/sea-of-types-4-degrees.png new file mode 100644 index 0000000000000000000000000000000000000000..be189015247645aaf21326c16a79369f379e9bcf GIT binary patch literal 13940 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 literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-6-radians.png b/beamer/sea-of-types/target/sea-of-types-6-radians.png new file mode 100644 index 0000000000000000000000000000000000000000..61cc5bd84da92ede3455a336bff5f346e53b178a GIT binary patch literal 21056 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 Pf>2Y@QhuRme&c@u`J94` literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-7-angle.png b/beamer/sea-of-types/target/sea-of-types-7-angle.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbfe3db7cd96f68f3662831635cd4214f5d4586 GIT binary patch literal 22085 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 literal 0 HcmV?d00001 diff --git a/beamer/sea-of-types/target/sea-of-types-9-u8.png b/beamer/sea-of-types/target/sea-of-types-9-u8.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed34b073350b4fd4492d1478971d12c4bd572cf GIT binary patch literal 56761 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 literal 0 HcmV?d00001 diff --git a/beamer/lc-beamer/solution-traits.dot b/beamer/solution-traits.dot similarity index 100% rename from beamer/lc-beamer/solution-traits.dot rename to beamer/solution-traits.dot diff --git a/beamer/lc-beamer/solution-traits.png b/beamer/solution-traits.png similarity index 100% rename from beamer/lc-beamer/solution-traits.png rename to beamer/solution-traits.png diff --git a/beamer/lc-beamer/solution-wrappers.dot b/beamer/solution-wrappers.dot similarity index 100% rename from beamer/lc-beamer/solution-wrappers.dot rename to beamer/solution-wrappers.dot diff --git a/beamer/lc-beamer/solution-wrappers.png b/beamer/solution-wrappers.png similarity index 100% rename from beamer/lc-beamer/solution-wrappers.png rename to beamer/solution-wrappers.png diff --git a/beamer/lc-beamer/sot-int.png b/beamer/sot-int.png similarity index 100% rename from beamer/lc-beamer/sot-int.png rename to beamer/sot-int.png diff --git a/beamer/lc-beamer/sot-json.png b/beamer/sot-json.png similarity index 100% rename from beamer/lc-beamer/sot-json.png rename to beamer/sot-json.png diff --git a/beamer/texput.log b/beamer/texput.log new file mode 100644 index 0000000..5b78488 --- /dev/null +++ b/beamer/texput.log @@ -0,0 +1,21 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024/Arch Linux) (preloaded format=pdflatex 2024.5.29) 23 SEP 2024 17:46 +entering extended mode + \write18 enabled. + %&-line parsing enabled. +** + +! Emergency stop. +<*> + +End of file on the terminal! + + +Here is how much of TeX's memory you used: + 3 strings out of 476023 + 111 string characters out of 5791582 + 1925187 words of memory out of 5000000 + 22228 multiletter control sequences out of 15000+600000 + 558069 words of font info for 36 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 0i,0n,0p,1b,6s stack positions out of 10000i,1000n,20000p,200000b,200000s +! ==> Fatal error occurred, no output PDF file produced! diff --git a/share/cc-beamer-template-master/Makefile b/share/cc-beamer-template-master/Makefile new file mode 100644 index 0000000..af09ed1 --- /dev/null +++ b/share/cc-beamer-template-master/Makefile @@ -0,0 +1,41 @@ +PACKAGE_STY = $(wildcard *.sty) +PACKAGE_IMG = $(wildcard ccc_img/*) + +DESTDIR ?= $(shell kpsewhich -var-value=TEXMFHOME) +INSTALL_DIR = $(DESTDIR)/tex/latex/ccc + +EXAMPLE_SRC = example.tex +EXAMPLE_PDF = example.pdf + +CACHE_DIR := $(shell pwd)/.latex-cache + +COMPILE_TEX := latexmk -lualatex -output-directory="$(CACHE_DIR)" + +.PHONY: install uninstall example all clean + +all: example + +example: $(EXAMPLE_PDF) + +install: $(PACKAGE_STY) + @mkdir -p "$(INSTALL_DIR)" + @cp $(PACKAGE_STY) "$(INSTALL_DIR)" + @mkdir -p "$(INSTALL_DIR)/ccc_img" + @cp $(PACKAGE_IMG) "$(INSTALL_DIR)/ccc_img" + +uninstall: + @rm -f $(addprefix "$(INSTALL_DIR)"/, $(PACKAGE_STY)) + @rm -f $(addprefix "$(INSTALL_DIR)"/, $(PACKAGE_IMG)) + @rmdir "$(INSTALL_DIR)/ccc_img" + @rmdir "$(INSTALL_DIR)" + +clean: + @rm -rf "$(CACHE_DIR)" + @rm -f "$(EXAMPLE_PDF)" + +$(EXAMPLE_PDF) : $(EXAMPLE_SRC) + @$(COMPILE_TEX) $(EXAMPLE_SRC) + @cp "$(CACHE_DIR)/$(EXAMPLE_PDF)" . + + + diff --git a/share/cc-beamer-template-master/README.org b/share/cc-beamer-template-master/README.org new file mode 100644 index 0000000..323b7a7 --- /dev/null +++ b/share/cc-beamer-template-master/README.org @@ -0,0 +1,37 @@ +* CCC Beamer Template + +** Install + + To use the template, simply copy all ~*.sty~ files and the ~ccc_img~ + directory to your project directory. + + You can also install the template in your system, so that you can use it + from all your projects. Simply run: ~make install~ + +** Usage + + Simply include ~\usetheme{ccc}~ in your document. + + #+BEGIN_SRC latex + \documentclass{beamer} + \usetheme{ccc} + \begin{document} + \begin{frame}{This is an Awesome Theme!} + \end{frame} + \end{document} + #+END_SRC + +*** Options + - ~cfaedlogo~ places the cfaed logo on every slide + - ~noccclogo~ removes the ccc logo from all slides except the title slide + +** Build + + To build the examples, run ~make example~. + + To build your own presentation, please note that this template does not work + with ~pdflatex~. Use ~lualatex~ instead! Please contact me, if you need + pdflatex support. + + + diff --git a/share/cc-beamer-template-master/beamercolorthemeccc.sty b/share/cc-beamer-template-master/beamercolorthemeccc.sty new file mode 100644 index 0000000..5b6ab48 --- /dev/null +++ b/share/cc-beamer-template-master/beamercolorthemeccc.sty @@ -0,0 +1,31 @@ +\mode + +\definecolor{darkblue}{HTML}{265E87} +\definecolor{darkteal}{RGB}{0,180,141} +\definecolor{orange}{RGB}{231,123,20} +\definecolor{gray}{rgb}{0.929,0.929,0.929} + +% Settings +\setbeamercolor*{title page header}{fg=darkblue} +\setbeamercolor*{author}{fg=darkblue} +\setbeamercolor*{institute}{fg=darkblue} +\setbeamercolor*{date}{fg=darkblue} +\setbeamercolor*{frametitle}{fg=darkblue} +\setbeamercolor*{framesubtitle}{fg=darkblue} +\setbeamercolor*{pagenum}{fg=darkblue} +\setbeamercolor*{alerted text}{fg=orange} +\setbeamercolor*{item}{fg=darkblue} +\setbeamercolor*{subitem}{fg=darkteal} +\setbeamercolor*{subsubitem}{fg=orange} +\setbeamercolor*{block title}{fg=darkblue} +\setbeamercolor*{block title alerted}{fg=orange} +\setbeamercolor*{block title example}{fg=darkteal} +\setbeamercolor*{block body}{fg=black} +\setbeamercolor*{bibliography entry title}{fg=black} +\setbeamercolor*{bibliography entry author}{fg=darkblue} +\setbeamercolor*{bibliography entry location}{fg=black} +\setbeamercolor*{bibliography entry note}{fg=black} +\setbeamercolor*{section in toc}{fg=darkblue} +\setbeamercolor*{subsection in toc}{fg=darkteal} + +\mode diff --git a/share/cc-beamer-template-master/beamerfontthemeccc.sty b/share/cc-beamer-template-master/beamerfontthemeccc.sty new file mode 100644 index 0000000..775d79d --- /dev/null +++ b/share/cc-beamer-template-master/beamerfontthemeccc.sty @@ -0,0 +1,11 @@ +\mode + +\setbeamerfont{title}{size=\Large,series=\bfseries} +\setbeamerfont{subtitle}{series=\bfseries} +\setbeamerfont{frametitle}{size=\large, series=\bfseries} +\setbeamerfont{framesubtitle}{size=\small, series=\bfseries} +\setbeamerfont{pagenum}{size=\footnotesize} +\setbeamerfont{block body}{size=\normalsize} +\setbeamerfont{footnote}{size=\scriptsize} + +\mode diff --git a/share/cc-beamer-template-master/beamerinnerthemeccc.sty b/share/cc-beamer-template-master/beamerinnerthemeccc.sty new file mode 100644 index 0000000..be08d41 --- /dev/null +++ b/share/cc-beamer-template-master/beamerinnerthemeccc.sty @@ -0,0 +1,182 @@ +\mode + +\def\beamer@andinst{\\[0.5em]} + +\setbeamertemplate{background}{ + \begin{tikzpicture} + \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight); + % the header + \fill[gray, anchor=north west] (0,\the\paperheight) rectangle(\the\paperwidth,\paperheight-1.4cm); + % ccc logo on the left (only on title page) + \ifnum\thepage=1\relax% + \node[anchor=west, inner sep=0] (header) at (0.25cm,\paperheight-0.7cm) { + \includegraphics[width=90px]{ccc_img/cclogo.pdf}}; + \fi + % cfaed logo on the right (only on title page or if cfaedlogo is set) + \ifbeamer@cfaedlogo + \node[anchor=east, inner sep=0] (header) at (\paperwidth-0.25cm,\paperheight-0.7cm) { + \includegraphics[width=60px]{ccc_img/cfaed.png}}; + \else + \ifnum\thepage=1\relax% + \node[anchor=east, inner sep=0] (header) at (\paperwidth-0.25cm,\paperheight-0.7cm) { + \includegraphics[width=60px]{ccc_img/cfaed.png}}; + \fi + \fi + % the footer + \node[anchor=south west, inner sep=0] (footer) at (0,0) { + \ifnum\thepage=1\relax% + \includegraphics[width=\paperwidth]{ccc_img/titlefooter.png} + \fi + \includegraphics[width=\paperwidth]{ccc_img/footer.png}}; + \ifnum\thepage>1\relax% + % page number on the left + \node[anchor=west, inner sep=0] (pagenum) at (0.2,0.55) { + \usebeamerfont{pagenum}\usebeamercolor[fg]{pagenum}\insertframenumber}; + % page ccc logo on the right + \ifbeamer@ccclogo + \node[anchor=east, inner sep=0] (pagenum) at (\pagewidth-0.2,0.55) { + \includegraphics[width=50pt]{ccc_img/cclogo.pdf}}; + \fi + \fi + \end{tikzpicture} +} + +\defbeamertemplate*{title page}{ccc}[1][]{ + \vskip1cm% + \begin{beamercolorbox}[wd=\textwidth,#1]{title page header} + \usebeamerfont{title}\inserttitle\par% + \medskip + \usebeamerfont{subtitle}\insertsubtitle\par% + \end{beamercolorbox}% + \vskip0.5cm% + \begin{beamercolorbox}[wd=\textwidth,#1]{author} + \usebeamerfont{author}\insertauthor% + \end{beamercolorbox} + \vskip0.5cm% + \begin{beamercolorbox}[wd=\textwidth,#1]{institute} + \usebeamerfont{institute}\insertinstitute% + \end{beamercolorbox} + \vskip0.5cm% + \begin{beamercolorbox}[wd=\textwidth,#1]{date} + \usebeamerfont{date}\insertdate% + \end{beamercolorbox} + \vfill +} + +% Frame title +\defbeamertemplate*{frametitle}{ccc}[1][] +{ + \begin{tikzpicture} + \useasboundingbox (0,0) rectangle(\textwidth,1.4cm); + \ifx\insertframesubtitle\@empty% + \node[anchor=west, inner sep=0, text width=\textwidth, align=left] at (0,0.7){ + \usebeamerfont{frametitle}\insertframetitle}; + \else + \node[anchor=west, inner sep=0, text width=\textwidth, align=left] at (0,0.7){ + \usebeamerfont{frametitle}\insertframetitle\\ + \usebeamerfont{framesubtitle}\insertframesubtitle}; + \fi + \end{tikzpicture} +} + +\defbeamertemplate*{block begin}{ccc} +{ + \par\vskip\medskipamount% + \usebeamercolor{block title} + \begin{tikzpicture} + \node [ + draw=fg, inner sep=1ex, + text width=\textwidth-2ex-1pt, + minimum width=\textwidth-1pt, + rounded corners + ] (BOXCONTENT) \bgroup% + \ifx\insertblocktitle\@empty\else\par\fi + \usebeamerfont{block body} + \usebeamercolor[fg]{block body} +} + +\defbeamertemplate*{block end}{ccc} +{ + \egroup; + \usebeamercolor{block title} + \ifx\insertblocktitle\@empty + \else{ + \node[ fill=bg, anchor=west, text=fg, rounded corners ] at + ([shift={(5pt,0)}]BOXCONTENT.north west) {\insertblocktitle}; + } + \fi + \end{tikzpicture} + \vskip\smallskipamount +} + +\defbeamertemplate*{block example begin}{ccc} +{ + \par\vskip\medskipamount% + \usebeamercolor{block title example} + \begin{tikzpicture} + \node [ + draw=fg, inner sep=1ex, + text width=\textwidth-2ex-1pt, + minimum width=\textwidth-1pt, + rounded corners + ] (BOXCONTENT) \bgroup% + \ifx\insertblocktitle\@empty\else\par\fi + \usebeamerfont{block body} + \usebeamercolor[fg]{block body} +} + +\defbeamertemplate*{block example end}{ccc} +{ + \egroup; + \usebeamercolor{block title example} + \ifx\insertblocktitle\@empty + \else% + { + \node [ fill=bg, anchor=west, text=fg, rounded corners] + at ([shift={(5pt,0)}]BOXCONTENT.north west) {\insertblocktitle}; + } + \fi + \end{tikzpicture} + \vskip\smallskipamount +} + +\defbeamertemplate*{block alerted begin}{ccc} +{ + \par\vskip\medskipamount% + \usebeamercolor{block title alerted} + \begin{tikzpicture} + \node [ + draw=fg, inner sep=1ex, + text width=\textwidth-2ex-1pt, + minimum width=\textwidth-1pt, + rounded corners + ] (BOXCONTENT) \bgroup% + \ifx\insertblocktitle\@empty\else\par\fi + \usebeamerfont{block body} + \usebeamercolor[fg]{block body} +} + +\defbeamertemplate*{block alerted end}{ccc} +{ + \egroup; + \usebeamercolor{block title alerted} + \ifx\insertblocktitle\@empty + \else% + { + \node [fill=bg, anchor=west, text=fg, rounded corners] at + ([shift={(5pt,0)}]BOXCONTENT.north west) {\insertblocktitle}; + } + \fi + \end{tikzpicture} + \vskip\smallskipamount +} + +% Items +\setbeamertemplate{itemize items}{\Squarepipe} + +\setbeamertemplate{footline}{\vspace{4mm}} + +\setbeamertemplate{section in toc}[sections numbered] +\setbeamertemplate{subsection in toc}[subsections numbered] + +\mode diff --git a/share/cc-beamer-template-master/beamerouterthemeccc.sty b/share/cc-beamer-template-master/beamerouterthemeccc.sty new file mode 100644 index 0000000..e69de29 diff --git a/share/cc-beamer-template-master/beamerthemeccc.sty b/share/cc-beamer-template-master/beamerthemeccc.sty new file mode 100644 index 0000000..cf657ef --- /dev/null +++ b/share/cc-beamer-template-master/beamerthemeccc.sty @@ -0,0 +1,31 @@ +\newif\ifbeamer@cfaedlogo +\beamer@cfaedlogofalse +\DeclareOptionBeamer{cfaedlogo}{\beamer@cfaedlogotrue} +\ProcessOptionsBeamer + +\newif\ifbeamer@ccclogo +\beamer@ccclogotrue +\DeclareOptionBeamer{noccclogo}{\beamer@ccclogofalse} +\ProcessOptionsBeamer + +\mode + +% Requirement +\RequirePackage{tikz} +\usetikzlibrary{calc} +\RequirePackage{fontspec} +\RequirePackage{marvosym} + +% Settings +\useinnertheme{ccc} +\useoutertheme{ccc} +\usecolortheme{ccc} +\usefonttheme{ccc} + +% Set the font +\setsansfont{Open Sans} + +% disable navigation symbols +\setbeamertemplate{navigation symbols}{} + +\mode diff --git a/share/cc-beamer-template-master/ccc_img/cfaed.png b/share/cc-beamer-template-master/ccc_img/cfaed.png new file mode 100755 index 0000000000000000000000000000000000000000..6c7a52494cd6d77c6707ce6f71d19e2893ec84d1 GIT binary patch literal 26332 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 literal 0 HcmV?d00001 diff --git a/share/cc-beamer-template-master/ccc_img/header.png b/share/cc-beamer-template-master/ccc_img/header.png new file mode 100755 index 0000000000000000000000000000000000000000..cc7122b6c80fe30a3b96291856dbd6508780ee31 GIT binary patch literal 27518 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

1tTnw5Zzs|9TA{RqKC^IBCkh`2(Bd!4 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

Ho@aTzeEIS=5fKpwJ9>Q>quGuK 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 Suppose $p$ were the largest prime number. + \item<2-> Let $q$ be the product of the first $p$ numbers. + \item<3-> Then $q+1$ is not divisible by any of them. + \item<1-> But $q + 1$ is greater than $1$, thus divisible by some prime + number not in the first $p$ numbers. + \end{enumerate} +\end{frame} + +\begin{frame}{Itemize and Enumerations} + \begin{itemize} + \item one + \item two + \item three + \begin{enumerate} + \item one + \item two + \item three + \begin{itemize} + \item one + \item two + \item three + \end{itemize} + \end{enumerate} + \end{itemize} +\end{frame} + +\begin{frame}{Playing with blocks} + \begin{block}{} + Just a block. + \end{block} + \begin{block}{A Block} + Another block with a title and some very long text. This text is so long + that it goes about multiple lines. \\ + It is also important to \\ + have line breaks working! + \end{block} + \begin{example} + Something useful could be written here. + \end{example} +\end{frame} + +\end{document} diff --git a/share/popl08-tutorial-Fsub/.Makefile.d b/share/popl08-tutorial-Fsub/.Makefile.d new file mode 100644 index 0000000..46ba98e --- /dev/null +++ b/share/popl08-tutorial-Fsub/.Makefile.d @@ -0,0 +1,36 @@ +AdditionalTactics.vo AdditionalTactics.glob AdditionalTactics.v.beautified AdditionalTactics.required_vo: AdditionalTactics.v +AdditionalTactics.vio: AdditionalTactics.v +AdditionalTactics.vos AdditionalTactics.vok AdditionalTactics.required_vos: AdditionalTactics.v +FSetDecide.vo FSetDecide.glob FSetDecide.v.beautified FSetDecide.required_vo: FSetDecide.v +FSetDecide.vio: FSetDecide.v +FSetDecide.vos FSetDecide.vok FSetDecide.required_vos: FSetDecide.v +FSetNotin.vo FSetNotin.glob FSetNotin.v.beautified FSetNotin.required_vo: FSetNotin.v AdditionalTactics.vo +FSetNotin.vio: FSetNotin.v AdditionalTactics.vio +FSetNotin.vos FSetNotin.vok FSetNotin.required_vos: FSetNotin.v AdditionalTactics.vos +ListFacts.vo ListFacts.glob ListFacts.v.beautified ListFacts.required_vo: ListFacts.v AdditionalTactics.vo +ListFacts.vio: ListFacts.v AdditionalTactics.vio +ListFacts.vos ListFacts.vok ListFacts.required_vos: ListFacts.v AdditionalTactics.vos +FiniteSets.vo FiniteSets.glob FiniteSets.v.beautified FiniteSets.required_vo: FiniteSets.v ListFacts.vo AdditionalTactics.vo +FiniteSets.vio: FiniteSets.v ListFacts.vio AdditionalTactics.vio +FiniteSets.vos FiniteSets.vok FiniteSets.required_vos: FiniteSets.v ListFacts.vos AdditionalTactics.vos +Atom.vo Atom.glob Atom.v.beautified Atom.required_vo: Atom.v FiniteSets.vo FSetDecide.vo FSetNotin.vo ListFacts.vo AdditionalTactics.vo +Atom.vio: Atom.v FiniteSets.vio FSetDecide.vio FSetNotin.vio ListFacts.vio AdditionalTactics.vio +Atom.vos Atom.vok Atom.required_vos: Atom.v FiniteSets.vos FSetDecide.vos FSetNotin.vos ListFacts.vos AdditionalTactics.vos +Metatheory.vo Metatheory.glob Metatheory.v.beautified Metatheory.required_vo: Metatheory.v AdditionalTactics.vo Atom.vo Environment.vo +Metatheory.vio: Metatheory.v AdditionalTactics.vio Atom.vio Environment.vio +Metatheory.vos Metatheory.vok Metatheory.required_vos: Metatheory.v AdditionalTactics.vos Atom.vos Environment.vos +Environment.vo Environment.glob Environment.v.beautified Environment.required_vo: Environment.v ListFacts.vo Atom.vo +Environment.vio: Environment.v ListFacts.vio Atom.vio +Environment.vos Environment.vok Environment.required_vos: Environment.v ListFacts.vos Atom.vos +Fsub_Definitions.vo Fsub_Definitions.glob Fsub_Definitions.v.beautified Fsub_Definitions.required_vo: Fsub_Definitions.v Metatheory.vo +Fsub_Definitions.vio: Fsub_Definitions.v Metatheory.vio +Fsub_Definitions.vos Fsub_Definitions.vok Fsub_Definitions.required_vos: Fsub_Definitions.v Metatheory.vos +Fsub_Infrastructure.vo Fsub_Infrastructure.glob Fsub_Infrastructure.v.beautified Fsub_Infrastructure.required_vo: Fsub_Infrastructure.v Fsub_Definitions.vo +Fsub_Infrastructure.vio: Fsub_Infrastructure.v Fsub_Definitions.vio +Fsub_Infrastructure.vos Fsub_Infrastructure.vok Fsub_Infrastructure.required_vos: Fsub_Infrastructure.v Fsub_Definitions.vos +Fsub_Lemmas.vo Fsub_Lemmas.glob Fsub_Lemmas.v.beautified Fsub_Lemmas.required_vo: Fsub_Lemmas.v Fsub_Infrastructure.vo AdditionalTactics.vo +Fsub_Lemmas.vio: Fsub_Lemmas.v Fsub_Infrastructure.vio AdditionalTactics.vio +Fsub_Lemmas.vos Fsub_Lemmas.vok Fsub_Lemmas.required_vos: Fsub_Lemmas.v Fsub_Infrastructure.vos AdditionalTactics.vos +Fsub_Soundness.vo Fsub_Soundness.glob Fsub_Soundness.v.beautified Fsub_Soundness.required_vo: Fsub_Soundness.v Fsub_Lemmas.vo +Fsub_Soundness.vio: Fsub_Soundness.v Fsub_Lemmas.vio +Fsub_Soundness.vos Fsub_Soundness.vok Fsub_Soundness.required_vos: Fsub_Soundness.v Fsub_Lemmas.vos diff --git a/coq-Fsub/AdditionalTactics.v b/share/popl08-tutorial-Fsub/AdditionalTactics.v similarity index 100% rename from coq-Fsub/AdditionalTactics.v rename to share/popl08-tutorial-Fsub/AdditionalTactics.v diff --git a/share/popl08-tutorial-Fsub/AdditionalTactics.v.crashcoqide b/share/popl08-tutorial-Fsub/AdditionalTactics.v.crashcoqide new file mode 100644 index 0000000..ff2d7cf --- /dev/null +++ b/share/popl08-tutorial-Fsub/AdditionalTactics.v.crashcoqide @@ -0,0 +1,109 @@ +(** A library of additional tactics. *) + +Require Export String. +Open Scope string_scope. + + +(* *********************************************************************** *) +(** * Extensions of the standard library *) + +(** "[remember c as x in |-]" replaces the term [c] by the identifier + [x] in the conclusion of the current goal and introduces the + hypothesis [x=c] into the context. This tactic differs from a + similar one in the standard library in that the replacmement is + made only in the conclusion of the goal; the context is left + unchanged. *) + +Tactic Notation "remember" constr(c) "as" ident(x) "in" "|-" := + let x := fresh x in + let H := fresh "Heq" x in + (set (x := c); assert (H : x = c) by reflexivity; clearbody x). + +(** "[unsimpl E]" replaces all occurence of [X] by [E], where [X] is + the result that tactic [simpl] would give when used to evaluate + [E]. *) + +Tactic Notation "unsimpl" constr(E) := + let F := (eval simpl in E) in change F with E. + +(** The following tactic calls the [apply] tactic with the first + hypothesis that succeeds, "first" meaning the hypothesis that + comes earlist in the context (i.e., higher up in the list). *) + +Ltac apply_first_hyp := + match reverse goal with + | H : _ |- _ => apply H + end. + + +(* *********************************************************************** *) +(** * Variations on [auto] *) + +(** The [auto*] and [eauto*] tactics are intended to be "stronger" + versions of the [auto] and [eauto] tactics. Similar to [auto] and + [eauto], they each take an optional "depth" argument. Note that + if we declare these tactics using a single string, e.g., "auto*", + then the resulting tactics are unusable since they fail to + parse. *) + +Tactic Notation "auto" "*" := + try solve [ congruence | auto | intuition auto ]. + +Tactic Notation "auto" "*" integer(n) := + try solve [ congruence | auto n | intuition (auto n) ]. + +Tactic Notation "eauto" "*" := + try solve [ congruence | eauto | intuition eauto ]. + +Tactic Notation "eauto" "*" integer(n) := + try solve [ congruence | eauto n | intuition (eauto n) ]. + + +(* *********************************************************************** *) +(** * Delineating cases in proofs *) + +(** This section was taken from the POPLmark Wiki + ( http://alliance.seas.upenn.edu/~plclub/cgi-bin/poplmark/ ). *) + +(** ** Tactic definitions *) + +Ltac move_to_top x := + match reverse goal with + | H : _ |- _ => try move x after H + end. + +Tactic Notation "assert_eq" ident(x) constr(v) := + let H := fresh in + assert (x = v) as H by reflexivity; + clear H. + +Tactic Notation "Case_aux" ident(x) constr(name) := + first [ + set (x := name); move_to_top x + | assert_eq x name + | fail 1 "because we are working on a different case." ]. + +Ltac Case name := Case_aux case name. +Ltac SCase name := Case_aux subcase name. +Ltac SSCase name := Case_aux subsubcase name. + +(** ** Example + + One mode of use for the above tactics is to wrap Coq's [induction] + tactic such that automatically inserts "case" markers into each + branch of the proof. For example: + +<< + Tactic Notation "induction" "nat" ident(n) := + induction n; [ Case "O" | Case "S" ]. + Tactic Notation "sub" "induction" "nat" ident(n) := + induction n; [ SCase "O" | SCase "S" ]. + Tactic Notation "sub" "sub" "induction" "nat" ident(n) := + induction n; [ SSCase "O" | SSCase "S" ]. +>> + + If you use such customized versions of the induction tactics, then + the [Case] tactic will verify that you are working on the case + that you think you are. You may also use the [Case] tactic with + the standard version of [induction], in which case no verification + is done. *) diff --git a/coq-Fsub/Atom.v b/share/popl08-tutorial-Fsub/Atom.v similarity index 100% rename from coq-Fsub/Atom.v rename to share/popl08-tutorial-Fsub/Atom.v diff --git a/share/popl08-tutorial-Fsub/Atom.v.crashcoqide b/share/popl08-tutorial-Fsub/Atom.v.crashcoqide new file mode 100644 index 0000000..14b2304 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Atom.v.crashcoqide @@ -0,0 +1,265 @@ +(** Support for atoms, i.e., objects with decidable equality. We + provide here the ability to generate an atom fresh for any finite + collection, e.g., the lemma [atom_fresh_for_set], and a tactic to + pick an atom fresh for the current proof context. + + Authors: Arthur Charguéraud and Brian Aydemir. + + Implementation note: In older versions of Coq, [OrderedTypeEx] + redefines decimal constants to be integers and not natural + numbers. The following scope declaration is intended to address + this issue. In newer versions of Coq, the declaration should be + benign. *) + +Require Import List. +(*Require Import Max.*) +Require Import OrderedType. +Require Import OrderedTypeEx. +Open Scope nat_scope. + +Require Import FiniteSets. +Require Import FSetDecide. +Require Import FSetNotin. +Require Import ListFacts. +Require Import Psatz. + +Require Import AdditionalTactics. +Require AdditionalTactics. + +(* ********************************************************************** *) +(** * Definition *) + +(** Atoms are structureless objects such that we can always generate + one fresh from a finite collection. Equality on atoms is [eq] and + decidable. We use Coq's module system to make abstract the + implementation of atoms. The [Export AtomImpl] line below allows + us to refer to the type [atom] and its properties without having + to qualify everything with "[AtomImpl.]". *) + +Module Type ATOM. + + Parameter atom : Set. + + Parameter atom_fresh_for_list : + forall (xs : list atom), {x : atom | ~ List.In x xs}. + + Declare Module Atom_as_OT : UsualOrderedType with Definition t := atom. + + Parameter eq_atom_dec : forall x y : atom, {x = y} + {x <> y}. + +End ATOM. + +(** The implementation of the above interface is hidden for + documentation purposes. *) + +Module AtomImpl : ATOM. + + (* begin hide *) + + Definition atom := nat. + + Lemma max_lt_r : forall x y z, + x <= z -> x <= max y z. + Proof. + induction x. auto with arith. + induction y; auto with arith. + simpl. induction z. lia. auto with arith. + Qed. + + Lemma nat_list_max : forall (xs : list nat), + { n : nat | forall x, In x xs -> x <= n }. + Proof. + induction xs as [ | x xs [y H] ]. + (* case: nil *) + exists 0. inversion 1. + (* case: cons x xs *) + exists (max x y). intros z J. simpl in J. destruct J as [K | K]. + subst. auto with arith. + auto using max_lt_r. + Qed. + + Lemma atom_fresh_for_list : + forall (xs : list nat), { n : nat | ~ List.In n xs }. + Proof. + intros xs. destruct (nat_list_max xs) as [x H]. + exists (S x). intros J. lapply (H (S x)). lia. trivial. + Qed. + + Module Atom_as_OT := Nat_as_OT. + Module Facts := OrderedTypeFacts Atom_as_OT. + + Definition eq_atom_dec : forall x y : atom, {x = y} + {x <> y} := + Facts.eq_dec. + + (* end hide *) + +End AtomImpl. + +Export AtomImpl. + + +(* ********************************************************************** *) +(** * Finite sets of atoms *) + + +(* ********************************************************************** *) +(** ** Definitions *) + +Module AtomSet : FiniteSets.S with Module E := Atom_as_OT := + FiniteSets.Make Atom_as_OT. + +(** The type [atoms] is the type of finite sets of [atom]s. *) + +Notation atoms := AtomSet.F.t. + +(** Basic operations on finite sets of atoms are available, in the + remainder of this file, without qualification. We use [Import] + instead of [Export] in order to avoid unnecessary namespace + pollution. *) + +Import AtomSet.F. + +(** We instantiate two modules which provide useful lemmas and tactics + work working with finite sets of atoms. *) + +Module AtomSetDecide := FSetDecide.Decide AtomSet.F. +Module AtomSetNotin := FSetNotin.Notin AtomSet.F. + + +(* *********************************************************************** *) +(** ** Tactics for working with finite sets of atoms *) + +(** The tactic [fsetdec] is a general purpose decision procedure + for solving facts about finite sets of atoms. *) + +Ltac fsetdec := try apply AtomSet.eq_if_Equal; AtomSetDecide.fsetdec. + +(** The tactic [notin_simpl] simplifies all hypotheses of the form [(~ + In x F)], where [F] is constructed from the empty set, singleton + sets, and unions. *) + +Ltac notin_simpl := AtomSetNotin.notin_simpl_hyps. + +(** The tactic [notin_solve], solves goals of the form [(~ In x F)], + where [F] is constructed from the empty set, singleton sets, and + unions. The goal must be provable from hypothesis of the form + simplified by [notin_simpl]. *) + +Ltac notin_solve := AtomSetNotin.notin_solve. + + +(* *********************************************************************** *) +(** ** Lemmas for working with finite sets of atoms *) + +(** We make some lemmas about finite sets of atoms available without + qualification by using abbreviations. *) + +Notation eq_if_Equal := AtomSet.eq_if_Equal. +Notation notin_empty := AtomSetNotin.notin_empty. +Notation notin_singleton := AtomSetNotin.notin_singleton. +Notation notin_singleton_rw := AtomSetNotin.notin_singleton_rw. +Notation notin_union := AtomSetNotin.notin_union. + + +(* ********************************************************************** *) +(** * Additional properties *) + +(** One can generate an atom fresh for a given finite set of atoms. *) + +Lemma atom_fresh_for_set : forall L : atoms, { x : atom | ~ In x L }. +Proof. + intros L. destruct (atom_fresh_for_list (elements L)) as [a H]. + exists a. intros J. contradiction H. + rewrite <- InA_iff_In. auto using elements_1. +Qed. + + +(* ********************************************************************** *) +(** * Additional tactics *) + + +(* ********************************************************************** *) +(** ** ## Picking a fresh atom *) + +(** We define three tactics which, when combined, provide a simple + mechanism for picking a fresh atom. We demonstrate their use + below with an example, the [example_pick_fresh] tactic. + + [(gather_atoms_with F)] returns the union of [(F x)], where [x] + ranges over all objects in the context such that [(F x)] is + well typed. The return type of [F] should be [atoms]. The + complexity of this tactic is due to the fact that there is no + support in [Ltac] for folding a function over the context. *) + +Ltac gather_atoms_with F := + let rec gather V := + match goal with + | H: ?S |- _ => + let FH := constr:(F H) in + match V with + | empty => gather FH + | context [FH] => fail 1 + | _ => gather (union FH V) + end + | _ => V + end in + let L := gather empty in eval simpl in L. + +(** [(beautify_fset V)] takes a set [V] built as a union of finite + sets and returns the same set with empty sets removed and union + operations associated to the right. Duplicate sets are also + removed from the union. *) + +Ltac beautify_fset V := + let rec go Acc E := + match E with + | union ?E1 ?E2 => let Acc1 := go Acc E2 in go Acc1 E1 + | empty => Acc + | ?E1 => match Acc with + | empty => E1 + | context [E1] => Acc + | _ => constr:(union E1 Acc) + end + end + in go empty V. + +(** The tactic [(pick fresh Y for L)] takes a finite set of atoms [L] + and a fresh name [Y], and adds to the context an atom with name + [Y] and a proof that [(~ In Y L)], i.e., that [Y] is fresh for + [L]. The tactic will fail if [Y] is already declared in the + context. *) + +Tactic Notation "pick" "fresh" ident(Y) "for" constr(L) := + let Fr := fresh "Fr" in + let L := beautify_fset L in + (destruct (atom_fresh_for_set L) as [Y Fr]). + + +(* ********************************************************************** *) +(** ** Demonstration *) + +(** The [example_pick_fresh] tactic below illustrates the general + pattern for using the above three tactics to define a tactic which + picks a fresh atom. The pattern is as follows: + - Repeatedly invoke [gather_atoms_with], using functions with + different argument types each time. + - Union together the result of the calls, and invoke + [(pick fresh ... for ...)] with that union of sets. *) + +Ltac example_pick_fresh Y := + let A := gather_atoms_with (fun x : atoms => x) in + let B := gather_atoms_with (fun x : atom => singleton x) in + pick fresh Y for (union A B). + +Lemma example_pick_fresh_use : forall (x y z : atom) (L1 L2 L3: atoms), True. +(* begin show *) +Proof. + intros x y z L1 L2 L3. example_pick_fresh k. + + (** At this point in the proof, we have a new atom [k] and a + hypothesis [Fr : ~ In k (union L1 (union L2 (union L3 (union + (singleton x) (union (singleton y) (singleton z))))))]. *) + + trivial. +Qed. +(* end show *) diff --git a/coq-Fsub/Environment.v b/share/popl08-tutorial-Fsub/Environment.v similarity index 100% rename from coq-Fsub/Environment.v rename to share/popl08-tutorial-Fsub/Environment.v diff --git a/share/popl08-tutorial-Fsub/Environment.v.crashcoqide b/share/popl08-tutorial-Fsub/Environment.v.crashcoqide new file mode 100644 index 0000000..f2f03b9 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Environment.v.crashcoqide @@ -0,0 +1,697 @@ +(** Operations, lemmas, and tactics for working with environments, + association lists whose keys are atoms. Unless stated otherwise, + implicit arguments will not be declared by default. + + Authors: Brian Aydemir and Arthur Charguéraud, with help from + Aaron Bohannon, Benjamin Pierce, Jeffrey Vaughan, Dimitrios + Vytiniotis, Stephanie Weirich, and Steve Zdancewic. + + Table of contents: + - #Overview# + - #Functions on environments# + - #Relations on environments# + - #Properties of operations# + - #Automation and tactics (I)# + - #Properties of well-formedness and freshness# + - #Properties of binds# + - #Automation and tactics (II)# + - #Additional properties of binds# + - #Automation and tactics (III)# *) + +Require Export List. +Require Export ListFacts. +Require Import Atom. + +Require Import Coq.Lists.List. +Include ListNotations. + +Import AtomSet.F. + +Create HintDb EnvHints. +Local Hint Unfold E.eq : EnvHints. + + +(* ********************************************************************** *) +(** * ## Overview *) + +(** An environment is a list of pairs, where the first component of + each pair is an [atom]. We view the second component of each pair + as being bound to the first component. In a well-formed + environment, there is at most one binding for any given atom. + Bindings at the head of the list are "more recent" than bindings + toward the tail of the list, and we view an environment as growing + on the left, i.e., at its head. + + We normally work only with environments built up from the + following: the empty list, one element lists, and concatenations + of two lists. This seems to be more convenient in practice. For + example, we don't need to distinguish between consing on a binding + and concatenating a binding, a difference that Coq's tactics can + be sensitive to. + + However, basic definitions are by induction on the usual structure + of lists ([nil] and [cons]). + + To make it convenient to write one element lists, we define a + special notation. Note that this notation is local to this + particular library, to allow users to use alternate notations if + they desire. *) + +Local Notation "[ x ]" := (cons x nil). + +(** In the remainder of this library, we define a number of + operations, lemmas, and tactics that simplify working with + environments. *) + + +(* ********************************************************************** *) +(** * ## Functions on environments *) + +(** Implicit arguments will be declared by default for the definitions + in this section. *) + +Set Implicit Arguments. + +Section Definitions. + +Variables A B : Type. + +(** The domain of an environment is the set of atoms that it maps. *) + +Fixpoint dom (E : list (atom * A)) : atoms := + match E with + | nil => empty + | (x, _) :: E' => union (singleton x) (dom E') + end. + +(** [map] applies a function to all bindings in the environment. *) + +Fixpoint map (f : A -> B) (E : list (atom * A)) : list (atom * B) := + match E with + | nil => nil + | (x, V) :: E' => (x, f V) :: map f E' + end. + +(** [get] returns the value bound to the given atom in an environment + or [None] if the given atom is not bound. If the atom has + multiple bindings, the one nearest to the head of the environment + is returned. *) + +Fixpoint get (x : atom) (E : list (atom * A)) : option A := + match E with + | nil => None + | (y,a) :: E' => if eq_atom_dec x y then Some a else get x E' + end. + +End Definitions. + +Unset Implicit Arguments. + + +(* ********************************************************************** *) +(** * ## Relations on environments *) + +(** Implicit arguments will be declared by default for the definitions + in this section. *) + +Set Implicit Arguments. + +Section Relations. + +Variable A : Type. + +(** An environment is well-formed if and only if each atom is bound at + most once. *) + +Inductive ok : list (atom * A) -> Prop := + | ok_nil : + ok nil + | ok_cons : forall (E : list (atom * A)) (x : atom) (a : A), + ok E -> ~ In x (dom E) -> ok ((x, a) :: E). + +(** ## An environment [E] contains a binding + from [x] to [b], denoted [(binds x b E)], if and only if the most + recent binding for [x] is mapped to [b]. *) + +Definition binds x b (E : list (atom * A)) := + get x E = Some b. + +End Relations. + +Unset Implicit Arguments. + + +(* ********************************************************************** *) +(** * ## Properties of operations *) + +Section OpProperties. +Variable A B : Type. +Implicit Types E F : list (atom * A). +Implicit Types a b : A. + +(** ** Facts about concatenation *) + +Lemma concat_nil : forall E, + (E ++ nil) = E. +Proof. + auto using List.app_nil_r. +Qed. + +Lemma nil_concat : forall E, + nil ++ E = E. +Proof. + reflexivity. +Qed. + +Lemma concat_assoc : forall E F G, + (G ++ F) ++ E = G ++ (F ++ E). +Proof. + auto using List.app_assoc. +Qed. + +(** ** [map] commutes with environment-building operations *) + +Lemma map_nil : forall (f : A -> B), + map f nil = nil. +Proof. + reflexivity. +Qed. + +Lemma map_single : forall (f : A -> B) y b, + map f [(y,b)] = [(y, f b)]. +Proof. + reflexivity. +Qed. + +Lemma map_push : forall (f : A -> B) y b E, + map f ([(y,b)] ++ E) = [(y, f b)] ++ map f E. +Proof. + reflexivity. +Qed. + +Lemma map_concat : forall (f : A -> B) E F, + map f (F ++ E) = (map f F) ++ (map f E). +Proof. + induction F as [|(x,a)]; simpl; congruence. +Qed. + +(** ** Facts about the domain of an environment *) + +Lemma dom_nil : + @dom A nil = empty. +Proof. + reflexivity. +Qed. + +Lemma dom_single : forall x a, + dom [(x,a)] = singleton x. +Proof. + simpl. intros. + Admitted. +(* fsetdec. +Qed. +*) + +Lemma dom_push : forall x a E, + dom ([(x,a)] ++ E) = union (singleton x) (dom E). +Proof. + simpl. intros. reflexivity. +Qed. + +Lemma dom_concat : forall E F, + dom (F ++ E) = union (dom F) (dom E). +Proof. + induction F as [|(x,a) F IH]; simpl. + Admitted. + (* + fsetdec. + rewrite IH. + fsetdec. +Qed.*) + +Lemma dom_map : forall (f : A -> B) E, + dom (map f E) = dom E. +Proof. + induction E as [|(x,a)]; simpl; congruence. +Qed. + +(** ** Other trivial rewrites *) + +Lemma cons_concat_assoc : forall x a E F, + ((x, a) :: E) ++ F = (x, a) :: (E ++ F). +Proof. + reflexivity. +Qed. + +End OpProperties. + + +(* ********************************************************************** *) +(** * ## Automation and tactics (I) *) + +(** ** [simpl_env] *) + +(** The [simpl_env] tactic can be used to put environments in the + standardized form described above, with the additional properties + that concatenation is associated to the right and empty + environments are removed. Similar to the [simpl] tactic, we + define "[in *]" and "[in H]" variants of [simpl_env]. *) + +Definition singleton_list (A : Type) (x : atom * A) := x :: nil. + +Arguments singleton_list [A]. + +Lemma cons_concat : forall (A : Type) (E : list (atom * A)) x a, + (x, a) :: E = singleton_list (x, a) ++ E. +Proof. + reflexivity. +Qed. + +Lemma map_singleton_list : forall (A B : Type) (f : A -> B) y b, + map f (singleton_list (y,b)) = [(y, f b)]. +Proof. + reflexivity. +Qed. + +Lemma dom_singleton_list : forall (A : Type) (x : atom) (a : A), + dom (singleton_list (x,a)) = singleton x. +Proof. + simpl. intros. +Admitted. + (* fsetdec. +Qed. +*) + +Hint Rewrite + cons_concat map_singleton_list dom_singleton_list + concat_nil nil_concat concat_assoc + map_nil map_single map_push map_concat + dom_nil dom_single dom_push dom_concat dom_map : rew_env. + +Ltac simpl_env_change_aux := + match goal with + | H : context[?x :: nil] |- _ => + progress (change (x :: nil) with (singleton_list x) in H); + simpl_env_change_aux + | |- context[?x :: nil] => + progress (change (x :: nil) with (singleton_list x)); + simpl_env_change_aux + | _ => + idtac + end. + +Ltac simpl_env := + simpl_env_change_aux; + autorewrite with rew_env; + unfold singleton_list in *. + +Tactic Notation "simpl_env" "in" hyp(H) := + simpl_env_change_aux; + autorewrite with rew_env in H; + unfold singleton_list in *. + +Tactic Notation "simpl_env" "in" "*" := + simpl_env_change_aux; + autorewrite with rew_env in *; + unfold singleton_list in *. + +(** ** [rewrite_env] *) + +(** The tactic [(rewrite_env E)] replaces an environment in the + conclusion of the goal with [E]. Suitability for replacement is + determined by whether [simpl_env] can put [E] and the chosen + environment in the same normal form, up to convertability in Coq. + We also define a "[in H]" variant that performs the replacement in + a hypothesis [H]. *) + +Tactic Notation "rewrite_env" constr(E) := + match goal with + | |- context[?x] => + change x with E + | |- context[?x] => + replace x with E; [ | try reflexivity; simpl_env; reflexivity ] + end. + +Tactic Notation "rewrite_env" constr(E) "in" hyp(H) := + match type of H with + | context[?x] => + change x with E in H + | context[?x] => + replace x with E in H; [ | try reflexivity; simpl_env; reflexivity ] + end. + +(** ** Hints *) + +Hint Constructors ok :EnvHints. + +Local Hint Extern 1 (~ In _ _) => simpl_env in * : fsetdec. + + +(* ********************************************************************** *) +(** * ## Properties of well-formedness and freshness *) + +Section OkProperties. +Variable A B : Type. +Implicit Types E F : list (atom * A). +Implicit Types a b : A. + +(** Facts about when an environment is well-formed. *) + +Lemma ok_push : forall (E : list (atom * A)) (x : atom) (a : A), + ok E -> ~ In x (dom E) -> ok ([(x, a)] ++ E). +Proof. + exact (@ok_cons A). +Qed. + +Lemma ok_singleton : forall x a, + ok [(x,a)]. +Proof. + auto. + Admitted. +(* +Qed. +*) +Lemma ok_remove_mid : forall F E G, + ok (G ++ F ++ E) -> ok (G ++ E). +Proof with auto. + induction G as [|(y,a)]; intros Ok. + induction F as [|(y,a)]; simpl... inversion Ok... + inversion Ok. simpl... +Admitted. + +Lemma ok_remove_mid_cons : forall x a E G, + ok (G ++ (x, a) :: E) -> + ok (G ++ E). +Proof. + intros. simpl_env in *. eauto using ok_remove_mid. +Qed. + +Lemma ok_map : forall E (f : A -> B), + ok E -> ok (map f E). +Proof with auto. + intros. + induction E as [ | (y,b) E ] ; simpl... + inversion H... +Admitted. + +Lemma ok_map_app_l : forall E F (f : A -> A), + ok (F ++ E) -> ok (map f F ++ E). +Proof with auto. + intros. induction F as [|(y,a)]; simpl... + inversion H... +Admitted. + +(** A binding in the middle of an environment has an atom fresh from + all bindings before and after it. *) + +Lemma fresh_mid_tail : forall E F x a, + ok (F ++ [(x,a)] ++ E) -> ~ In x (dom E). +Proof with auto. + induction F as [|(y,b)]; intros x c Ok; simpl_env in *. + inversion Ok... + inversion Ok; subst. simpl_env in *. apply (IHF _ _ H1). + assumption. + assumption. +Qed. + +Lemma fresh_mid_head : forall E F x a, + ok (F ++ [(x,a)] ++ E) -> ~ In x (dom F). +Proof with auto. + induction F as [|(y,b)]; intros x c Ok; simpl_env in *. + inversion Ok... + inversion Ok; subst. simpl_env in *. +Admitted. + (* pose proof (IHF _ _ H1)... +Qed. +*) +End OkProperties. + + +(* ********************************************************************** *) +(** * ## Properties of [binds] *) + +Section BindsProperties. +Variable A B : Type. +Implicit Types E F : list (atom * A). +Implicit Types a b : A. + +(** ** Introduction forms for [binds] *) + +(** The following properties allow one to view [binds] as an + inductively defined predicate. This is the preferred way of + working with the relation. *) + +Lemma binds_singleton : forall x a, + binds x a [(x,a)]. +Proof. + intros x a. unfold binds. simpl. destruct (eq_atom_dec x x); intuition. +Qed. + +Lemma binds_tail : forall x a E F, + binds x a E -> ~ In x (dom F) -> binds x a (F ++ E). +Proof with auto. + unfold binds. induction F as [|(y,b)]; simpl... + destruct (eq_atom_dec x y)... intros _ J. destruct J. +Admitted. + (* fsetdec. + +Qed. +*) + +Lemma binds_head : forall x a E F, + binds x a F -> binds x a (F ++ E). +Proof. + unfold binds. induction F as [|(y,b)]; simpl; intros H. + discriminate. + destruct (eq_atom_dec x y); intuition. +Qed. + +(** ** Case analysis on [binds] *) + +Lemma binds_concat_inv : forall x a E F, + binds x a (F ++ E) -> (~ In x (dom F) /\ binds x a E) \/ (binds x a F). +Proof with auto. + unfold binds. induction F as [|(y,b)]; simpl; intros H... +Admitted. + (* + destruct (eq_atom_dec x y). + right... + destruct (IHF H) as [[? ?] | ?]. left... right... +Qed. +*) + +Lemma binds_singleton_inv : forall x y a b, + binds x a [(y,b)] -> x = y /\ a = b. +Proof. + unfold binds. simpl. intros. destruct (eq_atom_dec x y). + split; congruence. + discriminate. +Qed. + +(** ** Retrieving bindings from an environment *) + +Lemma binds_mid : forall x a E F, + ok (F ++ [(x,a)] ++ E) -> binds x a (F ++ [(x,a)] ++ E). +Proof with auto. + unfold binds. induction F as [|(z,b)]; simpl; intros Ok. + destruct (eq_atom_dec x x); intuition. + inversion Ok; subst. destruct (eq_atom_dec x z)... + destruct H3. simpl_env. +Admitted. + (* fsetdec. +Qed. +*) + +Lemma binds_mid_eq : forall z a b E F, + binds z a (F ++ [(z,b)] ++ E) -> ok (F ++ [(z,b)] ++ E) -> a = b. +Proof with auto. + unfold binds. induction F as [|(x,c)]; simpl; intros H Ok. + destruct (eq_atom_dec z z). congruence. intuition. + inversion Ok; subst. destruct (eq_atom_dec z x)... + destruct H4. simpl_env. +Admitted. + (* fsetdec. +Qed. +*) + +Lemma binds_mid_eq_cons : forall x a b E F, + binds x a (F ++ (x,b) :: E) -> + ok (F ++ (x,b) :: E) -> + a = b. +Proof. + intros. simpl_env in *. eauto using binds_mid_eq. +Qed. + +End BindsProperties. + + +(* ********************************************************************** *) +(** * ## Automation and tactics (II) *) + +(** ** Hints *) + +Hint Immediate ok_remove_mid ok_remove_mid_cons :EnvHints. + +Hint Resolve + ok_push ok_singleton ok_map ok_map_app_l + binds_singleton binds_head binds_tail :EnvHints. + +(** ** [binds_get] *) + +(** The tactic [(binds_get H)] takes a hypothesis [H] of the form + [(binds x a (F ++ [(x,b)] ++ E))] and introduces the equality + [a=b] into the context. Then, the tactic checks if the equality + is discriminable and otherwise tries substituting [b] for [a]. + The [auto] tactic is used to show that [(ok (F ++ [(x,b)] ++ E))], + which is needed to prove the equality [a=b] from [H]. *) + +Ltac binds_get H := + match type of H with + | binds ?z ?a (?F ++ [(?z,?b)] ++ ?E) => + let K := fresh in + assert (K : ok (F ++ [(z,b)] ++ E)); + [ auto + | let J := fresh in + assert (J := @binds_mid_eq _ _ _ _ _ _ H K); + clear K; + try discriminate; + try match type of J with + | ?a = ?b => subst a + end + ] + end. + +(** ** [binds_cases] *) + +(** The tactic [(binds_case H)] performs a case analysis on an + hypothesis [H] of the form [(binds x a E)]. There will be one + subgoal for each component of [E] that [x] could be bound in, and + each subgoal will have appropriate freshness conditions on [x]. + Some attempts are made to automatically discharge contradictory + cases. *) + +Ltac binds_cases H := + let Fr := fresh "Fr" in + let J1 := fresh in + let J2 := fresh in + match type of H with + | binds _ _ nil => + inversion H + | binds ?x ?a [(?y,?b)] => + destruct (@binds_singleton_inv _ _ _ _ _ H); + clear H; + try discriminate; + try subst y; + try match goal with + | _ : ?z <> ?z |- _ => intuition + end + | binds ?x ?a (?F ++ ?E) => + destruct (@binds_concat_inv _ _ _ _ _ H) as [[Fr J1] | J2]; + clear H; + [ binds_cases J1 | binds_cases J2 ] + | _ => idtac + end. + + +(* *********************************************************************** *) +(** * ## Additional properties of [binds] *) + +(** The following lemmas are proven in manner that should be + independent of the concrete definition of [binds]. *) + +Section AdditionalBindsProperties. +Variable A B : Type. +Implicit Types E F : list (atom * A). +Implicit Types a b : A. + +(** Lemmas about the relationship between [binds] and the domain of an + environment. *) + +Lemma binds_In : forall a x E, + binds x a E -> In x (dom E). +Proof. +Admitted. +(* + induction E as [|(y,b)]; simpl_env; intros H. + binds_cases H. + binds_cases H; subst. auto using union_3. fsetdec. +Qed. +*) + +Lemma binds_fresh : forall x a E, + ~ In x (dom E) -> ~ binds x a E. +Proof. +Admitted. +(* + induction E as [|(y,b)]; simpl_env; intros Fresh H. + binds_cases H. + binds_cases H. intuition. fsetdec. +Qed. +*) + +(** Additional lemmas for showing that a binding is in an + environment. *) + +Lemma binds_map : forall x a (f : A -> B) E, + binds x a E -> binds x (f a) (map f E). +Proof. + induction E as [|(y,b)]; simpl_env; intros H. + binds_cases H. + binds_cases H; auto. subst; auto. +Admitted. + +Lemma binds_concat_ok : forall x a E F, + binds x a E -> ok (F ++ E) -> binds x a (F ++ E). +Proof. + induction F as [|(y,b)]; simpl_env; intros H Ok. + auto. + inversion Ok; subst. destruct (eq_atom_dec x y); subst; auto. + assert (In y (dom (F ++ E))) by eauto using binds_In. + intuition. +Admitted. + +Lemma binds_weaken : forall x a E F G, + binds x a (G ++ E) -> + ok (G ++ F ++ E) -> + binds x a (G ++ F ++ E). +Proof. + induction G as [|(y,b)]; simpl_env; intros H Ok. + auto using binds_concat_ok. + inversion Ok; subst. binds_cases H; subst; auto. +Admitted. + +Lemma binds_weaken_at_head : forall x a F G, + binds x a G -> + ok (F ++ G) -> + binds x a (F ++ G). +Proof. + intros x a F G H J. + rewrite_env (nil ++ F ++ G). + apply binds_weaken; simpl_env; trivial. +Qed. + +Lemma binds_remove_mid : forall x y a b F G, + binds x a (F ++ [(y,b)] ++ G) -> + x <> y -> + binds x a (F ++ G). +Proof. + intros x y a b F G H J. + binds_cases H; auto. +Admitted. + +Lemma binds_remove_mid_cons : forall x y a b E G, + binds x a (G ++ (y, b) :: E) -> + x <> y -> + binds x a (G ++ E). +Proof. + intros. simpl_env in *. eauto using binds_remove_mid. +Qed. + +End AdditionalBindsProperties. + + +(* *********************************************************************** *) +(** * ## Automation and tactics (III) *) + +Hint Resolve binds_map binds_concat_ok binds_weaken binds_weaken_at_head :EnvHints. +Hint Immediate binds_remove_mid binds_remove_mid_cons :EnvHints. diff --git a/coq-Fsub/FSetDecide.v b/share/popl08-tutorial-Fsub/FSetDecide.v similarity index 100% rename from coq-Fsub/FSetDecide.v rename to share/popl08-tutorial-Fsub/FSetDecide.v diff --git a/share/popl08-tutorial-Fsub/FSetDecide.v.crashcoqide b/share/popl08-tutorial-Fsub/FSetDecide.v.crashcoqide new file mode 100644 index 0000000..c27cae8 --- /dev/null +++ b/share/popl08-tutorial-Fsub/FSetDecide.v.crashcoqide @@ -0,0 +1,1057 @@ +(**************************************************************) +(* FSetDecide.v *) +(* *) +(* Author: Aaron Bohannon *) +(**************************************************************) + +(** This file implements a decision procedure for a certain + class of propositions involving finite sets. *) + +Require Import FSets. + +Module Decide (Import M : S). + + +Create HintDb set_simpl. + +(** * Overview + This functor defines the tactic [fsetdec], which will + solve any valid goal of the form +<< + forall s1 ... sn, + forall x1 ... xm, + P1 -> ... -> Pk -> P +>> + where [P]'s are defined by the grammar: +<< + +P ::= +| Q +| Empty F +| Subset F F' +| Equal F F' + +Q ::= +| E.eq X X' +| In X F +| Q /\ Q' +| Q \/ Q' +| Q -> Q' +| Q <-> Q' +| ~ Q +| True +| False + +F ::= +| S +| empty +| singleton X +| add X F +| remove X F +| union F F' +| inter F F' +| diff F F' + +X ::= x1 | ... | xm +S ::= s1 | ... | sn + +>> + +The tactic will also work on some goals that vary slightly from +the above form: +- The variables and hypotheses may be mixed in any order and may + have already been introduced into the context. Moreover, + there may be additional, unrelated hypotheses mixed in (these + will be ignored). +- A conjunction of hypotheses will be handled as easily as + separate hypotheses, i.e., [P1 /\ P2 -> P] can be solved iff + [P1 -> P2 -> P] can be solved. +- [fsetdec] should solve any goal if the FSet-related hypotheses + are contradictory. +- [fsetdec] will first perform any necessary zeta and beta + reductions and will invoke [subst] to eliminate any Coq + equalities between finite sets or their elements. +- If [E.eq] is convertible with Coq's equality, it will not + matter which one is used in the hypotheses or conclusion. +- The tactic can solve goals where the finite sets or set + elements are expressed by Coq terms that are more complicated + than variables. However, non-local definitions are not + expanded, and Coq equalities between non-variable terms are + not used. For example, this goal will be solved: +<< + forall (f : t -> t), + forall (g : elt -> elt), + forall (s1 s2 : t), + forall (x1 x2 : elt), + Equal s1 (f s2) -> + E.eq x1 (g (g x2)) -> + In x1 s1 -> + In (g (g x2)) (f s2) +>> + This one will not be solved: +<< + forall (f : t -> t), + forall (g : elt -> elt), + forall (s1 s2 : t), + forall (x1 x2 : elt), + Equal s1 (f s2) -> + E.eq x1 (g x2) -> + In x1 s1 -> + g x2 = g (g x2) -> + In (g (g x2)) (f s2) +>> +*) + + (** * Facts and Tactics for Propositional Logic + These lemmas and tactics are in a module so that they do + not affect the namespace if you import the enclosing + module [Decide]. *) + Module FSetLogicalFacts. + Export Decidable. + Export Setoid. + + (** ** Lemmas and Tactics About Decidable Propositions + XXX: The lemma [dec_iff] should have been included in + [Decidable.v]. Some form of the [solve_decidable] + tactics below would also make sense in [Decidable.v]. + *) + + Lemma dec_iff : forall P Q : Prop, + decidable P -> + decidable Q -> + decidable (P <-> Q). + Proof. + unfold decidable in *. tauto. + Qed. + + (** With this hint database, we can leverage [auto] to check + decidability of propositions. *) + Hint Resolve + dec_True dec_False dec_or dec_and dec_imp dec_not dec_iff + : decidable_prop. + + (** [solve_decidable using lib] will solve goals about the + decidability of a proposition, assisted by an auxiliary + database of lemmas. The database is intended to contain + lemmas stating the decidability of base propositions, + (e.g., the decidability of equality on a particular + inductive type). *) + Tactic Notation "solve_decidable" "using" ident(db) := + match goal with + | |- decidable ?P => + solve [ auto 100 with decidable_prop db ] + end. + + Tactic Notation "solve_decidable" := + solve_decidable using core. + + (** ** Propositional Equivalences Involving Negation + These are all written with the unfolded form of + negation, since I am not sure if setoid rewriting will + always perform conversion. *) + + (** *** Eliminating Negations + We begin with lemmas that, when read from left to right, + can be understood as ways to eliminate uses of [not]. *) + + Lemma not_true_iff : + (True -> False) <-> False. + Proof. + tauto. + Qed. + + Lemma not_false_iff : + (False -> False) <-> True. + Proof. + tauto. + Qed. + + Lemma not_not_iff : forall P : Prop, + decidable P -> + (((P -> False) -> False) <-> P). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma contrapositive : forall P Q : Prop, + decidable P -> + (((P -> False) -> (Q -> False)) <-> (Q -> P)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma or_not_l_iff_1 : forall P Q : Prop, + decidable P -> + ((P -> False) \/ Q <-> (P -> Q)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma or_not_l_iff_2 : forall P Q : Prop, + decidable Q -> + ((P -> False) \/ Q <-> (P -> Q)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma or_not_r_iff_1 : forall P Q : Prop, + decidable P -> + (P \/ (Q -> False) <-> (Q -> P)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma or_not_r_iff_2 : forall P Q : Prop, + decidable Q -> + (P \/ (Q -> False) <-> (Q -> P)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma imp_not_l : forall P Q : Prop, + decidable P -> + (((P -> False) -> Q) <-> (P \/ Q)). + Proof. + unfold decidable in *. tauto. + Qed. + + (** *** Moving Negations Around + We have four lemmas that, when read from left to right, + describe how to push negations toward the leaves of a + proposition and, when read from right to left, describe + how to pull negations toward the top of a proposition. *) + + Lemma not_or_iff : forall P Q : Prop, + (P \/ Q -> False) <-> (P -> False) /\ (Q -> False). + Proof. + tauto. + Qed. + + Lemma not_and_iff : forall P Q : Prop, + (P /\ Q -> False) <-> (P -> Q -> False). + Proof. + tauto. + Qed. + + Lemma not_imp_iff : forall P Q : Prop, + decidable P -> + (((P -> Q) -> False) <-> P /\ (Q -> False)). + Proof. + unfold decidable in *. tauto. + Qed. + + Lemma not_imp_rev_iff : forall P Q : Prop, + decidable P -> + (((P -> Q) -> False) <-> (Q -> False) /\ P). + Proof. + unfold decidable in *. tauto. + Qed. + + (** ** Tactics for Negations *) + + Tactic Notation "fold" "any" "not" := + repeat ( + match goal with + | H: context [?P -> False] |- _ => + fold (~ P) in H + | |- context [?P -> False] => + fold (~ P) + end). + + (** [push not using db] will pushes all negations to the + leaves of propositions in the goal, using the lemmas in + [db] to assist in checking the decidability of the + propositions involved. If [using db] is omitted, then + [core] will be used. Additional versions are provided + to manipulate the hypotheses or the hypotheses and goal + together. + + XXX: This tactic and the similar subsequent ones should + have been defined using [autorewrite]. However, there + is a bug in the order that Coq generates subgoals when + rewriting using a setoid. In order to work around this + bug, these tactics had to be written out in an explicit + way. When the bug is fixed these tactics will break!! + *) + + Tactic Notation "push" "not" "using" ident(db) := + unfold not, iff; + repeat ( + match goal with + (** simplification by not_true_iff *) + | |- context [True -> False] => + rewrite not_true_iff + (** simplification by not_false_iff *) + | |- context [False -> False] => + rewrite not_false_iff + (** simplification by not_not_iff *) + | |- context [(?P -> False) -> False] => + rewrite (not_not_iff P); + [ solve_decidable using db | ] + (** simplification by contrapositive *) + | |- context [(?P -> False) -> (?Q -> False)] => + rewrite (contrapositive P Q); + [ solve_decidable using db | ] + (** simplification by or_not_l_iff_1/_2 *) + | |- context [(?P -> False) \/ ?Q] => + (rewrite (or_not_l_iff_1 P Q); + [ solve_decidable using db | ]) || + (rewrite (or_not_l_iff_2 P Q); + [ solve_decidable using db | ]) + (** simplification by or_not_r_iff_1/_2 *) + | |- context [?P \/ (?Q -> False)] => + (rewrite (or_not_r_iff_1 P Q); + [ solve_decidable using db | ]) || + (rewrite (or_not_r_iff_2 P Q); + [ solve_decidable using db | ]) + (** simplification by imp_not_l *) + | |- context [(?P -> False) -> ?Q] => + rewrite (imp_not_l P Q); + [ solve_decidable using db | ] + (** rewriting by not_or_iff *) + | |- context [?P \/ ?Q -> False] => + rewrite (not_or_iff P Q) + (** rewriting by not_and_iff *) + | |- context [?P /\ ?Q -> False] => + rewrite (not_and_iff P Q) + (** rewriting by not_imp_iff *) + | |- context [(?P -> ?Q) -> False] => + rewrite (not_imp_iff P Q); + [ solve_decidable using db | ] + end); + fold any not. + + Tactic Notation "push" "not" := + push not using core. + + Tactic Notation + "push" "not" "in" "*" "|-" "using" ident(db) := + unfold not, iff in * |-; + repeat ( + match goal with + (** simplification by not_true_iff *) + | H: context [True -> False] |- _ => + rewrite not_true_iff in H + (** simplification by not_false_iff *) + | H: context [False -> False] |- _ => + rewrite not_false_iff in H + (** simplification by not_not_iff *) + | H: context [(?P -> False) -> False] |- _ => + rewrite (not_not_iff P) in H; + [ | solve_decidable using db ] + (** simplification by contrapositive *) + | H: context [(?P -> False) -> (?Q -> False)] |- _ => + rewrite (contrapositive P Q) in H; + [ | solve_decidable using db ] + (** simplification by or_not_l_iff_1/_2 *) + | H: context [(?P -> False) \/ ?Q] |- _ => + (rewrite (or_not_l_iff_1 P Q) in H; + [ | solve_decidable using db ]) || + (rewrite (or_not_l_iff_2 P Q) in H; + [ | solve_decidable using db ]) + (** simplification by or_not_r_iff_1/_2 *) + | H: context [?P \/ (?Q -> False)] |- _ => + (rewrite (or_not_r_iff_1 P Q) in H; + [ | solve_decidable using db ]) || + (rewrite (or_not_r_iff_2 P Q) in H; + [ | solve_decidable using db ]) + (** simplification by imp_not_l *) + | H: context [(?P -> False) -> ?Q] |- _ => + rewrite (imp_not_l P Q) in H; + [ | solve_decidable using db ] + (** rewriting by not_or_iff *) + | H: context [?P \/ ?Q -> False] |- _ => + rewrite (not_or_iff P Q) in H + (** rewriting by not_and_iff *) + | H: context [?P /\ ?Q -> False] |- _ => + rewrite (not_and_iff P Q) in H + (** rewriting by not_imp_iff *) + | H: context [(?P -> ?Q) -> False] |- _ => + rewrite (not_imp_iff P Q) in H; + [ | solve_decidable using db ] + end); + fold any not. + + Tactic Notation "push" "not" "in" "*" "|-" := + push not in * |- using core. + + Tactic Notation "push" "not" "in" "*" "using" ident(db) := + push not using db; push not in * |- using db. + Tactic Notation "push" "not" "in" "*" := + push not in * using core. + + (** A simple test case to see how this works. *) + Lemma test_push : forall P Q R : Prop, + decidable P -> + decidable Q -> + (~ True) -> + (~ False) -> + (~ ~ P) -> + (~ (P /\ Q) -> ~ R) -> + ((P /\ Q) \/ ~ R) -> + (~ (P /\ Q) \/ R) -> + (R \/ ~ (P /\ Q)) -> + (~ R \/ (P /\ Q)) -> + (~ P -> R) -> + (~ ((R -> P) \/ (R -> Q))) -> + (~ (P /\ R)) -> + (~ (P -> R)) -> + True. + Proof. + intros. push not in *. tauto. + Qed. + + (** [pull not using db] will pull as many negations as + possible toward the top of the propositions in the goal, + using the lemmas in [db] to assist in checking the + decidability of the propositions involved. If [using + db] is omitted, then [core] will be used. Additional + versions are provided to manipulate the hypotheses or + the hypotheses and goal together. *) + + Tactic Notation "pull" "not" "using" ident(db) := + unfold not, iff; + repeat ( + match goal with + (** simplification by not_true_iff *) + | |- context [True -> False] => + rewrite not_true_iff + (** simplification by not_false_iff *) + | |- context [False -> False] => + rewrite not_false_iff + (** simplification by not_not_iff *) + | |- context [(?P -> False) -> False] => + rewrite (not_not_iff P); + [ solve_decidable using db | ] + (** simplification by contrapositive *) + | |- context [(?P -> False) -> (?Q -> False)] => + rewrite (contrapositive P Q); + [ solve_decidable using db | ] + (** simplification by or_not_l_iff_1/_2 *) + | |- context [(?P -> False) \/ ?Q] => + (rewrite (or_not_l_iff_1 P Q); + [ solve_decidable using db | ]) || + (rewrite (or_not_l_iff_2 P Q); + [ solve_decidable using db | ]) + (** simplification by or_not_r_iff_1/_2 *) + | |- context [?P \/ (?Q -> False)] => + (rewrite (or_not_r_iff_1 P Q); + [ solve_decidable using db | ]) || + (rewrite (or_not_r_iff_2 P Q); + [ solve_decidable using db | ]) + (** simplification by imp_not_l *) + | |- context [(?P -> False) -> ?Q] => + rewrite (imp_not_l P Q); + [ solve_decidable using db | ] + (** rewriting by not_or_iff *) + | |- context [(?P -> False) /\ (?Q -> False)] => + rewrite <- (not_or_iff P Q) + (** rewriting by not_and_iff *) + | |- context [?P -> ?Q -> False] => + rewrite <- (not_and_iff P Q) + (** rewriting by not_imp_iff *) + | |- context [?P /\ (?Q -> False)] => + rewrite <- (not_imp_iff P Q); + [ solve_decidable using db | ] + (** rewriting by not_imp_rev_iff *) + | |- context [(?Q -> False) /\ ?P] => + rewrite <- (not_imp_rev_iff P Q); + [ solve_decidable using db | ] + end); + fold any not. + + Tactic Notation "pull" "not" := + pull not using core. + + Tactic Notation + "pull" "not" "in" "*" "|-" "using" ident(db) := + unfold not, iff in * |-; + repeat ( + match goal with + (** simplification by not_true_iff *) + | H: context [True -> False] |- _ => + rewrite not_true_iff in H + (** simplification by not_false_iff *) + | H: context [False -> False] |- _ => + rewrite not_false_iff in H + (** simplification by not_not_iff *) + | H: context [(?P -> False) -> False] |- _ => + rewrite (not_not_iff P) in H; + [ | solve_decidable using db ] + (** simplification by contrapositive *) + | H: context [(?P -> False) -> (?Q -> False)] |- _ => + rewrite (contrapositive P Q) in H; + [ | solve_decidable using db ] + (** simplification by or_not_l_iff_1/_2 *) + | H: context [(?P -> False) \/ ?Q] |- _ => + (rewrite (or_not_l_iff_1 P Q) in H; + [ | solve_decidable using db ]) || + (rewrite (or_not_l_iff_2 P Q) in H; + [ | solve_decidable using db ]) + (** simplification by or_not_r_iff_1/_2 *) + | H: context [?P \/ (?Q -> False)] |- _ => + (rewrite (or_not_r_iff_1 P Q) in H; + [ | solve_decidable using db ]) || + (rewrite (or_not_r_iff_2 P Q) in H; + [ | solve_decidable using db ]) + (** simplification by imp_not_l *) + | H: context [(?P -> False) -> ?Q] |- _ => + rewrite (imp_not_l P Q) in H; + [ | solve_decidable using db ] + (** rewriting by not_or_iff *) + | H: context [(?P -> False) /\ (?Q -> False)] |- _ => + rewrite <- (not_or_iff P Q) in H + (** rewriting by not_and_iff *) + | H: context [?P -> ?Q -> False] |- _ => + rewrite <- (not_and_iff P Q) in H + (** rewriting by not_imp_iff *) + | H: context [?P /\ (?Q -> False)] |- _ => + rewrite <- (not_imp_iff P Q) in H; + [ | solve_decidable using db ] + (** rewriting by not_imp_rev_iff *) + | H: context [(?Q -> False) /\ ?P] |- _ => + rewrite <- (not_imp_rev_iff P Q) in H; + [ | solve_decidable using db ] + end); + fold any not. + + Tactic Notation "pull" "not" "in" "*" "|-" := + pull not in * |- using core. + + Tactic Notation "pull" "not" "in" "*" "using" ident(db) := + pull not using db; pull not in * |- using db. + Tactic Notation "pull" "not" "in" "*" := + pull not in * using core. + + (** A simple test case to see how this works. *) + Lemma test_pull : forall P Q R : Prop, + decidable P -> + decidable Q -> + (~ True) -> + (~ False) -> + (~ ~ P) -> + (~ (P /\ Q) -> ~ R) -> + ((P /\ Q) \/ ~ R) -> + (~ (P /\ Q) \/ R) -> + (R \/ ~ (P /\ Q)) -> + (~ R \/ (P /\ Q)) -> + (~ P -> R) -> + (~ (R -> P) /\ ~ (R -> Q)) -> + (~ P \/ ~ R) -> + (P /\ ~ R) -> + (~ R /\ P) -> + True. + Proof. + intros. pull not in *. tauto. + Qed. + + End FSetLogicalFacts. + Import FSetLogicalFacts. + + (** * Auxiliary Tactics + Again, these lemmas and tactics are in a module so that + they do not affect the namespace if you import the + enclosing module [Decide]. *) + Module FSetDecideAuxiliary. + + (** ** Generic Tactics + We begin by defining a few generic, useful tactics. *) + + (** [if t then t1 else t2] executes [t] and, if it does not + fail, then [t1] will be applied to all subgoals + produced. If [t] fails, then [t2] is executed. *) + Tactic Notation + "if" tactic(t) + "then" tactic(t1) + "else" tactic(t2) := + first [ t; first [ t1 | fail 2 ] | t2 ]. + + (** [prop P holds by t] succeeds (but does not modify the + goal or context) if the proposition [P] can be proved by + [t] in the current context. Otherwise, the tactic + fails. *) + Tactic Notation "prop" constr(P) "holds" "by" tactic(t) := + let H := fresh in + assert P as H by t; + clear H. + + (** This tactic acts just like [assert ... by ...] but will + fail if the context already contains the proposition. *) + Tactic Notation "assert" "new" constr(e) "by" tactic(t) := + match goal with + | H: e |- _ => fail 1 + | _ => assert e by t + end. + + (** [subst++] is similar to [subst] except that + - it never fails (as [subst] does on recursive + equations), + - it substitutes locally defined variable for their + definitions, + - it performs beta reductions everywhere, which may + arise after substituting a locally defined function + for its definition. + *) + Tactic Notation "subst" "++" := + repeat ( + match goal with + | x : _ |- _ => subst x + end); + cbv zeta beta in *. + + (** If you have a negated goal and [H] is a negated + hypothesis, then [contra H] exchanges your goal and [H], + removing the negations. (Just like [swap] but reuses + the same name. *) + Ltac contra H := + let J := fresh in + unfold not; + unfold not in H; + intros J; + apply H; + clear H; + rename J into H. + + (** [decompose records] calls [decompose record H] on every + relevant hypothesis [H]. *) + Tactic Notation "decompose" "records" := + repeat ( + match goal with + | H: _ |- _ => progress (decompose record H); clear H + end). + + (** ** Discarding Irrelevant Hypotheses + We will want to clear the context of any + non-FSet-related hypotheses in order to increase the + speed of the tactic. To do this, we will need to be + able to decide which are relevant. We do this by making + a simple inductive definition classifying the + propositions of interest. *) + + Inductive FSet_elt_Prop : Prop -> Prop := + | eq_Prop : forall (S : Set) (x y : S), + FSet_elt_Prop (x = y) + | eq_elt_prop : forall x y, + FSet_elt_Prop (E.eq x y) + | In_elt_prop : forall x s, + FSet_elt_Prop (In x s) + | True_elt_prop : + FSet_elt_Prop True + | False_elt_prop : + FSet_elt_Prop False + | conj_elt_prop : forall P Q, + FSet_elt_Prop P -> + FSet_elt_Prop Q -> + FSet_elt_Prop (P /\ Q) + | disj_elt_prop : forall P Q, + FSet_elt_Prop P -> + FSet_elt_Prop Q -> + FSet_elt_Prop (P \/ Q) + | impl_elt_prop : forall P Q, + FSet_elt_Prop P -> + FSet_elt_Prop Q -> + FSet_elt_Prop (P -> Q) + | not_elt_prop : forall P, + FSet_elt_Prop P -> + FSet_elt_Prop (~ P). + + Inductive FSet_Prop : Prop -> Prop := + | elt_FSet_Prop : forall P, + FSet_elt_Prop P -> + FSet_Prop P + | Empty_FSet_Prop : forall s, + FSet_Prop (Empty s) + | Subset_FSet_Prop : forall s1 s2, + FSet_Prop (Subset s1 s2) + | Equal_FSet_Prop : forall s1 s2, + FSet_Prop (Equal s1 s2). + + (** Here is the tactic that will throw away hypotheses that + are not useful (for the intended scope of the [fsetdec] + tactic). *) + Hint Constructors FSet_elt_Prop FSet_Prop : FSet_Prop. + Ltac discard_nonFSet := + decompose records; + repeat ( + match goal with + | H : ?P |- _ => + if prop (FSet_Prop P) holds by + (auto 100 with FSet_Prop) + then fail + else clear H + end). + + (** ** Turning Set Operators into Propositional Connectives + The lemmas from [FSetFacts] will be used to break down + set operations into propositional formulas built over + the predicates [In] and [E.eq] applied only to + variables. We are going to use them with [autorewrite]. + *) + Module F := FSetFacts.Facts M. + Hint Rewrite + F.empty_iff F.singleton_iff F.add_iff F.remove_iff + F.union_iff F.inter_iff F.diff_iff + : set_simpl. + + (** ** Decidability of FSet Propositions *) + + (** [In] is decidable. *) + Module D := DepOfNodep M. + Lemma dec_In : forall x s, + decidable (In x s). + Proof. + intros x s. red. destruct (D.mem x s); auto. + Qed. + + (** [E.eq] is decidable. *) + Lemma dec_eq : forall (x y : E.t), + decidable (E.eq x y). + Proof. + intros x y. red. + destruct (E.compare x y); auto. +(* destruct (E.compare x y).*) + Admitted. + + (** The hint database [FSet_decidability] will be given to + the [push_neg] tactic from the module [Negation]. *) + Hint Resolve dec_In dec_eq : FSet_decidability. + + (** ** Normalizing Propositions About Equality + We have to deal with the fact that [E.eq] may be + convertible with Coq's equality. Thus, we will find the + following tactics useful to replace one form with the + other everywhere. *) + + (** The next tactic, [Logic_eq_to_E_eq], mentions the term + [E.t]; thus, we must ensure that [E.t] is used in favor + of any other convertible but syntactically distinct + term. *) + Ltac change_to_E_t := + repeat ( + match goal with + | H : ?T |- _ => + progress (change T with E.t in H); + repeat ( + match goal with + | J : _ |- _ => progress (change T with E.t in J) + | |- _ => progress (change T with E.t) + end ) + end). + + (** These two tactics take us from Coq's built-in equality + to [E.eq] (and vice versa) when possible. *) + + Ltac Logic_eq_to_E_eq := + repeat ( + match goal with + | H: _ |- _ => + progress (change (@Logic.eq E.t) with E.eq in H) + | |- _ => + progress (change (@Logic.eq E.t) with E.eq) + end). + + Ltac E_eq_to_Logic_eq := + repeat ( + match goal with + | H: _ |- _ => + progress (change E.eq with (@Logic.eq E.t) in H) + | |- _ => + progress (change E.eq with (@Logic.eq E.t)) + end). + + (** This tactic works like the built-in tactic [subst], but + at the level of set element equality (which may not be + the convertible with Coq's equality). *) + Ltac substFSet := + repeat ( + match goal with + | H: E.eq ?x ?y |- _ => rewrite H in *; clear H + end). + + (** ** Considering Decidability of Base Propositions + This tactic adds assertions about the decidability of + [E.eq] and [In] to the context. This is necessary for + the completeness of the [fsetdec] tactic. However, in + order to minimize the cost of proof search, we should be + careful to not add more than we need. Once negations + have been pushed to the leaves of the propositions, we + only need to worry about decidability for those base + propositions that appear in a negated form. *) + Ltac assert_decidability := + (** We actually don't want these rules to fire if the + syntactic context in the patterns below is trivially + empty, but we'll just do some clean-up at the + afterward. *) + repeat ( + match goal with + | H: context [~ E.eq ?x ?y] |- _ => + assert new (E.eq x y \/ ~ E.eq x y) by (apply dec_eq) + | H: context [~ In ?x ?s] |- _ => + assert new (In x s \/ ~ In x s) by (apply dec_In) + | |- context [~ E.eq ?x ?y] => + assert new (E.eq x y \/ ~ E.eq x y) by (apply dec_eq) + | |- context [~ In ?x ?s] => + assert new (In x s \/ ~ In x s) by (apply dec_In) + end); + (** Now we eliminate the useless facts we added (because + they would likely be very harmful to performance). *) + repeat ( + match goal with + | _: ~ ?P, H : ?P \/ ~ ?P |- _ => clear H + end). + + (** ** Handling [Empty], [Subset], and [Equal] + This tactic instantiates universally quantified + hypotheses (which arise from the unfolding of [Empty], + [Subset], and [Equal]) for each of the set element + expressions that is involved in some membership or + equality fact. Then it throws away those hypotheses, + which should no longer be needed. *) + Ltac inst_FSet_hypotheses := + repeat ( + match goal with + | H : forall a : E.t, _, + _ : context [ In ?x _ ] |- _ => + let P := type of (H x) in + assert new P by (exact (H x)) + | H : forall a : E.t, _ + |- context [ In ?x _ ] => + let P := type of (H x) in + assert new P by (exact (H x)) + | H : forall a : E.t, _, + _ : context [ E.eq ?x _ ] |- _ => + let P := type of (H x) in + assert new P by (exact (H x)) + | H : forall a : E.t, _ + |- context [ E.eq ?x _ ] => + let P := type of (H x) in + assert new P by (exact (H x)) + | H : forall a : E.t, _, + _ : context [ E.eq _ ?x ] |- _ => + let P := type of (H x) in + assert new P by (exact (H x)) + | H : forall a : E.t, _ + |- context [ E.eq _ ?x ] => + let P := type of (H x) in + assert new P by (exact (H x)) + end); + repeat ( + match goal with + | H : forall a : E.t, _ |- _ => + clear H + end). + + (** ** The Core [fsetdec] Auxiliary Tactics *) + + (** Here is the crux of the proof search. Recursion through + [intuition]! (This will terminate if I correctly + understand the behavior of [intuition].) *) + Ltac fsetdec_rec := + try (match goal with + | H: E.eq ?x ?x -> False |- _ => destruct H + end); + (reflexivity || + contradiction || + (progress substFSet; intuition fsetdec_rec)). + + (** If we add [unfold Empty, Subset, Equal in *; intros;] to + the beginning of this tactic, it will satisfy the same + specification as the [fsetdec] tactic; however, it will + be much slower than necessary without the pre-processing + done by the wrapper tactic [fsetdec]. *) + Ltac fsetdec_body := + inst_FSet_hypotheses; + autorewrite with set_simpl in *; + push not in * using FSet_decidability; + substFSet; + assert_decidability; + auto using E.eq_refl; + (intuition fsetdec_rec) || + fail 1 + "because the goal is beyond the scope of this tactic". + + End FSetDecideAuxiliary. + Import FSetDecideAuxiliary. + + (** * The [fsetdec] Tactic + Here is the top-level tactic (the only one intended for + clients of this library). It's specification is given at + the top of the file. *) + Ltac fsetdec := + (** We first unfold any occurrences of [iff]. *) + unfold iff in *; + (** We fold occurrences of [not] because it is better for + [intros] to leave us with a goal of [~ P] than a goal of + [False]. *) + fold any not; intros; + (** Now we decompose conjunctions, which will allow the + [discard_nonFSet] and [assert_decidability] tactics to + do a much better job. *) + decompose records; + discard_nonFSet; + (** We unfold these defined propositions on finite sets. If + our goal was one of them, then have one more item to + introduce now. *) + unfold Empty, Subset, Equal in *; intros; + (** We now want to get rid of all uses of [=] in favor of + [E.eq]. However, the best way to eliminate a [=] in + the context is with [subst], so we will try that first. + In fact, we may as well convert uses of [E.eq] into [=] + where possible before we do [subst] so that we can get + even more mileage out of it. Then we will convert all + remaining uses of [=] back to [E.eq] when possible. We + use [change_to_E_t] to ensure that we have a canonical + name for set elements, so that [Logic_eq_to_E_eq] will + work properly. *) + change_to_E_t; E_eq_to_Logic_eq; subst++; Logic_eq_to_E_eq; + (** The next optimization is to swap a negated goal with a + negated hypothesis when possible. Any swap will improve + performance by eliminating the total number of + negations, but we will get the maximum benefit if we + swap the goal with a hypotheses mentioning the same set + element, so we try that first. If we reach the fourth + branch below, we attempt any swap. However, to maintain + completeness of this tactic, we can only perform such a + swap with a decidable proposition; hence, we first test + whether the hypothesis is an [FSet_elt_Prop], noting + that any [FSet_elt_Prop] is decidable. *) + pull not using FSet_decidability; + unfold not in *; + match goal with + | H: (In ?x ?r) -> False |- (In ?x ?s) -> False => + contra H; fsetdec_body + | H: (In ?x ?r) -> False |- (E.eq ?x ?y) -> False => + contra H; fsetdec_body + | H: (In ?x ?r) -> False |- (E.eq ?y ?x) -> False => + contra H; fsetdec_body + | H: ?P -> False |- ?Q -> False => + if prop (FSet_elt_Prop P) holds by + (auto 100 with FSet_Prop) + then (contra H; fsetdec_body) + else fsetdec_body + | |- _ => + fsetdec_body + end. + + (** * Examples *) + + Module FSetDecideTestCases. + + Lemma test_eq_trans_1 : forall x y z s, + E.eq x y -> + ~ ~ E.eq z y -> + In x s -> + In z s. + Proof. fsetdec. Qed. + + Lemma test_eq_trans_2 : forall x y z r s, + In x (singleton y) -> + ~ In z r -> + ~ ~ In z (add y r) -> + In x s -> + In z s. + Proof. fsetdec. Qed. + + Lemma test_eq_neq_trans_1 : forall w x y z s, + E.eq x w -> + ~ ~ E.eq x y -> + ~ E.eq y z -> + In w s -> + In w (remove z s). + Proof. fsetdec. Qed. + + Lemma test_eq_neq_trans_2 : forall w x y z r1 r2 s, + In x (singleton w) -> + ~ In x r1 -> + In x (add y r1) -> + In y r2 -> + In y (remove z r2) -> + In w s -> + In w (remove z s). + Proof. fsetdec. Qed. + + Lemma test_In_singleton : forall x, + In x (singleton x). + Proof. fsetdec. Qed. + + Lemma test_Subset_add_remove : forall x s, + s [<=] (add x (remove x s)). + Proof. fsetdec. Qed. + + Lemma test_eq_disjunction : forall w x y z, + In w (add x (add y (singleton z))) -> + E.eq w x \/ E.eq w y \/ E.eq w z. + Proof. fsetdec. Qed. + + Lemma test_not_In_disj : forall x y s1 s2 s3 s4, + ~ In x (union s1 (union s2 (union s3 (add y s4)))) -> + ~ (In x s1 \/ In x s4 \/ E.eq y x). + Proof. fsetdec. Qed. + + Lemma test_not_In_conj : forall x y s1 s2 s3 s4, + ~ In x (union s1 (union s2 (union s3 (add y s4)))) -> + ~ In x s1 /\ ~ In x s4 /\ ~ E.eq y x. + Proof. fsetdec. Qed. + + Lemma test_iff_conj : forall a x s s', + (In a s' <-> E.eq x a \/ In a s) -> + (In a s' <-> In a (add x s)). + Proof. fsetdec. Qed. + + Lemma test_set_ops_1 : forall x q r s, + (singleton x) [<=] s -> + Empty (union q r) -> + Empty (inter (diff s q) (diff s r)) -> + ~ In x s. + Proof. fsetdec. Qed. + + Lemma eq_chain_test : forall x1 x2 x3 x4 s1 s2 s3 s4, + Empty s1 -> + In x2 (add x1 s1) -> + In x3 s2 -> + ~ In x3 (remove x2 s2) -> + ~ In x4 s3 -> + In x4 (add x3 s3) -> + In x1 s4 -> + Subset (add x4 s4) s4. + Proof. fsetdec. Qed. + + Lemma test_too_complex : forall x y z r s, + E.eq x y -> + (In x (singleton y) -> r [<=] s) -> + In z r -> + In z s. + Proof. + (** [fsetdec] is not intended to solve this directly. *) + intros until s; intros Heq H Hr; lapply H; fsetdec. + Qed. + + Lemma function_test_1 : + forall (f : t -> t), + forall (g : elt -> elt), + forall (s1 s2 : t), + forall (x1 x2 : elt), + Equal s1 (f s2) -> + E.eq x1 (g (g x2)) -> + In x1 s1 -> + In (g (g x2)) (f s2). + Proof. fsetdec. Qed. + + Lemma function_test_2 : + forall (f : t -> t), + forall (g : elt -> elt), + forall (s1 s2 : t), + forall (x1 x2 : elt), + Equal s1 (f s2) -> + E.eq x1 (g x2) -> + In x1 s1 -> + g x2 = g (g x2) -> + In (g (g x2)) (f s2). + Proof. + (** [fsetdec] is not intended to solve this directly. *) + intros until 3. intros g_eq. rewrite <- g_eq. fsetdec. + Qed. + + End FSetDecideTestCases. + +End Decide. diff --git a/coq-Fsub/FSetNotin.v b/share/popl08-tutorial-Fsub/FSetNotin.v similarity index 100% rename from coq-Fsub/FSetNotin.v rename to share/popl08-tutorial-Fsub/FSetNotin.v diff --git a/share/popl08-tutorial-Fsub/FSetNotin.v.crashcoqide b/share/popl08-tutorial-Fsub/FSetNotin.v.crashcoqide new file mode 100644 index 0000000..c1d8934 --- /dev/null +++ b/share/popl08-tutorial-Fsub/FSetNotin.v.crashcoqide @@ -0,0 +1,183 @@ +(** Lemmas and tactics for working with and solving goals related to + non-membership in finite sets. The main tactic of interest here + is [notin_solve]. + + Authors: Arthur Charguéraud and Brian Aydemir. *) + +Set Implicit Arguments. +Require Import FSetInterface. +Require Import AdditionalTactics. +Require AdditionalTactics. + +(* *********************************************************************** *) +(** * Implementation *) + +Module Notin (X : FSetInterface.S). + +Import X. +Import AdditionalTactics. + +(* *********************************************************************** *) +(** ** Facts about set (non-)membership *) + +Lemma in_singleton : forall x, + In x (singleton x). +Proof. + intros. + apply singleton_2. + generalize dependent x. + apply E.eq_refl. +Qed. + +Lemma notin_empty : forall x, + ~ In x empty. +Proof. + auto using empty_1. +Qed. + +Lemma notin_union : forall x E F, + ~ In x E -> ~ In x F -> ~ In x (union E F). +Proof. + intros x E F H J K. + destruct (union_1 K); intuition. +Qed. + +Lemma elim_notin_union : forall x E F, + ~ In x (union E F) -> (~ In x E) /\ (~ In x F). +Proof. + intros x E F H. split; intros J; contradiction H. + auto using union_2. + auto using union_3. +Qed. + +Lemma notin_singleton : forall x y, + ~ E.eq x y -> ~ In x (singleton y). +Proof. + intros x y H J. assert (K := singleton_1 J). auto with *. +Qed. + +Lemma elim_notin_singleton : forall x y, + ~ In x (singleton y) -> ~ E.eq x y. +Proof. + intros x y H J. + contradiction H. + apply singleton_2. + generalize x y J. + apply E.eq_sym. +Qed. + +Lemma elim_notin_singleton' : forall x y, + ~ In x (singleton y) -> x <> y. +Proof. + intros. assert (~ E.eq x y). auto using singleton_2. + intros J. subst. auto with *. + contradict H0. + rewrite H0. + apply E.eq_refl. +Qed. + +Lemma notin_singleton_swap : forall x y, + ~ In x (singleton y) -> ~ In y (singleton x). +Proof. + intros. + assert (Q := elim_notin_singleton H). + auto using singleton_1. +Qed. + + +(* *********************************************************************** *) +(** ** Rewriting non-membership facts *) + +Lemma notin_singleton_rw : forall x y, + ~ In x (singleton y) <-> ~ E.eq x y. +Proof. + intros. split. + auto using elim_notin_singleton. + auto using notin_singleton. +Qed. + + +(* *********************************************************************** *) +(** ** Tactics *) + +(** The tactic [notin_simpl_hyps] destructs all hypotheses of the form + [(~ In x E)], where [E] is built using only [empty], [union], and + [singleton]. *) + +Ltac notin_simpl_hyps := + try match goal with + | H: In ?x ?E -> False |- _ => + change (~ In x E) in H; + notin_simpl_hyps + | H: ~ In _ empty |- _ => + clear H; + notin_simpl_hyps + | H: ~ In ?x (singleton ?y) |- _ => + let F1 := fresh in + let F2 := fresh in + assert (F1 := @elim_notin_singleton x y H); + assert (F2 := @elim_notin_singleton' x y H); + clear H; + notin_simpl_hyps + | H: ~ In ?x (union ?E ?F) |- _ => + destruct (@elim_notin_union x E F H); + clear H; + notin_simpl_hyps + end. + +(** The tactic [notin_solve] solves goals of them form [(x <> y)] and + [(~ In x E)] that are provable from hypotheses of the form + destructed by [notin_simpl_hyps]. *) + +Ltac notin_solve := + notin_simpl_hyps; + repeat (progress ( apply notin_empty + || apply notin_union + || apply notin_singleton)); + solve [ trivial | congruence | intuition auto ]. + + +(* *********************************************************************** *) +(** ** Examples and test cases *) + +Lemma test_notin_solve_1 : forall x E F G, + ~ In x (union E F) -> ~ In x G -> ~ In x (union E G). +Proof. + intros. notin_solve. +Qed. + +Lemma test_notin_solve_2 : forall x y E F G, + ~ In x (union E (union (singleton y) F)) -> ~ In x G -> + ~ In x (singleton y) /\ ~ In y (singleton x). +Proof. + intros. + split. + notin_solve. + + apply notin_singleton. + generalize H. + apply notin_union. +Admitted. + +Lemma test_notin_solve_3 : forall x y, + ~ E.eq x y -> ~ In x (singleton y) /\ ~ In y (singleton x). +Proof. + intros. split. notin_solve. + (* notin_solve.*) +Admitted. + +Lemma test_notin_solve_4 : forall x y E F G, + ~ In x (union E (union (singleton x) F)) -> ~ In y G. +Proof. + intros. notin_solve. +Qed. + +Lemma test_notin_solve_5 : forall x y E F, + ~ In x (union E (union (singleton y) F)) -> ~ In y E -> + ~ E.eq y x /\ ~ E.eq x y. +Proof. + intros. split. + (* notin_solve. notin_solve.*) +Admitted. + +End Notin. diff --git a/coq-Fsub/FiniteSets.v b/share/popl08-tutorial-Fsub/FiniteSets.v similarity index 100% rename from coq-Fsub/FiniteSets.v rename to share/popl08-tutorial-Fsub/FiniteSets.v diff --git a/coq-Fsub/Fsub_Definitions.v b/share/popl08-tutorial-Fsub/Fsub_Definitions.v similarity index 100% rename from coq-Fsub/Fsub_Definitions.v rename to share/popl08-tutorial-Fsub/Fsub_Definitions.v diff --git a/share/popl08-tutorial-Fsub/Fsub_Definitions.v.crashcoqide b/share/popl08-tutorial-Fsub/Fsub_Definitions.v.crashcoqide new file mode 100644 index 0000000..b7b7e15 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Fsub_Definitions.v.crashcoqide @@ -0,0 +1,493 @@ +(** Definition of Fsub (System F with subtyping). + + Authors: Brian Aydemir and Arthur Charguéraud, with help from + Aaron Bohannon, Jeffrey Vaughan, and Dimitrios Vytiniotis. + + Table of contents: + - #Syntax (pre-terms)# + - #Opening# + - #Local closure# + - #Environments# + - #Well-formedness# + - #Subtyping# + - #Typing# + - #Values# + - #Reduction# + - #Automation# +*) + +Require Export Metatheory. + + +(* ********************************************************************** *) +(** * ## Syntax (pre-terms) *) + +(** We use a locally nameless representation for Fsub, where bound + variables are represented as natural numbers (de Bruijn indices) + and free variables are represented as [atom]s. The type [atom], + defined in the [Atom] library, represents names: there are + infinitely many atoms, equality is decidable on atoms, and it is + possible to generate an atom fresh for any given finite set of + atoms. + + We say that the definitions below define pre-types ([typ]) and + pre-expressions ([exp]), collectively pre-terms, since the + datatypes admit terms, such as [(typ_all typ_top (typ_bvar 3))], + where indices are unbound. A term is locally closed when it + contains no unbound indices. + + Note that indices for bound type variables are distinct from + indices for bound expression variables. We make this explicit in + the definitions below of the opening operations. *) + +Inductive typ : Set := + | typ_top : typ + | typ_bvar : nat -> typ + | typ_fvar : atom -> typ + | typ_arrow : typ -> typ -> typ + | typ_all : typ -> typ -> typ +. + +Inductive exp : Set := + | exp_bvar : nat -> exp + | exp_fvar : atom -> exp + | exp_abs : typ -> exp -> exp + | exp_app : exp -> exp -> exp + | exp_tabs : typ -> exp -> exp + | exp_tapp : exp -> typ -> exp +. + +(** We declare the constructors for indices and variables to be + coercions. For example, if Coq sees a [nat] where it expects an + [exp], it will implicitly insert an application of [exp_bvar]; + similar behavior happens for [atom]s. Thus, we may write + [(exp_abs typ_top (exp_app 0 x))] instead of [(exp_abs typ_top + (exp_app (exp_bvar 0) (exp_fvar x)))]. *) + +Coercion typ_bvar : nat >-> typ. +Coercion typ_fvar : atom >-> typ. +Coercion exp_bvar : nat >-> exp. +Coercion exp_fvar : atom >-> exp. + + +(* ********************************************************************** *) +(** * ## Opening terms *) + +(** Opening replaces an index with a term. This operation is required + if we wish to work only with locally closed terms when going under + binders (e.g., the typing rule for [exp_abs]). It also + corresponds to informal substitution for a bound variable, which + occurs in the rule for beta reduction. + + We need to define three functions for opening due the syntax of + Fsub, and we name them according to the following convention. + - [tt]: Denotes an operation involving types appearing in types. + - [te]: Denotes an operation involving types appearing in + expressions. + - [ee]: Denotes an operation involving expressions appearing in + expressions. + + The notation used below for decidable equality on atoms and + natural numbers (e.g., [K === J]) is defined in the [Metatheory] + library. The order of arguments to each "open" function is the + same. For example, [(open_tt_rec K U T)] can be read as + "substitute [U] for index [K] in [T]." + + Note that we assume that [U] is locally closed (and similarly for + the other opening functions). This assumption simplifies the + implementations of opening by letting us avoid shifting. Since + bound variables are indices, there is no need to rename variables + to avoid capture. Finally, we assume that these functions are + initially called with index zero and that zero is the only unbound + index in the term. This eliminates the need to possibly subtract + one in the case of indices. *) + +Fixpoint open_tt_rec (K : nat) (U : typ) (T : typ) {struct T} : typ := + match T with + | typ_top => typ_top + | typ_bvar J => if K === J then U else (typ_bvar J) + | typ_fvar X => typ_fvar X + | typ_arrow T1 T2 => typ_arrow (open_tt_rec K U T1) (open_tt_rec K U T2) + | typ_all T1 T2 => typ_all (open_tt_rec K U T1) (open_tt_rec (S K) U T2) + end. + +Fixpoint open_te_rec (K : nat) (U : typ) (e : exp) {struct e} : exp := + match e with + | exp_bvar i => exp_bvar i + | exp_fvar x => exp_fvar x + | exp_abs V e1 => exp_abs (open_tt_rec K U V) (open_te_rec K U e1) + | exp_app e1 e2 => exp_app (open_te_rec K U e1) (open_te_rec K U e2) + | exp_tabs V e1 => exp_tabs (open_tt_rec K U V) (open_te_rec (S K) U e1) + | exp_tapp e1 V => exp_tapp (open_te_rec K U e1) (open_tt_rec K U V) + end. + +Fixpoint open_ee_rec (k : nat) (f : exp) (e : exp) {struct e} : exp := + match e with + | exp_bvar i => if k === i then f else (exp_bvar i) + | exp_fvar x => exp_fvar x + | exp_abs V e1 => exp_abs V (open_ee_rec (S k) f e1) + | exp_app e1 e2 => exp_app (open_ee_rec k f e1) (open_ee_rec k f e2) + | exp_tabs V e1 => exp_tabs V (open_ee_rec k f e1) + | exp_tapp e1 V => exp_tapp (open_ee_rec k f e1) V + end. + +(** Many common applications of opening replace index zero with an + expression or variable. The following definitions provide + convenient shorthands for such uses. Note that the order of + arguments is switched relative to the definitions above. For + example, [(open_tt T X)] can be read as "substitute the variable + [X] for index [0] in [T]" and "open [T] with the variable [X]." + Recall that the coercions above let us write [X] in place of + [(typ_fvar X)], assuming that [X] is an [atom]. *) + +Definition open_tt T U := open_tt_rec 0 U T. +Definition open_te e U := open_te_rec 0 U e. +Definition open_ee e1 e2 := open_ee_rec 0 e2 e1. + + +(* ********************************************************************** *) +(** * ## Local closure *) + +(** Recall that [typ] and [exp] define pre-terms; these datatypes + admit terms that contain unbound indices. A term is locally + closed, or syntactically well-formed, when no indices appearing in + it are unbound. The proposition [(type T)] holds when a type [T] + is locally closed, and [(expr e)] holds when an expression [e] is + locally closed. + + The inductive definitions below formalize local closure such that + the resulting induction principles serve as structural induction + principles over (locally closed) types and (locally closed) + expressions. In particular, unlike the situation with pre-terms, + there are no cases for indices. Thus, these induction principles + correspond more closely to informal practice than the ones arising + from the definitions of pre-terms. + + The interesting cases in the inductive definitions below are those + that involve binding constructs, e.g., [typ_all]. Intuitively, to + check if the pre-term [(typ_all T1 T2)] is locally closed we much + check that [T1] is locally closed, and that [T2] is locally closed + when opened with a variable. However, there is a choice as to how + many variables to quantify over. One possibility is to quantify + over only one variable ("existential" quantification), as in +<< + type_all : forall X T1 T2, + type T1 -> + type (open_tt T2 X) -> + type (typ_all T1 T2) +>> or we could quantify over as many variables as possible ("universal" + quantification), as in +<< + type_all : forall T1 T2, + type T1 -> + (forall X : atom, type (open_tt T2 X)) -> + type (typ_all T1 T2) +>> It is possible to show that the resulting relations are equivalent. + The former makes it easy to build derivations, while the latter + provides a strong induction principle. McKinna and Pollack used + both forms of this relation in their work on formalizing Pure Type + Systems. + + We take a different approach here and use "cofinite + quantification": we quantify over all but finitely many variables. + This approach provides a convenient middle ground: we can build + derivations reasonably easily and get reasonably strong induction + principles. With some work, one can show that the definitions + below are equivalent to ones that use existential, and hence also + universal, quantification. *) + +Inductive type : typ -> Prop := + | type_top : + type typ_top + | type_var : forall X, + type (typ_fvar X) + | type_arrow : forall T1 T2, + type T1 -> + type T2 -> + type (typ_arrow T1 T2) + | type_all : forall L T1 T2, + type T1 -> + (forall X : atom, X `notin` L -> type (open_tt T2 X)) -> + type (typ_all T1 T2) +. + +Inductive expr : exp -> Prop := + | expr_var : forall x, + expr (exp_fvar x) + | expr_abs : forall L T e1, + type T -> + (forall x : atom, x `notin` L -> expr (open_ee e1 x)) -> + expr (exp_abs T e1) + | expr_app : forall e1 e2, + expr e1 -> + expr e2 -> + expr (exp_app e1 e2) + | expr_tabs : forall L T e1, + type T -> + (forall X : atom, X `notin` L -> expr (open_te e1 X)) -> + expr (exp_tabs T e1) + | expr_tapp : forall e1 V, + expr e1 -> + type V -> + expr (exp_tapp e1 V) +. + + + +(* ********************************************************************** *) +(** * ## Environments *) + +(** In our presentation of System F with subtyping, we use a single + environment for both typing and subtyping assumptions. We + formalize environments by representing them as association lists + (lists of pairs of keys and values) whose keys are atoms. + + The [Metatheory] and [Environment] libraries provide functions, + predicates, tactics, notations and lemmas that simplify working + with environments. The [Environment] library treats environments + as lists of type [list (atom * A)]. + + Since environments map [atom]s, the type [A] should encode whether + a particular binding is a typing or subtyping assumption. Thus, + we instantiate [A] with the type [binding], defined below. *) + +Inductive binding : Set := + | bind_sub : typ -> binding + | bind_typ : typ -> binding. + +(** A binding [(X, bind_sub T)] records that a type variable [X] is a + subtype of [T], and a binding [(x, bind_typ U)] records that an + expression variable [x] has type [U]. + + We define an abbreviation [env] for the type of environments, and + an abbreviation [empty] for the empty environment. + + Note: Each instance of [Notation] below defines an abbreviation + since the left-hand side consists of a single identifier that is + not in quotes. These abbreviations are used for both parsing (the + left-hand side is equivalent to the right-hand side in all + contexts) and printing (the right-hand side is pretty-printed as + the left-hand side). Since [nil] is normally a polymorphic + constructor whose type argument is implicit, we prefix the name + with "[@]" to signal to Coq that we are going to supply arguments + to [nil] explicitly. *) + +Notation env := (list (atom * binding)). +Notation empty := (@nil (atom * binding)). + +(** We also define a notation that makes it convenient to write one + element lists. This notation is useful because of our convention + for building environments; see the examples below. *) + +Notation "[ x ]" := (x :: nil). + +(** ##Examples:## We use a convention where environments are + never built using a cons operation [((x, a) :: E)] where [E] is + non-[nil]. This makes the shape of environments more uniform and + saves us from excessive fiddling with the shapes of environments. + For example, Coq's tactics sometimes distinguish between consing + on a new binding and prepending a one element list, even though + the two operations are convertible with each other. + + Consider the following environments written in informal notation. +<< + 1. (empty environment) + 2. x : T + 3. x : T, Y <: S + 4. E, x : T, F +>> In the third example, we have an environment that binds an + expression variable [x] to [T] and a type variable [Y] to [S]. + In Coq, we would write these environments as follows. +<< + 1. empty + 2. [(x, bind_typ T)] + 3. [(Y, bind_sub S)] ++ [(x, bind_typ T)] + 4. F ++ [(x, bind_typ T)] ++ E +>> The symbol "[++]" denotes list concatenation and associates to the + right. (That notation is defined in Coq's [List] library.) Note + that in Coq, environments grow on the left, since that is where + the head of a list is. *) + + +(* ********************************************************************** *) +(** * ## Well-formedness *) + +(** A type [T] is well-formed with respect to an environment [E], + denoted [(wf_typ E T)], when [T] is locally-closed and its free + variables are bound in [E]. We need this relation in order to + restrict the subtyping and typing relations, defined below, to + contain only well-formed types. (This relation is missing in the + original statement of the POPLmark Challenge.) + + Note: It is tempting to define the premise of [wf_typ_var] as [(X + `in` dom E)], since that makes the rule easier to apply (no need + to guess an instantiation for [U]). Unfortunately, this is + incorrect. We need to check that [X] is bound as a type-variable, + not an expression-variable; [(dom E)] does not distinguish between + the two kinds of bindings. *) + +Inductive wf_typ : env -> typ -> Prop := + | wf_typ_top : forall E, + wf_typ E typ_top + | wf_typ_var : forall U E (X : atom), + binds X (bind_sub U) E -> + wf_typ E (typ_fvar X) + | wf_typ_arrow : forall E T1 T2, + wf_typ E T1 -> + wf_typ E T2 -> + wf_typ E (typ_arrow T1 T2) + | wf_typ_all : forall L E T1 T2, + wf_typ E T1 -> + (forall X : atom, X `notin` L -> + wf_typ ([(X, bind_sub T1)] ++ E) (open_tt T2 X)) -> + wf_typ E (typ_all T1 T2) +. + +(** An environment E is well-formed, denoted [(wf_env E)], if each + atom is bound at most at once and if each binding is to a + well-formed type. This is a stronger relation than the [ok] + relation defined in the [Environment] library. We need this + relation in order to restrict the subtyping and typing relations, + defined below, to contain only well-formed environments. (This + relation is missing in the original statement of the POPLmark + Challenge.) *) + +Inductive wf_env : env -> Prop := + | wf_env_empty : + wf_env empty + | wf_env_sub : forall (E : env) (X : atom) (T : typ), + wf_env E -> + wf_typ E T -> + X `notin` dom E -> + wf_env ([(X, bind_sub T)] ++ E) + | wf_env_typ : forall (E : env) (x : atom) (T : typ), + wf_env E -> + wf_typ E T -> + x `notin` dom E -> + wf_env ([(x, bind_typ T)] ++ E). + + +(* ********************************************************************** *) +(** * ## Subtyping *) + +(** The definition of subtyping is straightforward. It uses the + [binds] relation from the [Environment] library (in the + [sub_trans_tvar] case) and cofinite quantification (in the + [sub_all] case). *) + +Inductive sub : env -> typ -> typ -> Prop := + | sub_top : forall E S, + wf_env E -> + wf_typ E S -> + sub E S typ_top + | sub_refl_tvar : forall E X, + wf_env E -> + wf_typ E (typ_fvar X) -> + sub E (typ_fvar X) (typ_fvar X) + | sub_trans_tvar : forall U E T X, + binds X (bind_sub U) E -> + sub E U T -> + sub E (typ_fvar X) T + | sub_arrow : forall E S1 S2 T1 T2, + sub E T1 S1 -> + sub E S2 T2 -> + sub E (typ_arrow S1 S2) (typ_arrow T1 T2) + | sub_all : forall L E S1 S2 T1 T2, + sub E T1 S1 -> + (forall X : atom, X `notin` L -> + sub ([(X, bind_sub T1)] ++ E) (open_tt S2 X) (open_tt T2 X)) -> + sub E (typ_all S1 S2) (typ_all T1 T2) +. + + +(* ********************************************************************** *) +(** * ## Typing *) + +(** The definition of typing is straightforward. It uses the [binds] + relation from the [Environment] library (in the [typing_var] case) + and cofinite quantification in the cases involving binders (e.g., + [typing_abs] and [typing_tabs]). *) + +Inductive typing : env -> exp -> typ -> Prop := + | typing_var : forall E x T, + wf_env E -> + binds x (bind_typ T) E -> + typing E (exp_fvar x) T + | typing_abs : forall L E V e1 T1, + (forall x : atom, x `notin` L -> + typing ([(x, bind_typ V)] ++ E) (open_ee e1 x) T1) -> + typing E (exp_abs V e1) (typ_arrow V T1) + | typing_app : forall T1 E e1 e2 T2, + typing E e1 (typ_arrow T1 T2) -> + typing E e2 T1 -> + typing E (exp_app e1 e2) T2 + | typing_tabs : forall L E V e1 T1, + (forall X : atom, X `notin` L -> + typing ([(X, bind_sub V)] ++ E) (open_te e1 X) (open_tt T1 X)) -> + typing E (exp_tabs V e1) (typ_all V T1) + | typing_tapp : forall T1 E e1 T T2, + typing E e1 (typ_all T1 T2) -> + sub E T T1 -> + typing E (exp_tapp e1 T) (open_tt T2 T) + | typing_sub : forall S E e T, + typing E e S -> + sub E S T -> + typing E e T +. + + +(* ********************************************************************** *) +(** * ## Values *) + +Inductive value : exp -> Prop := + | value_abs : forall T e1, + expr (exp_abs T e1) -> + value (exp_abs T e1) + | value_tabs : forall T e1, + expr (exp_tabs T e1) -> + value (exp_tabs T e1) +. + + +(* ********************************************************************** *) +(** * ## Reduction *) + +Inductive red : exp -> exp -> Prop := + | red_app_1 : forall e1 e1' e2, + expr e2 -> + red e1 e1' -> + red (exp_app e1 e2) (exp_app e1' e2) + | red_app_2 : forall e1 e2 e2', + value e1 -> + red e2 e2' -> + red (exp_app e1 e2) (exp_app e1 e2') + | red_tapp : forall e1 e1' V, + type V -> + red e1 e1' -> + red (exp_tapp e1 V) (exp_tapp e1' V) + | red_abs : forall T e1 v2, + expr (exp_abs T e1) -> + value v2 -> + red (exp_app (exp_abs T e1) v2) (open_ee e1 v2) + | red_tabs : forall T1 e1 T2, + expr (exp_tabs T1 e1) -> + type T2 -> + red (exp_tapp (exp_tabs T1 e1) T2) (open_te e1 T2) +. + + +(* ********************************************************************** *) +(** * ## Automation *) + +(** We declare most constructors as [Hint]s to be used by the [auto] + and [eauto] tactics. We exclude constructors from the subtyping + and typing relations that use cofinite quantification. It is + unlikely that [eauto] will find an instantiation for the finite + set [L], and in those cases, [eauto] can take some time to fail. + (A priori, this is not obvious. In practice, one adds as hints + all constructors and then later removes some constructors when + they cause proof search to take too long.) *) + +Hint Constructors type expr wf_typ wf_env value red. +Hint Resolve sub_top sub_refl_tvar sub_arrow. +Hint Resolve typing_var typing_app typing_tapp typing_sub. diff --git a/coq-Fsub/Fsub_Infrastructure.v b/share/popl08-tutorial-Fsub/Fsub_Infrastructure.v similarity index 100% rename from coq-Fsub/Fsub_Infrastructure.v rename to share/popl08-tutorial-Fsub/Fsub_Infrastructure.v diff --git a/coq-Fsub/Fsub_Lemmas.v b/share/popl08-tutorial-Fsub/Fsub_Lemmas.v similarity index 100% rename from coq-Fsub/Fsub_Lemmas.v rename to share/popl08-tutorial-Fsub/Fsub_Lemmas.v diff --git a/share/popl08-tutorial-Fsub/Fsub_Lemmas.v.crashcoqide b/share/popl08-tutorial-Fsub/Fsub_Lemmas.v.crashcoqide new file mode 100644 index 0000000..847d8d5 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Fsub_Lemmas.v.crashcoqide @@ -0,0 +1,408 @@ +(** Administrative lemmas for Fsub. + + Authors: Brian Aydemir and Arthur Charguéraud, with help from + Aaron Bohannon, Jeffrey Vaughan, and Dimitrios Vytiniotis. + + This file contains a number of administrative lemmas that we + require for proving type-safety. The lemmas mainly concern the + relations [wf_typ] and [wf_env]. + + This file also contains regularity lemmas, which show that various + relations hold only for locally closed terms. In addition to + being necessary to complete the proof of type-safety, these lemmas + help demonstrate that our definitions are correct; they would be + worth proving even if they are unneeded for any "real" proofs. + + Table of contents: + - #Properties of wf_typ# + - #Properties of wf_env and wf_typ# + - #Properties of wf_env# + - #Properties of substitution# + - #Regularity lemmas# + - #Automation# *) + +Require Import Coq.Lists.List. +Include ListNotations. + +Require Import Fsub_Infrastructure. +Require Import AdditionalTactics. +Include AdditionalTactics. + +(* ********************************************************************** *) +(** * ## Properties of [wf_typ] *) + +(** If a type is well-formed in an environment, then it is locally + closed. *) + +Lemma type_from_wf_typ : forall E T, + wf_typ E T -> type T. +Proof. + intros E T H; induction H; eauto. +Qed. + +(** The remaining properties are analogous to the properties that we + need to show for the subtyping and typing relations. *) + +Lemma wf_typ_weakening : forall T E F G, + wf_typ (G ++ E) T -> + ok (G ++ F ++ E) -> + wf_typ (G ++ F ++ E) T. +Proof with simpl_env; eauto. + intros T E F G Hwf_typ Hk. +Admitted. +(* + remember (G ++ E) as F in |-. + generalize dependent G. + induction Hwf_typ; intros G Hok Heq; subst... + Case "type_all". + pick fresh Y and apply wf_typ_all... + rewrite <- concat_assoc. + apply H0... +Qed.*) + +Lemma wf_typ_weaken_head : forall T (E:env) (F:env), + wf_typ E T -> + ok (F ++ E) -> + wf_typ (F ++ E) T. +Proof. + intros. +Admitted. +(* + rewrite_env (empty ++ F++ E). + auto using wf_typ_weakening. +Qed. +*) + +Lemma wf_typ_narrowing : forall V U T E F X, + wf_typ (F ++ [(X, bind_sub V)] ++ E) T -> + ok (F ++ [(X, bind_sub U)] ++ E) -> + wf_typ (F ++ [(X, bind_sub U)] ++ E) T. +Proof with simpl_env; eauto. + intros V U T E F X Hwf_typ Hok. + remember (F ++ [(X, bind_sub V)] ++ E) as G. + generalize dependent F. + induction Hwf_typ; intros F Hok Heq; subst... + Case "wf_typ_var". + binds_cases H... + Case "typ_all". + pick fresh Y and apply wf_typ_all... + rewrite <- concat_assoc. + apply H0... +Qed. + +Lemma wf_typ_strengthening : forall E F x U T, + wf_typ (F ++ [(x, bind_typ U)] ++ E) T -> + wf_typ (F ++ E) T. +Proof with simpl_env; eauto. + intros E F x U T H. + remember (F ++ [(x, bind_typ U)] ++ E) as G. + generalize dependent F. + induction H; intros F Heq; subst... + Case "wf_typ_var". + binds_cases H... + Case "wf_typ_all". + pick fresh Y and apply wf_typ_all... + rewrite <- concat_assoc. + apply H1... +Qed. + +Lemma wf_typ_subst_tb : forall F Q E Z P T, + wf_typ (F ++ [(Z, bind_sub Q)] ++ E) T -> + wf_typ E P -> + ok (map (subst_tb Z P) F ++ E) -> + wf_typ (map (subst_tb Z P) F ++ E) (subst_tt Z P T). +Proof with simpl_env; eauto using wf_typ_weaken_head, type_from_wf_typ. + intros F Q E Z P T WT WP. + remember (F ++ [(Z, bind_sub Q)] ++ E) as G. + generalize dependent F. + induction WT; intros F EQ Ok; subst; simpl subst_tt... + Case "wf_typ_var". + destruct (X == Z); subst... + SCase "X <> Z". + binds_cases H... + apply (wf_typ_var (subst_tt Z P U))... + Case "wf_typ_all". + pick fresh Y and apply wf_typ_all... + rewrite subst_tt_open_tt_var... + rewrite_env (map (subst_tb Z P) ([(Y, bind_sub T1)] ++ F) ++ E). + apply H0... +Qed. + +Lemma wf_typ_open : forall E U T1 T2, + ok E -> + wf_typ E (typ_all T1 T2) -> + wf_typ E U -> + wf_typ E (open_tt T2 U). +Proof with simpl_env; eauto. + intros E U T1 T2 Ok WA WU. + inversion WA; subst. + pick fresh X. + rewrite (subst_tt_intro X)... + rewrite_env (map (subst_tb X U) empty ++ E). + eapply wf_typ_subst_tb... +Qed. + + +(* ********************************************************************** *) +(** * ## Properties of [wf_env] and [wf_typ] *) + +Lemma ok_from_wf_env : forall E, + wf_env E -> + ok E. +Proof. + intros E H; induction H; auto. +Qed. + +(** We add [ok_from_wf_env] as a hint here since it helps blur the + distinction between [wf_env] and [ok] in proofs. The lemmas in + the [Environment] library use [ok], whereas here we naturally have + (or can easily show) the stronger [wf_env]. Thus, + [ok_from_wf_env] serves as a bridge that allows us to use the + environments library. *) + +Hint Resolve ok_from_wf_env. + +Lemma wf_typ_from_binds_typ : forall x U E, + wf_env E -> + binds x (bind_typ U) E -> + wf_typ E U. +Proof with auto using wf_typ_weaken_head. + induction 1; intros J; binds_cases J... + inversion H4; subst... +Qed. + +Lemma wf_typ_from_wf_env_typ : forall x T E, + wf_env ([(x, bind_typ T)] ++ E) -> + wf_typ E T. +Proof. + intros x T E H. inversion H; auto. +Qed. + +Lemma wf_typ_from_wf_env_sub : forall x T E, + wf_env ([(x, bind_sub T)] ++ E) -> + wf_typ E T. +Proof. + intros x T E H. inversion H; auto. +Qed. + + +(* ********************************************************************** *) +(** * ## Properties of [wf_env] *) + +(** These properties are analogous to the properties that we need to + show for the subtyping and typing relations. *) + +Lemma wf_env_narrowing : forall V E F U X, + wf_env (F ++ [(X, bind_sub V)] ++ E) -> + wf_typ E U -> + wf_env (F ++ [(X, bind_sub U)] ++ E). +Proof with eauto 6 using wf_typ_narrowing. + induction F; intros U X Wf_env Wf; + inversion Wf_env; subst; simpl_env in *... +Qed. + +Lemma wf_env_strengthening : forall x T E F, + wf_env (F ++ [(x, bind_typ T)] ++ E) -> + wf_env (F ++ E). +Proof with eauto using wf_typ_strengthening. + induction F; intros Wf_env; inversion Wf_env; subst; simpl_env in *... +Qed. + +Lemma wf_env_subst_tb : forall Q Z P E F, + wf_env (F ++ [(Z, bind_sub Q)] ++ E) -> + wf_typ E P -> + wf_env (map (subst_tb Z P) F ++ E). +Proof with eauto 6 using wf_typ_subst_tb. + induction F; intros Wf_env WP; simpl_env; + inversion Wf_env; simpl_env in *; simpl subst_tb... +Qed. + + +(* ********************************************************************** *) +(** * ## Environment is unchanged by substitution for a fresh name *) + +Lemma notin_fv_tt_open : forall (Y X : atom) T, + X `notin` fv_tt (open_tt T Y) -> + X `notin` fv_tt T. +Proof. + intros Y X T. unfold open_tt. + generalize 0. + induction T; simpl; intros k Fr; notin_simpl; try apply notin_union; eauto. +Qed. + +Lemma notin_fv_wf : forall E (X : atom) T, + wf_typ E T -> + X `notin` dom E -> + X `notin` fv_tt T. +Proof with auto. + intros E X T Wf_typ. + induction Wf_typ; intros Fr; simpl... + Case "wf_typ_var". + assert (X0 `in` (dom E))... + eapply binds_In; eauto. + Case "wf_typ_all". + apply notin_union... + pick fresh Y. + apply (notin_fv_tt_open Y)... +Qed. + +Lemma map_subst_tb_id : forall G Z P, + wf_env G -> + Z `notin` dom G -> + G = map (subst_tb Z P) G. +Proof with auto. + intros G Z P H. + induction H; simpl; intros Fr; simpl_env... + rewrite <- IHwf_env... + rewrite <- subst_tt_fresh... eapply notin_fv_wf; eauto. + rewrite <- IHwf_env... + rewrite <- subst_tt_fresh... eapply notin_fv_wf; eauto. +Qed. + + +(* ********************************************************************** *) +(** * ## Regularity of relations *) + +Lemma sub_regular : forall E S T, + sub E S T -> + wf_env E /\ wf_typ E S /\ wf_typ E T. +Proof with simpl_env; auto*. + intros E S T H. + induction H... + Case "sub_trans_tvar". + eauto*. + Case "sub_all". + repeat split... + SCase "Second of original three conjuncts". + pick fresh Y and apply wf_typ_all... + destruct (H1 Y)... + rewrite_env (empty ++ [(Y, bind_sub S1)] ++ E). + apply (wf_typ_narrowing T1)... + SCase "Third of original three conjuncts". + pick fresh Y and apply wf_typ_all... + destruct (H1 Y)... +Qed. + +Lemma typing_regular : forall E e T, + typing E e T -> + wf_env E /\ expr e /\ wf_typ E T. +Proof with simpl_env; auto*. + intros E e T H; induction H... + Case "typing_var". + repeat split... + eauto using wf_typ_from_binds_typ. + Case "typing_abs". + pick fresh y. + destruct (H0 y) as [Hok [J K]]... + repeat split. inversion Hok... + SCase "Second of original three conjuncts". + pick fresh x and apply expr_abs. + eauto using type_from_wf_typ, wf_typ_from_wf_env_typ. + destruct (H0 x)... + SCase "Third of original three conjuncts". + apply wf_typ_arrow; eauto using wf_typ_from_wf_env_typ. + rewrite_env (empty ++ E). + eapply wf_typ_strengthening; simpl_env; eauto. + Case "typing_app". + repeat split... + destruct IHtyping1 as [_ [_ K]]. + inversion K... + Case "typing_tabs". + pick fresh Y. + destruct (H0 Y) as [Hok [J K]]... + inversion Hok; subst. + repeat split... + SCase "Second of original three conjuncts". + pick fresh X and apply expr_tabs. + eauto using type_from_wf_typ, wf_typ_from_wf_env_sub... + destruct (H0 X)... + SCase "Third of original three conjuncts". + pick fresh Z and apply wf_typ_all... + destruct (H0 Z)... + Case "typing_tapp". + destruct (sub_regular _ _ _ H0) as [R1 [R2 R3]]. + repeat split... + SCase "Second of original three conjuncts". + apply expr_tapp... + eauto using type_from_wf_typ. + SCase "Third of original three conjuncts". + destruct IHtyping as [R1' [R2' R3']]. + eapply wf_typ_open; eauto. + Case "typing_sub". + repeat split... + destruct (sub_regular _ _ _ H0)... +Qed. + +Lemma value_regular : forall e, + value e -> + expr e. +Proof. + intros e H. induction H; auto. +Qed. + +Lemma red_regular : forall e e', + red e e' -> + expr e /\ expr e'. +Proof with auto*. + intros e e' H. + induction H; assert(J := value_regular); split... + Case "red_abs". + inversion H. pick fresh y. rewrite (subst_ee_intro y)... + Case "red_tabs". + inversion H. pick fresh Y. rewrite (subst_te_intro Y)... +Qed. + + +(* *********************************************************************** *) +(** * ## Automation *) + +(** The lemma [ok_from_wf_env] was already added above as a hint since it + helps blur the distinction between [wf_env] and [ok] in proofs. + + As currently stated, the regularity lemmas are ill-suited to be + used with [auto] and [eauto] since they end in conjunctions. Even + if we were, for example, to split [sub_regularity] into three + separate lemmas, the resulting lemmas would be usable only by + [eauto] and there is no guarantee that [eauto] would be able to + find proofs effectively. Thus, the hints below apply the + regularity lemmas and [type_from_wf_typ] to discharge goals about + local closure and well-formedness, but in such a way as to + minimize proof search. + + The first hint introduces an [wf_env] fact into the context. It + works well when combined with the lemmas relating [wf_env] and + [wf_typ]. We choose to use those lemmas explicitly via [(auto + using ...)] tactics rather than add them as hints. When used this + way, the explicitness makes the proof more informative rather than + more cluttered (with useless details). + + The other three hints try outright to solve their respective + goals. *) + +Hint Extern 1 (wf_env ?E) => + match goal with + | H: sub _ _ _ |- _ => apply (proj1 (sub_regular _ _ _ H)) + | H: typing _ _ _ |- _ => apply (proj1 (typing_regular _ _ _ H)) + end. + +Hint Extern 1 (wf_typ ?E ?T) => + match goal with + | H: typing E _ T |- _ => apply (proj2 (proj2 (typing_regular _ _ _ H))) + | H: sub E T _ |- _ => apply (proj1 (proj2 (sub_regular _ _ _ H))) + | H: sub E _ T |- _ => apply (proj2 (proj2 (sub_regular _ _ _ H))) + end. + +Hint Extern 1 (type ?T) => + let go E := apply (type_from_wf_typ E); auto in + match goal with + | H: typing ?E _ T |- _ => go E + | H: sub ?E T _ |- _ => go E + | H: sub ?E _ T |- _ => go E + end. + +Hint Extern 1 (expr ?e) => + match goal with + | H: typing _ ?e _ |- _ => apply (proj1 (proj2 (typing_regular _ _ _ H))) + | H: red ?e _ |- _ => apply (proj1 (red_regular _ _ H)) + | H: red _ ?e |- _ => apply (proj2 (red_regular _ _ H)) + end. diff --git a/coq-Fsub/Fsub_Soundness.v b/share/popl08-tutorial-Fsub/Fsub_Soundness.v similarity index 100% rename from coq-Fsub/Fsub_Soundness.v rename to share/popl08-tutorial-Fsub/Fsub_Soundness.v diff --git a/share/popl08-tutorial-Fsub/Fsub_Soundness.v.crashcoqide b/share/popl08-tutorial-Fsub/Fsub_Soundness.v.crashcoqide new file mode 100644 index 0000000..a1460b8 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Fsub_Soundness.v.crashcoqide @@ -0,0 +1,593 @@ +(** Type-safety proofs for Fsub. + + Authors: Brian Aydemir and Arthur Charguéraud, with help from + Aaron Bohannon, Jeffrey Vaughan, and Dimitrios Vytiniotis. + + In parentheses are given the label of the corresponding lemma in + the appendix (informal proofs) of the POPLmark Challenge. + + Table of contents: + - #Properties of subtyping# + - #Properties of typing# + - #Preservation# + - #Progress# *) + +Require Export Fsub_Lemmas. + + +(* ********************************************************************** *) +(** * ## Properties of subtyping *) + + +(* ********************************************************************** *) +(** ** Reflexivity (1) *) + +Lemma sub_reflexivity : forall E T, + wf_env E -> + wf_typ E T -> + sub E T T. +Proof with eauto. + intros E T Ok Wf. + induction Wf... + pick fresh Y and apply sub_all... +Qed. + + +(* ********************************************************************** *) +(** ** Weakening (2) *) + +Lemma sub_weakening : forall E F G S T, + sub (G ++ E) S T -> + wf_env (G ++ F ++ E) -> + sub (G ++ F ++ E) S T. +Proof with simpl_env; auto using wf_typ_weakening. + intros E F G S T Sub Ok. + remember (G ++ E) as H. + generalize dependent G. + induction Sub; intros G Ok EQ; subst... + Case "sub_trans_tvar". + apply (sub_trans_tvar U)... + Case "sub_all". + pick fresh Y and apply sub_all... + rewrite <- concat_assoc. + apply H0... +Qed. + + +(* ********************************************************************** *) +(** ** Narrowing and transitivity (3) *) + +Definition transitivity_on Q := forall E S T, + sub E S Q -> sub E Q T -> sub E S T. + +Lemma sub_narrowing_aux : forall Q F E Z P S T, + transitivity_on Q -> + sub (F ++ [(Z, bind_sub Q)] ++ E) S T -> + sub E P Q -> + sub (F ++ [(Z, bind_sub P)] ++ E) S T. +Proof with simpl_env; eauto using wf_typ_narrowing, wf_env_narrowing. + intros Q F E Z P S T TransQ SsubT PsubQ. + remember (F ++ [(Z, bind_sub Q)] ++ E) as G. generalize dependent F. + induction SsubT; intros F EQ; subst... + Case "sub_top". + apply sub_top... + Case "sub_refl_tvar". + apply sub_refl_tvar... + Case "sub_trans_tvar". + destruct (X == Z); subst. + SCase "X = Z". + apply (sub_trans_tvar P); [ eauto using fresh_mid_head | ]. + apply TransQ. + SSCase "P <: Q". + rewrite_env (empty ++ (F ++ [(Z, bind_sub P)]) ++ E). + apply sub_weakening... + SSCase "Q <: T". + binds_get H. + inversion H1; subst... + SCase "X <> Z". + apply (sub_trans_tvar U)... + binds_cases H... + Case "sub_all". + pick fresh Y and apply sub_all... + rewrite <- concat_assoc. + apply H0... +Qed. + +Lemma sub_transitivity : forall Q, + transitivity_on Q. +Proof with simpl_env; auto. + unfold transitivity_on. + intros Q E S T SsubQ QsubT. + assert (W : type Q) by auto. + generalize dependent T. + generalize dependent S. + generalize dependent E. + remember Q as Q' in |-. + generalize dependent Q'. + induction W; + intros Q' EQ E S SsubQ; + induction SsubQ; try discriminate; inversion EQ; subst; + intros T' QsubT; + inversion QsubT; subst; eauto 4 using sub_trans_tvar. + Case "sub_all / sub_top". + assert (sub E (typ_all S1 S2) (typ_all T1 T2)). + SCase "proof of assertion". + pick fresh y and apply sub_all... + auto. + Case "sub_all / sub_all". + pick fresh Y and apply sub_all. + SCase "bounds". + eauto. + SCase "bodies". + lapply (H0 Y); [ intros K | auto ]. + apply (K (open_tt T2 Y))... + rewrite_env (empty ++ [(Y, bind_sub T0)] ++ E). + apply (sub_narrowing_aux T1)... + unfold transitivity_on. + auto using (IHW T1). +Qed. + +Lemma sub_narrowing : forall Q E F Z P S T, + sub E P Q -> + sub (F ++ [(Z, bind_sub Q)] ++ E) S T -> + sub (F ++ [(Z, bind_sub P)] ++ E) S T. +Proof. + intros. + eapply sub_narrowing_aux; eauto. + apply sub_transitivity. +Qed. + + +(* ********************************************************************** *) +(** ** Type substitution preserves subtyping (10) *) + +Lemma sub_through_subst_tt : forall Q E F Z S T P, + sub (F ++ [(Z, bind_sub Q)] ++ E) S T -> + sub E P Q -> + sub (map (subst_tb Z P) F ++ E) (subst_tt Z P S) (subst_tt Z P T). +Proof with + simpl_env; + eauto 4 using wf_typ_subst_tb, wf_env_subst_tb, wf_typ_weaken_head. + intros Q E F Z S T P SsubT PsubQ. + remember (F ++ [(Z, bind_sub Q)] ++ E) as G. + generalize dependent F. + induction SsubT; intros G EQ; subst; simpl subst_tt... + Case "sub_top". + apply sub_top... + Case "sub_refl_tvar". + destruct (X == Z); subst. + SCase "X = Z". + apply sub_reflexivity... + SCase "X <> Z". + apply sub_reflexivity... + inversion H0; subst. + binds_cases H3... + apply (wf_typ_var (subst_tt Z P U))... + Case "sub_trans_tvar". + destruct (X == Z); subst. + SCase "X = Z". + apply (sub_transitivity Q). + SSCase "left branch". + rewrite_env (empty ++ map (subst_tb Z P) G ++ E). + apply sub_weakening... + SSCase "right branch". + rewrite (subst_tt_fresh Z P Q). + binds_get H. + inversion H1; subst... + apply (notin_fv_wf E); eauto using fresh_mid_tail. + SCase "X <> Z". + apply (sub_trans_tvar (subst_tt Z P U))... + rewrite (map_subst_tb_id E Z P); + [ | auto | eapply fresh_mid_tail; eauto ]. + binds_cases H... + Case "sub_all". + pick fresh X and apply sub_all... + rewrite subst_tt_open_tt_var... + rewrite subst_tt_open_tt_var... + rewrite_env (map (subst_tb Z P) ([(X, bind_sub T1)] ++ G) ++ E). + apply H0... +Qed. + + +(* ********************************************************************** *) +(** * ## Properties of typing *) + + +(* ********************************************************************** *) +(** ** Weakening (5) *) + +Lemma typing_weakening : forall E F G e T, + typing (G ++ E) e T -> + wf_env (G ++ F ++ E) -> + typing (G ++ F ++ E) e T. +Proof with simpl_env; + eauto using wf_typ_weakening, + wf_typ_from_wf_env_typ, + wf_typ_from_wf_env_sub, + sub_weakening. + intros E F G e T Typ. + remember (G ++ E) as H. + generalize dependent G. + induction Typ; intros G EQ Ok; subst... + Case "typing_abs". + pick fresh x and apply typing_abs. + lapply (H x); [intros K | auto]. + rewrite <- concat_assoc. + apply (H0 x)... + Case "typing_tabs". + pick fresh X and apply typing_tabs. + lapply (H X); [intros K | auto]. + rewrite <- concat_assoc. + apply (H0 X)... +Qed. + + +(* ********************************************************************** *) +(** ** Strengthening (6) *) + +Lemma sub_strengthening : forall x U E F S T, + sub (F ++ [(x, bind_typ U)] ++ E) S T -> + sub (F ++ E) S T. +Proof with eauto using wf_typ_strengthening, wf_env_strengthening. + intros x U E F S T SsubT. + remember (F ++ [(x, bind_typ U)] ++ E) as E'. + generalize dependent F. + induction SsubT; intros F EQ; subst... + Case "sub_trans_tvar". + apply (sub_trans_tvar U0)... + binds_cases H... + Case "sub_all". + pick fresh X and apply sub_all... + rewrite <- concat_assoc. + apply H0... +Qed. + + +(************************************************************************ *) +(** ** Narrowing for typing (7) *) + +Lemma typing_narrowing : forall Q E F X P e T, + sub E P Q -> + typing (F ++ [(X, bind_sub Q)] ++ E) e T -> + typing (F ++ [(X, bind_sub P)] ++ E) e T. +Proof with eauto 6 using wf_env_narrowing, wf_typ_narrowing, sub_narrowing. + intros Q E F X P e T PsubQ Typ. + remember (F ++ [(X, bind_sub Q)] ++ E) as E'. + generalize dependent F. + induction Typ; intros F EQ; subst... + Case "typing_var". + binds_cases H0... + Case "typing_abs". + pick fresh y and apply typing_abs. + rewrite <- concat_assoc. + apply H0... + Case "typing_tabs". + pick fresh Y and apply typing_tabs. + rewrite <- concat_assoc. + apply H0... +Qed. + + +(************************************************************************ *) +(** ** Substitution preserves typing (8) *) + +Lemma typing_through_subst_ee : forall U E F x T e u, + typing (F ++ [(x, bind_typ U)] ++ E) e T -> + typing E u U -> + typing (F ++ E) (subst_ee x u e) T. +(* begin show *) + +(** We provide detailed comments for the following proof, mainly to + point out several useful tactics and proof techniques. + + Starting a proof with "Proof with " allows us to + specify a default tactic that should be used to solve goals. To + invoke this default tactic at the end of a proof step, we signal + the end of the step with three periods instead of a single one, + e.g., "apply typing_weakening...". *) + +Proof with simpl_env; + eauto 4 using wf_typ_strengthening, + wf_env_strengthening, + sub_strengthening. + + (** The proof proceeds by induction on the given typing derivation + for e. We use the remember tactic, along with generalize + dependent, to ensure that the goal is properly strengthened + before we use induction. *) + + intros U E F x T e u TypT TypU. + remember (F ++ [(x, bind_typ U)] ++ E) as E'. + generalize dependent F. + induction TypT; intros F EQ; subst; simpl subst_ee... + + (** The typing_var case involves a case analysis on whether the + variable is the same as the one being substituted for. *) + + Case "typing_var". + destruct (x0 == x); subst. + + (** In the case where x0=x, we first observe that hypothesis H0 + implies that T=U, since x can only be bound once in the + environment. The conclusion then follows from hypothesis TypU + and weakening. We can use the binds_get tactic, described in + the Environment library, with H0 to obtain the fact that + T=U. *) + + SCase "x0 = x". + binds_get H0. + inversion H2; subst. + + (** In order to apply typing_weakening, we need to rewrite the + environment so that it has the right shape. (We could + also prove a corollary of typing_weakening.) The + rewrite_env tactic, described in the Environment library, + is one way to perform this rewriting. *) + + rewrite_env (empty ++ F ++ E). + apply typing_weakening... + + (** In the case where x0<>x, the result follows by an exhaustive + case analysis on exactly where x0 is bound in the environment. + We perform this case analysis by using the binds_cases tactic, + described in the Environment library. *) + + SCase "x0 <> x". + binds_cases H0. + eauto using wf_env_strengthening. + eauto using wf_env_strengthening. + + (** Informally, the typing_abs case is a straightforward application + of the induction hypothesis, which is called H0 here. *) + + Case "typing_abs". + + (** We use the "pick fresh and apply" tactic to apply the rule + typing_abs without having to calculate the appropriate finite + set of atoms. *) + + pick fresh y and apply typing_abs. + + (** We cannot apply H0 directly here. The first problem is that + the induction hypothesis has (subst_ee open_ee), whereas in + the goal we have (open_ee subst_ee). The lemma + subst_ee_open_ee_var lets us swap the order of these two + operations. *) + + rewrite subst_ee_open_ee_var... + + (** The second problem is how the concatenations are associated in + the environments. In the goal, we currently have + +<< ([(y, bind_typ V)] ++ F ++ E), +>> + where concatenation associates to the right. In order to + apply the induction hypothesis, we need + +<< (([(y, bind_typ V)] ++ F) ++ E). +>> + We can use the rewrite_env tactic to perform this rewriting, + or we can rewrite directly with an appropriate lemma from the + Environment library. *) + + rewrite <- concat_assoc. + + (** Now we can apply the induction hypothesis. *) + + apply H0... + + (** The remaining cases in this proof are straightforward, given + everything that we have pointed out above. *) + + Case "typing_tabs". + pick fresh Y and apply typing_tabs. + rewrite subst_ee_open_te_var... + rewrite <- concat_assoc. + apply H0... +Qed. +(* end show *) + + +(************************************************************************ *) +(** ** Type substitution preserves typing (11) *) + +Lemma typing_through_subst_te : forall Q E F Z e T P, + typing (F ++ [(Z, bind_sub Q)] ++ E) e T -> + sub E P Q -> + typing (map (subst_tb Z P) F ++ E) (subst_te Z P e) (subst_tt Z P T). +Proof with simpl_env; + eauto 6 using wf_env_subst_tb, + wf_typ_subst_tb, + sub_through_subst_tt. + intros Q E F Z e T P Typ PsubQ. + remember (F ++ [(Z, bind_sub Q)] ++ E) as G. + generalize dependent F. + induction Typ; intros F EQ; subst; + simpl subst_te in *; simpl subst_tt in *... + Case "typing_var". + apply typing_var... + rewrite (map_subst_tb_id E Z P); + [ | auto | eapply fresh_mid_tail; eauto ]. + binds_cases H0... + Case "typing_abs". + pick fresh y and apply typing_abs. + rewrite subst_te_open_ee_var... + rewrite_env (map (subst_tb Z P) ([(y, bind_typ V)] ++ F) ++ E). + apply H0... + Case "typing_tabs". + pick fresh Y and apply typing_tabs. + rewrite subst_te_open_te_var... + rewrite subst_tt_open_tt_var... + rewrite_env (map (subst_tb Z P) ([(Y, bind_sub V)] ++ F) ++ E). + apply H0... + Case "typing_tapp". + rewrite subst_tt_open_tt... +Qed. + + +(* ********************************************************************** *) +(** * ## Preservation *) + + +(* ********************************************************************** *) +(** ** Inversion of typing (13) *) + +Lemma typing_inv_abs : forall E S1 e1 T, + typing E (exp_abs S1 e1) T -> + forall U1 U2, sub E T (typ_arrow U1 U2) -> + sub E U1 S1 + /\ exists S2, exists L, forall x, x `notin` L -> + typing ([(x, bind_typ S1)] ++ E) (open_ee e1 x) S2 /\ sub E S2 U2. +Proof with auto. + intros E S1 e1 T Typ. + remember (exp_abs S1 e1) as e. + generalize dependent e1. + generalize dependent S1. + induction Typ; intros S1 b1 EQ U1 U2 Sub; inversion EQ; subst. + Case "typing_abs". + inversion Sub; subst. + split... + exists T1. exists L... + Case "typing_sub". + auto using (sub_transitivity T). +Qed. + +Lemma typing_inv_tabs : forall E S1 e1 T, + typing E (exp_tabs S1 e1) T -> + forall U1 U2, sub E T (typ_all U1 U2) -> + sub E U1 S1 + /\ exists S2, exists L, forall X, X `notin` L -> + typing ([(X, bind_sub U1)] ++ E) (open_te e1 X) (open_tt S2 X) + /\ sub ([(X, bind_sub U1)] ++ E) (open_tt S2 X) (open_tt U2 X). +Proof with simpl_env; auto. + intros E S1 e1 T Typ. + remember (exp_tabs S1 e1) as e. + generalize dependent e1. + generalize dependent S1. + induction Typ; intros S1 e0 EQ U1 U2 Sub; inversion EQ; subst. + Case "typing_tabs". + inversion Sub; subst. + split... + exists T1. + exists (L0 `union` L). + intros Y Fr. + split... + rewrite_env (empty ++ [(Y, bind_sub U1)] ++ E). + apply (typing_narrowing S1)... + Case "typing_sub". + auto using (sub_transitivity T). +Qed. + + + +(* ********************************************************************** *) +(** ** Preservation (20) *) + +Lemma preservation : forall E e e' T, + typing E e T -> + red e e' -> + typing E e' T. +Proof with simpl_env; eauto. + intros E e e' T Typ. generalize dependent e'. + induction Typ; intros e' Red; try solve [ inversion Red; subst; eauto ]. + Case "typing_app". + inversion Red; subst... + SCase "red_abs". + destruct (typing_inv_abs _ _ _ _ Typ1 T1 T2) as [P1 [S2 [L P2]]]. + apply sub_reflexivity... + pick fresh x. + destruct (P2 x) as [? ?]... + rewrite (subst_ee_intro x)... + rewrite_env (empty ++ E). + apply (typing_through_subst_ee T). + apply (typing_sub S2)... + rewrite_env (empty ++ [(x, bind_typ T)] ++ E). + apply sub_weakening... + eauto. + Case "typing_tapp". + inversion Red; subst... + SCase "red_tabs". + destruct (typing_inv_tabs _ _ _ _ Typ T1 T2) as [P1 [S2 [L P2]]]. + apply sub_reflexivity... + pick fresh X. + destruct (P2 X) as [? ?]... + rewrite (subst_te_intro X)... + rewrite (subst_tt_intro X)... + rewrite_env (map (subst_tb X T) empty ++ E). + apply (typing_through_subst_te T1)... +Qed. + + +(* ********************************************************************** *) +(** * ## Progress *) + + +(* ********************************************************************** *) +(** ** Canonical forms (14) *) + +Lemma canonical_form_abs : forall e U1 U2, + value e -> + typing empty e (typ_arrow U1 U2) -> + exists V, exists e1, e = exp_abs V e1. +Proof. + intros e U1 U2 Val Typ. + remember empty as E. + remember (typ_arrow U1 U2) as T. + revert U1 U2 HeqT HeqE. + induction Typ; intros U1 U2 EQT EQE; subst; + try solve [ inversion Val | inversion EQT | eauto ]. + Case "typing_sub". + inversion H; subst; eauto. + inversion H0. +Qed. + +Lemma canonical_form_tabs : forall e U1 U2, + value e -> + typing empty e (typ_all U1 U2) -> + exists V, exists e1, e = exp_tabs V e1. +Proof. + intros e U1 U2 Val Typ. + remember empty as E. + remember (typ_all U1 U2) as T. + revert U1 U2 HeqT HeqT. + induction Typ; intros U1 U2 EQT EQE; subst; + try solve [ inversion Val | inversion EQT | eauto ]. + Case "typing_sub". + inversion H; subst; eauto. + inversion H0. +Qed. + + + +(* ********************************************************************** *) +(** ** Progress (16) *) + +Lemma progress : forall e T, + typing empty e T -> + value e \/ exists e', red e e'. +Proof with eauto. + intros e T Typ. + remember empty as E. generalize dependent HeqE. + assert (Typ' : typing E e T)... + induction Typ; intros EQ; subst... + Case "typing_var". + inversion H0. + Case "typing_app". + right. + destruct IHTyp1 as [Val1 | [e1' Rede1']]... + SCase "Val1". + destruct IHTyp2 as [Val2 | [e2' Rede2']]... + SSCase "Val2". + destruct (canonical_form_abs _ _ _ Val1 Typ1) as [S [e3 EQ]]. + subst. + exists (open_ee e3 e2)... + Case "typing_tapp". + right. + destruct IHTyp as [Val1 | [e1' Rede1']]... + SCase "Val1". + destruct (canonical_form_tabs _ _ _ Val1 Typ) as [S [e3 EQ]]. + subst. + exists (open_te e3 T)... + SCase "e1' Rede1'". + exists (exp_tapp e1' T)... +Qed. diff --git a/coq-Fsub/ListFacts.v b/share/popl08-tutorial-Fsub/ListFacts.v similarity index 100% rename from coq-Fsub/ListFacts.v rename to share/popl08-tutorial-Fsub/ListFacts.v diff --git a/share/popl08-tutorial-Fsub/Makefile b/share/popl08-tutorial-Fsub/Makefile new file mode 100644 index 0000000..cfe38b1 --- /dev/null +++ b/share/popl08-tutorial-Fsub/Makefile @@ -0,0 +1,999 @@ +########################################################################## +## # The Coq Proof Assistant / The Coq Development Team ## +## v # Copyright INRIA, CNRS and contributors ## +## /dev/null 2>/dev/null; echo $$?)) +STDTIME?=command time -f $(TIMEFMT) +else +ifeq (0,$(shell gtime -f "" true >/dev/null 2>/dev/null; echo $$?)) +STDTIME?=gtime -f $(TIMEFMT) +else +STDTIME?=command time +endif +endif +else +STDTIME?=command time -f $(TIMEFMT) +endif + +COQBIN?= +ifneq (,$(COQBIN)) +# add an ending / +COQBIN:=$(COQBIN)/ +endif + +# Coq binaries +COQC ?= "$(COQBIN)coqc" +COQTOP ?= "$(COQBIN)coqtop" +COQCHK ?= "$(COQBIN)coqchk" +COQNATIVE ?= "$(COQBIN)coqnative" +COQDEP ?= "$(COQBIN)coqdep" +COQDOC ?= "$(COQBIN)coqdoc" +COQPP ?= "$(COQBIN)coqpp" +COQMKFILE ?= "$(COQBIN)coq_makefile" +OCAMLLIBDEP ?= "$(COQBIN)ocamllibdep" + +# Timing scripts +COQMAKE_ONE_TIME_FILE ?= "$(COQCORELIB)/tools/make-one-time-file.py" +COQMAKE_BOTH_TIME_FILES ?= "$(COQCORELIB)/tools/make-both-time-files.py" +COQMAKE_BOTH_SINGLE_TIMING_FILES ?= "$(COQCORELIB)/tools/make-both-single-timing-files.py" +BEFORE ?= +AFTER ?= + +# OCaml binaries +CAMLC ?= "$(OCAMLFIND)" ocamlc -c +CAMLOPTC ?= "$(OCAMLFIND)" opt -c +CAMLLINK ?= "$(OCAMLFIND)" ocamlc -linkall +CAMLOPTLINK ?= "$(OCAMLFIND)" opt -linkall +CAMLDOC ?= "$(OCAMLFIND)" ocamldoc +CAMLDEP ?= "$(OCAMLFIND)" ocamldep -slash -ml-synonym .mlpack + +# DESTDIR is prepended to all installation paths +DESTDIR ?= + +# Debug builds, typically -g to OCaml, -debug to Coq. +CAMLDEBUG ?= +COQDEBUG ?= + +# Extra packages to be linked in (as in findlib -package) +CAMLPKGS ?= +FINDLIBPKGS = -package coq-core.plugins.ltac $(CAMLPKGS) + +# Option for making timing files +TIMING?= +# Option for changing sorting of timing output file +TIMING_SORT_BY ?= auto +# Option for changing the fuzz parameter on the output file +TIMING_FUZZ ?= 0 +# Option for changing whether to use real or user time for timing tables +TIMING_REAL?= +# Option for including the memory column(s) +TIMING_INCLUDE_MEM?= +# Option for sorting by the memory column +TIMING_SORT_BY_MEM?= +# Output file names for timed builds +TIME_OF_BUILD_FILE ?= time-of-build.log +TIME_OF_BUILD_BEFORE_FILE ?= time-of-build-before.log +TIME_OF_BUILD_AFTER_FILE ?= time-of-build-after.log +TIME_OF_PRETTY_BUILD_FILE ?= time-of-build-pretty.log +TIME_OF_PRETTY_BOTH_BUILD_FILE ?= time-of-build-both.log +TIME_OF_PRETTY_BUILD_EXTRA_FILES ?= - # also output to the command line + +TGTS ?= + +# Retro compatibility (DESTDIR is standard on Unix, DSTROOT is not) +ifdef DSTROOT +DESTDIR := $(DSTROOT) +endif + +# Substitution of the path by appending $(DESTDIR) if needed. +# The variable $(COQMF_WINDRIVE) can be needed for Cygwin environments. +windrive_path = $(if $(COQMF_WINDRIVE),$(subst $(COQMF_WINDRIVE),/,$(1)),$(1)) +destination_path = $(if $(DESTDIR),$(DESTDIR)/$(call windrive_path,$(1)),$(1)) + +# Installation paths of libraries and documentation. +COQLIBINSTALL ?= $(call destination_path,$(COQLIB)/user-contrib) +COQDOCINSTALL ?= $(call destination_path,$(DOCDIR)/coq/user-contrib) +COQPLUGININSTALL ?= $(call destination_path,$(COQCORELIB)/..) +COQTOPINSTALL ?= $(call destination_path,$(COQLIB)/toploop) # FIXME: Unused variable? + +# findlib files installation +FINDLIBPREINST= mkdir -p "$(COQPLUGININSTALL)/" +FINDLIBDESTDIR= -destdir "$(COQPLUGININSTALL)/" + +# we need to move out of sight $(METAFILE) otherwise findlib thinks the +# package is already installed +findlib_install = \ + $(HIDE)if [ "$(METAFILE)" ]; then \ + $(FINDLIBPREINST) && \ + mv "$(METAFILE)" "$(METAFILE).skip" ; \ + "$(OCAMLFIND)" install $(2) $(FINDLIBDESTDIR) $(FINDLIBPACKAGE) $(1); \ + rc=$$?; \ + mv "$(METAFILE).skip" "$(METAFILE)"; \ + exit $$rc; \ + fi +findlib_remove = \ + $(HIDE)if [ ! -z "$(METAFILE)" ]; then\ + "$(OCAMLFIND)" remove $(FINDLIBDESTDIR) $(FINDLIBPACKAGE); \ + fi + + +########## End of parameters ################################################## +# What follows may be relevant to you only if you need to +# extend this Makefile. If so, look for 'Extension point' here and +# put in Makefile.local double colon rules accordingly. +# E.g. to perform some work after the all target completes you can write +# +# post-all:: +# echo "All done!" +# +# in Makefile.local +# +############################################################################### + + + + +# Flags ####################################################################### +# +# We define a bunch of variables combining the parameters. +# To add additional flags to coq, coqchk or coqdoc, set the +# {COQ,COQCHK,COQDOC}EXTRAFLAGS variable to whatever you want to add. +# To overwrite the default choice and set your own flags entirely, set the +# {COQ,COQCHK,COQDOC}FLAGS variable. + +SHOW := $(if $(VERBOSE),@true "",@echo "") +HIDE := $(if $(VERBOSE),,@) + +TIMER=$(if $(TIMED), $(STDTIME), $(TIMECMD)) + +OPT?= + +# The DYNOBJ and DYNLIB variables are used by "coqdep -dyndep var" in .v.d +ifeq '$(OPT)' '-byte' +USEBYTE:=true +DYNOBJ:=.cma +DYNLIB:=.cma +else +USEBYTE:= +DYNOBJ:=.cmxs +DYNLIB:=.cmxs +endif + +# these variables are meant to be overridden if you want to add *extra* flags +COQEXTRAFLAGS?= +COQCHKEXTRAFLAGS?= +COQDOCEXTRAFLAGS?= + +# Find the last argument of the form "-native-compiler FLAG" +COQUSERNATIVEFLAG:=$(strip \ +$(subst -native-compiler-,,\ +$(lastword \ +$(filter -native-compiler-%,\ +$(subst -native-compiler ,-native-compiler-,\ +$(strip $(COQEXTRAFLAGS))))))) + +COQFILTEREDEXTRAFLAGS:=$(strip \ +$(filter-out -native-compiler-%,\ +$(subst -native-compiler ,-native-compiler-,\ +$(strip $(COQEXTRAFLAGS))))) + +COQACTUALNATIVEFLAG:=$(lastword $(COQMF_COQ_NATIVE_COMPILER_DEFAULT) $(COQMF_COQPROJECTNATIVEFLAG) $(COQUSERNATIVEFLAG)) + +ifeq '$(COQACTUALNATIVEFLAG)' 'yes' + COQNATIVEFLAG="-w" "-deprecated-native-compiler-option" "-native-compiler" "ondemand" + COQDONATIVE="yes" +else +ifeq '$(COQACTUALNATIVEFLAG)' 'ondemand' + COQNATIVEFLAG="-w" "-deprecated-native-compiler-option" "-native-compiler" "ondemand" + COQDONATIVE="no" +else + COQNATIVEFLAG="-w" "-deprecated-native-compiler-option" "-native-compiler" "no" + COQDONATIVE="no" +endif +endif + +# these flags do NOT contain the libraries, to make them easier to overwrite +COQFLAGS?=-q $(OTHERFLAGS) $(COQFILTEREDEXTRAFLAGS) $(COQNATIVEFLAG) +COQCHKFLAGS?=-silent -o $(COQCHKEXTRAFLAGS) +COQDOCFLAGS?=-interpolate -utf8 $(COQDOCEXTRAFLAGS) + +COQDOCLIBS?=$(COQLIBS_NOML) + +# The version of Coq being run and the version of coq_makefile that +# generated this makefile +COQ_VERSION:=$(shell $(COQC) --print-version | cut -d " " -f 1) +COQMAKEFILE_VERSION:=8.19.2 + +# COQ_SRC_SUBDIRS is for user-overriding, usually to add +# `user-contrib/Foo` to the includes, we keep COQCORE_SRC_SUBDIRS for +# Coq's own core libraries, which should be replaced by ocamlfind +# options at some point. +COQ_SRC_SUBDIRS?= +COQSRCLIBS?= $(foreach d,$(COQ_SRC_SUBDIRS), -I "$(COQLIB)/$(d)") + +CAMLFLAGS+=$(OCAMLLIBS) $(COQSRCLIBS) +# ocamldoc fails with unknown argument otherwise +CAMLDOCFLAGS:=$(filter-out -annot, $(filter-out -bin-annot, $(CAMLFLAGS))) +CAMLFLAGS+=$(OCAMLWARN) + +ifneq (,$(TIMING)) + ifeq (after,$(TIMING)) + TIMING_EXT=after-timing + else + ifeq (before,$(TIMING)) + TIMING_EXT=before-timing + else + TIMING_EXT=timing + endif + endif + TIMING_ARG=-time-file $<.$(TIMING_EXT) +else + TIMING_ARG= +endif + +ifneq (,$(PROFILING)) + PROFILE_ARG=-profile $<.prof.json + PROFILE_ZIP=gzip $<.prof.json +else + PROFILE_ARG= + PROFILE_ZIP=true +endif + +# Files ####################################################################### +# +# We here define a bunch of variables about the files being part of the +# Coq project in order to ease the writing of build target and build rules + +VDFILE := .Makefile.d + +ALLSRCFILES := \ + $(MLGFILES) \ + $(MLFILES) \ + $(MLPACKFILES) \ + $(MLLIBFILES) \ + $(MLIFILES) + +# helpers +vo_to_obj = $(addsuffix .o,\ + $(filter-out Warning: Error:,\ + $(shell $(COQTOP) -q -noinit -batch -quiet -print-mod-uid $(1)))) +strip_dotslash = $(patsubst ./%,%,$(1)) + +# without this we get undefined variables in the expansion for the +# targets of the [deprecated,use-mllib-or-mlpack] rule +with_undef = $(if $(filter-out undefined, $(origin $(1))),$($(1))) + +VO = vo +VOS = vos + +VOFILES = $(VFILES:.v=.$(VO)) +GLOBFILES = $(VFILES:.v=.glob) +HTMLFILES = $(VFILES:.v=.html) +GHTMLFILES = $(VFILES:.v=.g.html) +BEAUTYFILES = $(addsuffix .beautified,$(VFILES)) +TEXFILES = $(VFILES:.v=.tex) +GTEXFILES = $(VFILES:.v=.g.tex) +CMOFILES = \ + $(MLGFILES:.mlg=.cmo) \ + $(MLFILES:.ml=.cmo) \ + $(MLPACKFILES:.mlpack=.cmo) +CMXFILES = $(CMOFILES:.cmo=.cmx) +OFILES = $(CMXFILES:.cmx=.o) +CMAFILES = $(MLLIBFILES:.mllib=.cma) $(MLPACKFILES:.mlpack=.cma) +CMXAFILES = $(CMAFILES:.cma=.cmxa) +CMIFILES = \ + $(CMOFILES:.cmo=.cmi) \ + $(MLIFILES:.mli=.cmi) +# the /if/ is because old _CoqProject did not list a .ml(pack|lib) but just +# a .mlg file +CMXSFILES = \ + $(MLPACKFILES:.mlpack=.cmxs) \ + $(CMXAFILES:.cmxa=.cmxs) \ + $(if $(MLPACKFILES)$(CMXAFILES),,\ + $(MLGFILES:.mlg=.cmxs) $(MLFILES:.ml=.cmxs)) + +# files that are packed into a plugin (no extension) +PACKEDFILES = \ + $(call strip_dotslash, \ + $(foreach lib, \ + $(call strip_dotslash, \ + $(MLPACKFILES:.mlpack=_MLPACK_DEPENDENCIES)),$(call with_undef,$(lib)))) +# files that are archived into a .cma (mllib) +LIBEDFILES = \ + $(call strip_dotslash, \ + $(foreach lib, \ + $(call strip_dotslash, \ + $(MLLIBFILES:.mllib=_MLLIB_DEPENDENCIES)),$(call with_undef,$(lib)))) +CMIFILESTOINSTALL = $(filter-out $(addsuffix .cmi,$(PACKEDFILES)),$(CMIFILES)) +CMOFILESTOINSTALL = $(filter-out $(addsuffix .cmo,$(PACKEDFILES)),$(CMOFILES)) +OBJFILES = $(call vo_to_obj,$(VOFILES)) +ALLNATIVEFILES = \ + $(OBJFILES:.o=.cmi) \ + $(OBJFILES:.o=.cmx) \ + $(OBJFILES:.o=.cmxs) +FINDLIBPACKAGE=$(patsubst .%,%,$(suffix $(METAFILE))) + +# trick: wildcard filters out non-existing files, so that `install` doesn't show +# warnings and `clean` doesn't pass to rm a list of files that is too long for +# the shell. +NATIVEFILES = $(wildcard $(ALLNATIVEFILES)) +FILESTOINSTALL = \ + $(VOFILES) \ + $(VFILES) \ + $(GLOBFILES) \ + $(NATIVEFILES) \ + $(CMXSFILES) # to be removed when we remove legacy loading +FINDLIBFILESTOINSTALL = \ + $(CMIFILESTOINSTALL) +ifeq '$(HASNATDYNLINK)' 'true' +DO_NATDYNLINK = yes +FINDLIBFILESTOINSTALL += $(CMXSFILES) $(CMXAFILES) $(CMOFILESTOINSTALL:.cmo=.cmx) +else +DO_NATDYNLINK = +endif + +ALLDFILES = $(addsuffix .d,$(ALLSRCFILES)) $(VDFILE) + +# Compilation targets ######################################################### + +all: + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" pre-all + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" real-all + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" post-all +.PHONY: all + +all.timing.diff: + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" pre-all + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" real-all.timing.diff TIME_OF_PRETTY_BUILD_EXTRA_FILES="" + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" post-all +.PHONY: all.timing.diff + +ifeq (0,$(TIMING_REAL)) +TIMING_REAL_ARG := +TIMING_USER_ARG := --user +else +ifeq (1,$(TIMING_REAL)) +TIMING_REAL_ARG := --real +TIMING_USER_ARG := +else +TIMING_REAL_ARG := +TIMING_USER_ARG := +endif +endif + +ifeq (0,$(TIMING_INCLUDE_MEM)) +TIMING_INCLUDE_MEM_ARG := --no-include-mem +else +TIMING_INCLUDE_MEM_ARG := +endif + +ifeq (1,$(TIMING_SORT_BY_MEM)) +TIMING_SORT_BY_MEM_ARG := --sort-by-mem +else +TIMING_SORT_BY_MEM_ARG := +endif + +make-pretty-timed-before:: TIME_OF_BUILD_FILE=$(TIME_OF_BUILD_BEFORE_FILE) +make-pretty-timed-after:: TIME_OF_BUILD_FILE=$(TIME_OF_BUILD_AFTER_FILE) +make-pretty-timed make-pretty-timed-before make-pretty-timed-after:: + $(HIDE)rm -f pretty-timed-success.ok + $(HIDE)($(MAKE) --no-print-directory -f "$(PARENT)" $(TGTS) TIMED=1 2>&1 && touch pretty-timed-success.ok) | tee -a $(TIME_OF_BUILD_FILE) + $(HIDE)rm pretty-timed-success.ok # must not be -f; must fail if the touch failed +print-pretty-timed:: + $(HIDE)$(COQMAKE_ONE_TIME_FILE) $(TIMING_INCLUDE_MEM_ARG) $(TIMING_SORT_BY_MEM_ARG) $(TIMING_REAL_ARG) $(TIME_OF_BUILD_FILE) $(TIME_OF_PRETTY_BUILD_FILE) $(TIME_OF_PRETTY_BUILD_EXTRA_FILES) +print-pretty-timed-diff:: + $(HIDE)$(COQMAKE_BOTH_TIME_FILES) --sort-by=$(TIMING_SORT_BY) $(TIMING_INCLUDE_MEM_ARG) $(TIMING_SORT_BY_MEM_ARG) $(TIMING_REAL_ARG) $(TIME_OF_BUILD_AFTER_FILE) $(TIME_OF_BUILD_BEFORE_FILE) $(TIME_OF_PRETTY_BOTH_BUILD_FILE) $(TIME_OF_PRETTY_BUILD_EXTRA_FILES) +ifeq (,$(BEFORE)) +print-pretty-single-time-diff:: + @echo 'Error: Usage: $(MAKE) print-pretty-single-time-diff AFTER=path/to/file.v.after-timing BEFORE=path/to/file.v.before-timing' + $(HIDE)false +else +ifeq (,$(AFTER)) +print-pretty-single-time-diff:: + @echo 'Error: Usage: $(MAKE) print-pretty-single-time-diff AFTER=path/to/file.v.after-timing BEFORE=path/to/file.v.before-timing' + $(HIDE)false +else +print-pretty-single-time-diff:: + $(HIDE)$(COQMAKE_BOTH_SINGLE_TIMING_FILES) --fuzz=$(TIMING_FUZZ) --sort-by=$(TIMING_SORT_BY) $(TIMING_USER_ARG) $(AFTER) $(BEFORE) $(TIME_OF_PRETTY_BUILD_FILE) $(TIME_OF_PRETTY_BUILD_EXTRA_FILES) +endif +endif +pretty-timed: + $(HIDE)$(MAKE) --no-print-directory -f "$(PARENT)" make-pretty-timed + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" print-pretty-timed +.PHONY: pretty-timed make-pretty-timed make-pretty-timed-before make-pretty-timed-after print-pretty-timed print-pretty-timed-diff print-pretty-single-time-diff + +# Extension points for actions to be performed before/after the all target +pre-all:: + @# Extension point + $(HIDE)if [ "$(COQMAKEFILE_VERSION)" != "$(COQ_VERSION)" ]; then\ + echo "W: This Makefile was generated by Coq $(COQMAKEFILE_VERSION)";\ + echo "W: while the current Coq version is $(COQ_VERSION)";\ + fi +.PHONY: pre-all + +post-all:: + @# Extension point +.PHONY: post-all + +real-all: $(VOFILES) $(if $(USEBYTE),bytefiles,optfiles) +.PHONY: real-all + +real-all.timing.diff: $(VOFILES:.vo=.v.timing.diff) +.PHONY: real-all.timing.diff + +bytefiles: $(CMOFILES) $(CMAFILES) +.PHONY: bytefiles + +optfiles: $(if $(DO_NATDYNLINK),$(CMXSFILES)) +.PHONY: optfiles + +# FIXME, see Ralf's bugreport +# quick is deprecated, now renamed vio +vio: $(VOFILES:.vo=.vio) +.PHONY: vio +quick: vio + $(warning "'make quick' is deprecated, use 'make vio' or consider using 'vos' files") +.PHONY: quick + +vio2vo: + $(TIMER) $(COQC) $(COQDEBUG) $(COQFLAGS) $(COQLIBS) \ + -schedule-vio2vo $(J) $(VOFILES:%.vo=%.vio) +.PHONY: vio2vo + +# quick2vo is undocumented +quick2vo: + $(HIDE)make -j $(J) vio + $(HIDE)VIOFILES=$$(for vofile in $(VOFILES); do \ + viofile="$$(echo "$$vofile" | sed "s/\.vo$$/.vio/")"; \ + if [ "$$vofile" -ot "$$viofile" -o ! -e "$$vofile" ]; then printf "$$viofile "; fi; \ + done); \ + echo "VIO2VO: $$VIOFILES"; \ + if [ -n "$$VIOFILES" ]; then \ + $(TIMER) $(COQC) $(COQDEBUG) $(COQFLAGS) $(COQLIBS) -schedule-vio2vo $(J) $$VIOFILES; \ + fi +.PHONY: quick2vo + +checkproofs: + $(TIMER) $(COQC) $(COQDEBUG) $(COQFLAGS) $(COQLIBS) \ + -schedule-vio-checking $(J) $(VOFILES:%.vo=%.vio) +.PHONY: checkproofs + +vos: $(VOFILES:%.vo=%.vos) +.PHONY: vos + +vok: $(VOFILES:%.vo=%.vok) +.PHONY: vok + +validate: $(VOFILES) + $(TIMER) $(COQCHK) $(COQCHKFLAGS) $(COQLIBS_NOML) $^ +.PHONY: validate + +only: $(TGTS) +.PHONY: only + +# Documentation targets ####################################################### + +html: $(GLOBFILES) $(VFILES) + $(SHOW)'COQDOC -d html $(GAL)' + $(HIDE)mkdir -p html + $(HIDE)$(COQDOC) \ + -toc $(COQDOCFLAGS) -html $(GAL) $(COQDOCLIBS) -d html $(VFILES) + +mlihtml: $(MLIFILES:.mli=.cmi) + $(SHOW)'CAMLDOC -d $@' + $(HIDE)mkdir $@ || rm -rf $@/* + $(HIDE)$(CAMLDOC) -html \ + -d $@ -m A $(CAMLDEBUG) $(CAMLDOCFLAGS) $(MLIFILES) $(FINDLIBPKGS) + +all-mli.tex: $(MLIFILES:.mli=.cmi) + $(SHOW)'CAMLDOC -latex $@' + $(HIDE)$(CAMLDOC) -latex \ + -o $@ -m A $(CAMLDEBUG) $(CAMLDOCFLAGS) $(MLIFILES) $(FINDLIBPKGS) + +all.ps: $(VFILES) + $(SHOW)'COQDOC -ps $(GAL)' + $(HIDE)$(COQDOC) \ + -toc $(COQDOCFLAGS) -ps $(GAL) $(COQDOCLIBS) \ + -o $@ `$(COQDEP) -sort $(VFILES)` + +all.pdf: $(VFILES) + $(SHOW)'COQDOC -pdf $(GAL)' + $(HIDE)$(COQDOC) \ + -toc $(COQDOCFLAGS) -pdf $(GAL) $(COQDOCLIBS) \ + -o $@ `$(COQDEP) -sort $(VFILES)` + +# FIXME: not quite right, since the output name is different +gallinahtml: GAL=-g +gallinahtml: html + +all-gal.ps: GAL=-g +all-gal.ps: all.ps + +all-gal.pdf: GAL=-g +all-gal.pdf: all.pdf + +# ? +beautify: $(BEAUTYFILES) + for file in $^; do mv $${file%.beautified} $${file%beautified}old && mv $${file} $${file%.beautified}; done + @echo 'Do not do "make clean" until you are sure that everything went well!' + @echo 'If there were a problem, execute "for file in $$(find . -name \*.v.old -print); do mv $${file} $${file%.old}; done" in your shell/' +.PHONY: beautify + +# Installation targets ######################################################## +# +# There rules can be extended in Makefile.local +# Extensions can't assume when they run. + +# We use $(file) to avoid generating a very long command string to pass to the shell +# (cf https://coq.zulipchat.com/#narrow/stream/250632-Coq-Platform-devs-.26-users/topic/Strange.20command.20length.20limit.20on.20Linux) +# However Apple ships old make which doesn't have $(file) so we need a fallback +$(file >.hasfile,1) +HASFILE:=$(shell if [ -e .hasfile ]; then echo 1; rm .hasfile; fi) + +MKFILESTOINSTALL= $(if $(HASFILE),$(file >.filestoinstall,$(FILESTOINSTALL)),\ + $(shell rm -f .filestoinstall) \ + $(foreach x,$(FILESTOINSTALL),$(shell printf '%s\n' "$x" >> .filestoinstall))) + +# findlib needs the package to not be installed, so we remove it before +# installing it (see the call to findlib_remove) +install: META + @$(MKFILESTOINSTALL) + $(HIDE)code=0; for f in $$(cat .filestoinstall); do\ + if ! [ -f "$$f" ]; then >&2 echo $$f does not exist; code=1; fi \ + done; exit $$code + $(HIDE)for f in $$(cat .filestoinstall); do\ + df="`$(COQMKFILE) -destination-of "$$f" $(COQLIBS)`";\ + if [ "$$?" != "0" -o -z "$$df" ]; then\ + echo SKIP "$$f" since it has no logical path;\ + else\ + install -d "$(COQLIBINSTALL)/$$df" &&\ + install -m 0644 "$$f" "$(COQLIBINSTALL)/$$df" &&\ + echo INSTALL "$$f" "$(COQLIBINSTALL)/$$df";\ + fi;\ + done + $(call findlib_remove) + $(call findlib_install, META $(FINDLIBFILESTOINSTALL)) + $(HIDE)$(MAKE) install-extra -f "$(SELF)" + @rm -f .filestoinstall +install-extra:: + @# Extension point +.PHONY: install install-extra + +META: $(METAFILE) + $(HIDE)if [ "$(METAFILE)" ]; then \ + cat "$(METAFILE)" | grep -v 'directory.*=.*' > META; \ + fi + +install-byte: + $(call findlib_install, $(CMAFILES) $(CMOFILESTOINSTALL), -add) + +install-doc:: html mlihtml + @# Extension point + $(HIDE)install -d "$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/html" + $(HIDE)for i in html/*; do \ + dest="$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/$$i";\ + install -m 0644 "$$i" "$$dest";\ + echo INSTALL "$$i" "$$dest";\ + done + $(HIDE)install -d \ + "$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/mlihtml" + $(HIDE)for i in mlihtml/*; do \ + dest="$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/$$i";\ + install -m 0644 "$$i" "$$dest";\ + echo INSTALL "$$i" "$$dest";\ + done +.PHONY: install-doc + +uninstall:: + @# Extension point + @$(MKFILESTOINSTALL) + $(call findlib_remove) + $(HIDE)for f in $$(cat .filestoinstall); do \ + df="`$(COQMKFILE) -destination-of "$$f" $(COQLIBS)`" &&\ + instf="$(COQLIBINSTALL)/$$df/`basename $$f`" &&\ + rm -f "$$instf" &&\ + echo RM "$$instf" ;\ + done + $(HIDE)for f in $$(cat .filestoinstall); do \ + df="`$(COQMKFILE) -destination-of "$$f" $(COQLIBS)`" &&\ + echo RMDIR "$(COQLIBINSTALL)/$$df/" &&\ + (rmdir "$(COQLIBINSTALL)/$$df/" 2>/dev/null || true); \ + done + @rm -f .filestoinstall + +.PHONY: uninstall + +uninstall-doc:: + @# Extension point + $(SHOW)'RM $(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/html' + $(HIDE)rm -rf "$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/html" + $(SHOW)'RM $(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/mlihtml' + $(HIDE)rm -rf "$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/mlihtml" + $(HIDE) rmdir "$(COQDOCINSTALL)/$(INSTALLCOQDOCROOT)/" || true +.PHONY: uninstall-doc + +# Cleaning #################################################################### +# +# There rules can be extended in Makefile.local +# Extensions can't assume when they run. + +clean:: + @# Extension point + $(SHOW)'CLEAN' + $(HIDE)rm -f $(CMOFILES) + $(HIDE)rm -f $(CMIFILES) + $(HIDE)rm -f $(CMAFILES) + $(HIDE)rm -f $(CMXFILES) + $(HIDE)rm -f $(CMXAFILES) + $(HIDE)rm -f $(CMXSFILES) + $(HIDE)rm -f $(OFILES) + $(HIDE)rm -f $(CMXAFILES:.cmxa=.a) + $(HIDE)rm -f $(MLGFILES:.mlg=.ml) + $(HIDE)rm -f $(CMXFILES:.cmx=.cmt) + $(HIDE)rm -f $(MLIFILES:.mli=.cmti) + $(HIDE)rm -f $(ALLDFILES) + $(HIDE)rm -f $(NATIVEFILES) + $(HIDE)find . -name .coq-native -type d -empty -delete + $(HIDE)rm -f $(VOFILES) + $(HIDE)rm -f $(VOFILES:.vo=.vio) + $(HIDE)rm -f $(VOFILES:.vo=.vos) + $(HIDE)rm -f $(VOFILES:.vo=.vok) + $(HIDE)rm -f $(BEAUTYFILES) $(VFILES:=.old) + $(HIDE)rm -f all.ps all-gal.ps all.pdf all-gal.pdf all.glob all-mli.tex + $(HIDE)rm -f $(VFILES:.v=.glob) + $(HIDE)rm -f $(VFILES:.v=.tex) + $(HIDE)rm -f $(VFILES:.v=.g.tex) + $(HIDE)rm -f pretty-timed-success.ok + $(HIDE)rm -f META + $(HIDE)rm -rf html mlihtml +.PHONY: clean + +cleanall:: clean + @# Extension point + $(SHOW)'CLEAN *.aux *.timing' + $(HIDE)rm -f $(foreach f,$(VFILES:.v=),$(dir $(f)).$(notdir $(f)).aux) + $(HIDE)rm -f $(TIME_OF_BUILD_FILE) $(TIME_OF_BUILD_BEFORE_FILE) $(TIME_OF_BUILD_AFTER_FILE) $(TIME_OF_PRETTY_BUILD_FILE) $(TIME_OF_PRETTY_BOTH_BUILD_FILE) + $(HIDE)rm -f $(VOFILES:.vo=.v.timing) + $(HIDE)rm -f $(VOFILES:.vo=.v.before-timing) + $(HIDE)rm -f $(VOFILES:.vo=.v.after-timing) + $(HIDE)rm -f $(VOFILES:.vo=.v.timing.diff) + $(HIDE)rm -f .lia.cache .nia.cache +.PHONY: cleanall + +archclean:: + @# Extension point + $(SHOW)'CLEAN *.cmx *.o' + $(HIDE)rm -f $(NATIVEFILES) + $(HIDE)rm -f $(CMOFILES:%.cmo=%.cmx) +.PHONY: archclean + + +# Compilation rules ########################################################### + +$(MLIFILES:.mli=.cmi): %.cmi: %.mli + $(SHOW)'CAMLC -c $<' + $(HIDE)$(TIMER) $(CAMLC) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) $< + +$(MLGFILES:.mlg=.ml): %.ml: %.mlg + $(SHOW)'COQPP $<' + $(HIDE)$(COQPP) $< + +# Stupid hack around a deficient syntax: we cannot concatenate two expansions +$(filter %.cmo, $(MLFILES:.ml=.cmo) $(MLGFILES:.mlg=.cmo)): %.cmo: %.ml + $(SHOW)'CAMLC -c $<' + $(HIDE)$(TIMER) $(CAMLC) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) $< + +# Same hack +$(filter %.cmx, $(MLFILES:.ml=.cmx) $(MLGFILES:.mlg=.cmx)): %.cmx: %.ml + $(SHOW)'CAMLOPT -c $(FOR_PACK) $<' + $(HIDE)$(TIMER) $(CAMLOPTC) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) $(FOR_PACK) $< + + +$(MLLIBFILES:.mllib=.cmxs): %.cmxs: %.cmxa + $(SHOW)'CAMLOPT -shared -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) \ + -shared -o $@ $< + +$(MLLIBFILES:.mllib=.cma): %.cma: | %.mllib + $(SHOW)'CAMLC -a -o $@' + $(HIDE)$(TIMER) $(CAMLLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -a -o $@ $^ + +$(MLLIBFILES:.mllib=.cmxa): %.cmxa: | %.mllib + $(SHOW)'CAMLOPT -a -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -a -o $@ $^ + + +$(MLPACKFILES:.mlpack=.cmxs): %.cmxs: %.cmxa + $(SHOW)'CAMLOPT -shared -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) \ + -shared -o $@ $< + +$(MLPACKFILES:.mlpack=.cmxa): %.cmxa: %.cmx | %.mlpack + $(SHOW)'CAMLOPT -a -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -a -o $@ $< + +$(MLPACKFILES:.mlpack=.cma): %.cma: %.cmo | %.mlpack + $(SHOW)'CAMLC -a -o $@' + $(HIDE)$(TIMER) $(CAMLLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -a -o $@ $^ + +$(MLPACKFILES:.mlpack=.cmo): %.cmo: | %.mlpack + $(SHOW)'CAMLC -pack -o $@' + $(HIDE)$(TIMER) $(CAMLLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -pack -o $@ $^ + +$(MLPACKFILES:.mlpack=.cmx): %.cmx: | %.mlpack + $(SHOW)'CAMLOPT -pack -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) -pack -o $@ $^ + +# This rule is for _CoqProject with no .mllib nor .mlpack +$(filter-out $(MLLIBFILES:.mllib=.cmxs) $(MLPACKFILES:.mlpack=.cmxs) $(addsuffix .cmxs,$(PACKEDFILES)) $(addsuffix .cmxs,$(LIBEDFILES)),$(MLFILES:.ml=.cmxs) $(MLGFILES:.mlg=.cmxs)): %.cmxs: %.cmx + $(SHOW)'[deprecated,use-mllib-or-mlpack] CAMLOPT -shared -o $@' + $(HIDE)$(TIMER) $(CAMLOPTLINK) $(CAMLDEBUG) $(CAMLFLAGS) $(FINDLIBPKGS) \ + -shared -o $@ $< + +# can't make +# https://www.gnu.org/software/make/manual/make.html#Static-Pattern +# work with multiple target rules +# so use eval in a loop instead +# with grouped targets https://www.gnu.org/software/make/manual/make.html#Multiple-Targets +# if available (GNU Make >= 4.3) +ifneq (,$(filter grouped-target,$(.FEATURES))) +define globvorule= + +# take care to $$ variables using $< etc + $(1).vo $(1).glob &: $(1).v | $$(VDFILE) + $$(SHOW)COQC $(1).v + $$(HIDE)$$(TIMER) $$(COQC) $$(COQDEBUG) $$(TIMING_ARG) $$(PROFILE_ARG) $$(COQFLAGS) $$(COQLIBS) $(1).v + $$(HIDE)$$(PROFILE_ZIP) +ifeq ($(COQDONATIVE), "yes") + $$(SHOW)COQNATIVE $(1).vo + $$(HIDE)$$(call TIMER,$(1).vo.native) $$(COQNATIVE) $$(COQLIBS) $(1).vo +endif + +endef +else + +$(VOFILES): %.vo: %.v | $(VDFILE) + $(SHOW)COQC $< + $(HIDE)$(TIMER) $(COQC) $(COQDEBUG) $(TIMING_ARG) $(PROFILE_ARG) $(COQFLAGS) $(COQLIBS) $< + $(HIDE)$(PROFILE_ZIP) +ifeq ($(COQDONATIVE), "yes") + $(SHOW)COQNATIVE $@ + $(HIDE)$(call TIMER,$@.native) $(COQNATIVE) $(COQLIBS) $@ +endif + +# this is broken :( todo fix if we ever find a solution that doesn't need grouped targets +$(GLOBFILES): %.glob: %.v + $(SHOW)'COQC $< (for .glob)' + $(HIDE)$(TIMER) $(COQC) $(COQDEBUG) $(COQFLAGS) $(COQLIBS) $< + +endif + +$(foreach vfile,$(VFILES:.v=),$(eval $(call globvorule,$(vfile)))) + +$(VFILES:.v=.vio): %.vio: %.v + $(SHOW)COQC -vio $< + $(HIDE)$(TIMER) $(COQC) -vio $(COQDEBUG) $(COQFLAGS) $(COQLIBS) $< + +$(VFILES:.v=.vos): %.vos: %.v + $(SHOW)COQC -vos $< + $(HIDE)$(TIMER) $(COQC) -vos $(COQDEBUG) $(COQFLAGS) $(COQLIBS) $< + +$(VFILES:.v=.vok): %.vok: %.v + $(SHOW)COQC -vok $< + $(HIDE)$(TIMER) $(COQC) -vok $(COQDEBUG) $(COQFLAGS) $(COQLIBS) $< + +$(addsuffix .timing.diff,$(VFILES)): %.timing.diff : %.before-timing %.after-timing + $(SHOW)PYTHON TIMING-DIFF $*.{before,after}-timing + $(HIDE)$(MAKE) --no-print-directory -f "$(SELF)" print-pretty-single-time-diff BEFORE=$*.before-timing AFTER=$*.after-timing TIME_OF_PRETTY_BUILD_FILE="$@" + +$(BEAUTYFILES): %.v.beautified: %.v + $(SHOW)'BEAUTIFY $<' + $(HIDE)$(TIMER) $(COQC) $(COQDEBUG) $(COQFLAGS) $(COQLIBS) -beautify $< + +$(TEXFILES): %.tex: %.v + $(SHOW)'COQDOC -latex $<' + $(HIDE)$(COQDOC) $(COQDOCFLAGS) -latex $< -o $@ + +$(GTEXFILES): %.g.tex: %.v + $(SHOW)'COQDOC -latex -g $<' + $(HIDE)$(COQDOC) $(COQDOCFLAGS) -latex -g $< -o $@ + +$(HTMLFILES): %.html: %.v %.glob + $(SHOW)'COQDOC -html $<' + $(HIDE)$(COQDOC) $(COQDOCFLAGS) -html $< -o $@ + +$(GHTMLFILES): %.g.html: %.v %.glob + $(SHOW)'COQDOC -html -g $<' + $(HIDE)$(COQDOC) $(COQDOCFLAGS) -html -g $< -o $@ + +# Dependency files ############################################################ + +ifndef MAKECMDGOALS + -include $(ALLDFILES) +else + ifneq ($(filter-out archclean clean cleanall printenv make-pretty-timed make-pretty-timed-before make-pretty-timed-after print-pretty-timed print-pretty-timed-diff print-pretty-single-time-diff,$(MAKECMDGOALS)),) + -include $(ALLDFILES) + endif +endif + +.SECONDARY: $(ALLDFILES) + +redir_if_ok = > "$@" || ( RV=$$?; rm -f "$@"; exit $$RV ) + +GENMLFILES:=$(MLGFILES:.mlg=.ml) +$(addsuffix .d,$(ALLSRCFILES)): $(GENMLFILES) + +$(addsuffix .d,$(MLIFILES)): %.mli.d: %.mli + $(SHOW)'CAMLDEP $<' + $(HIDE)$(CAMLDEP) $(OCAMLLIBS) "$<" $(redir_if_ok) + +$(addsuffix .d,$(MLGFILES)): %.mlg.d: %.ml + $(SHOW)'CAMLDEP $<' + $(HIDE)$(CAMLDEP) $(OCAMLLIBS) "$<" $(redir_if_ok) + +$(addsuffix .d,$(MLFILES)): %.ml.d: %.ml + $(SHOW)'CAMLDEP $<' + $(HIDE)$(CAMLDEP) $(OCAMLLIBS) "$<" $(redir_if_ok) + +$(addsuffix .d,$(MLLIBFILES)): %.mllib.d: %.mllib + $(SHOW)'OCAMLLIBDEP $<' + $(HIDE)$(OCAMLLIBDEP) -c $(OCAMLLIBS) "$<" $(redir_if_ok) + +$(addsuffix .d,$(MLPACKFILES)): %.mlpack.d: %.mlpack + $(SHOW)'OCAMLLIBDEP $<' + $(HIDE)$(OCAMLLIBDEP) -c $(OCAMLLIBS) "$<" $(redir_if_ok) + +# If this makefile is created using a _CoqProject we have coqdep get +# options from it. This avoids argument length limits for pathological +# projects. Note that extra options might be on the command line. +VDFILE_FLAGS:=$(if _CoqProject,-f _CoqProject,) $(CMDLINE_COQLIBS) $(CMDLINE_VFILES) + +$(VDFILE): _CoqProject $(VFILES) + $(SHOW)'COQDEP VFILES' + $(HIDE)$(COQDEP) $(if $(strip $(METAFILE)),-m "$(METAFILE)") -vos -dyndep var $(VDFILE_FLAGS) $(redir_if_ok) + +# Misc ######################################################################## + +byte: + $(HIDE)$(MAKE) all "OPT:=-byte" -f "$(SELF)" +.PHONY: byte + +opt: + $(HIDE)$(MAKE) all "OPT:=-opt" -f "$(SELF)" +.PHONY: opt + +# This is deprecated. To extend this makefile use +# extension points and Makefile.local +printenv:: + $(warning printenv is deprecated) + $(warning write extensions in Makefile.local or include Makefile.conf) + @echo 'COQLIB = $(COQLIB)' + @echo 'COQCORELIB = $(COQCORELIB)' + @echo 'DOCDIR = $(DOCDIR)' + @echo 'OCAMLFIND = $(OCAMLFIND)' + @echo 'HASNATDYNLINK = $(HASNATDYNLINK)' + @echo 'SRC_SUBDIRS = $(SRC_SUBDIRS)' + @echo 'COQ_SRC_SUBDIRS = $(COQ_SRC_SUBDIRS)' + @echo 'COQCORE_SRC_SUBDIRS = $(COQCORE_SRC_SUBDIRS)' + @echo 'OCAMLFIND = $(OCAMLFIND)' + @echo 'PP = $(PP)' + @echo 'COQFLAGS = $(COQFLAGS)' + @echo 'COQLIB = $(COQLIBS)' + @echo 'COQLIBINSTALL = $(COQLIBINSTALL)' + @echo 'COQDOCINSTALL = $(COQDOCINSTALL)' +.PHONY: printenv + +# Generate a .merlin file. If you need to append directives to this +# file you can extend the merlin-hook target in Makefile.local +.merlin: + $(SHOW)'FILL .merlin' + $(HIDE)echo 'FLG $(COQMF_CAMLFLAGS)' > .merlin + $(HIDE)echo 'B $(COQCORELIB)' >> .merlin + $(HIDE)echo 'S $(COQCORELIB)' >> .merlin + $(HIDE)$(foreach d,$(COQCORE_SRC_SUBDIRS), \ + echo 'B $(COQCORELIB)$(d)' >> .merlin;) + $(HIDE)$(foreach d,$(COQ_SRC_SUBDIRS), \ + echo 'S $(COQLIB)$(d)' >> .merlin;) + $(HIDE)$(foreach d,$(SRC_SUBDIRS), echo 'B $(d)' >> .merlin;) + $(HIDE)$(foreach d,$(SRC_SUBDIRS), echo 'S $(d)' >> .merlin;) + $(HIDE)$(MAKE) merlin-hook -f "$(SELF)" +.PHONY: merlin + +merlin-hook:: + @# Extension point +.PHONY: merlin-hook + +# prints all variables +debug: + $(foreach v,\ + $(sort $(filter-out $(INITIAL_VARS) INITIAL_VARS,\ + $(.VARIABLES))),\ + $(info $(v) = $($(v)))) +.PHONY: debug + +.DEFAULT_GOAL := all + +# Users can create Makefile.local-late to hook into double-colon rules +# or add other needed Makefile code, using defined +# variables if necessary. +-include Makefile.local-late + +# Local Variables: +# mode: makefile-gmake +# End: diff --git a/share/popl08-tutorial-Fsub/Makefile.conf b/share/popl08-tutorial-Fsub/Makefile.conf new file mode 100644 index 0000000..720078c --- /dev/null +++ b/share/popl08-tutorial-Fsub/Makefile.conf @@ -0,0 +1,71 @@ +# This configuration file was generated by running: +# coq_makefile -f _CoqProject -o Makefile + +COQBIN?= +ifneq (,$(COQBIN)) +# add an ending / +COQBIN:=$(COQBIN)/ +endif +COQMKFILE ?= "$(COQBIN)coq_makefile" + +############################################################################### +# # +# Project files. # +# # +############################################################################### + +COQMF_CMDLINE_VFILES := +COQMF_SOURCES := $(shell $(COQMKFILE) -sources-of -f _CoqProject $(COQMF_CMDLINE_VFILES)) +COQMF_VFILES := $(filter %.v, $(COQMF_SOURCES)) +COQMF_MLIFILES := $(filter %.mli, $(COQMF_SOURCES)) +COQMF_MLFILES := $(filter %.ml, $(COQMF_SOURCES)) +COQMF_MLGFILES := $(filter %.mlg, $(COQMF_SOURCES)) +COQMF_MLPACKFILES := $(filter %.mlpack, $(COQMF_SOURCES)) +COQMF_MLLIBFILES := $(filter %.mllib, $(COQMF_SOURCES)) +COQMF_METAFILE = + +############################################################################### +# # +# Path directives (-I, -R, -Q). # +# # +############################################################################### + +COQMF_OCAMLLIBS = +COQMF_SRC_SUBDIRS = +COQMF_COQLIBS = -R . Fsub +COQMF_COQLIBS_NOML = -R . Fsub +COQMF_CMDLINE_COQLIBS = + +############################################################################### +# # +# Coq configuration. # +# # +############################################################################### + +COQMF_COQLIB=/usr/lib/coq/ +COQMF_COQCORELIB=/usr/lib/coq/../coq-core/ +COQMF_DOCDIR=/usr/share/doc/ +COQMF_OCAMLFIND=/usr/bin/ocamlfind +COQMF_CAMLFLAGS=-thread -bin-annot -strict-sequence -w -a+1..3-4+5..8-9+10..26-27+28..39-40-41-42+43-44-45+46..47-48+49..57-58+59..66-67-68+69-70 +COQMF_WARN=-warn-error +a-3 +COQMF_HASNATDYNLINK=true +COQMF_COQ_SRC_SUBDIRS=boot config lib clib kernel library engine pretyping interp gramlib parsing proofs tactics toplevel printing ide stm vernac plugins/btauto plugins/cc plugins/derive plugins/extraction plugins/firstorder plugins/funind plugins/ltac plugins/ltac2 plugins/micromega plugins/nsatz plugins/ring plugins/rtauto plugins/ssr plugins/ssrmatching plugins/syntax +COQMF_COQ_NATIVE_COMPILER_DEFAULT=no +COQMF_WINDRIVE= + +############################################################################### +# # +# Native compiler. # +# # +############################################################################### + +COQMF_COQPROJECTNATIVEFLAG = + +############################################################################### +# # +# Extra variables. # +# # +############################################################################### + +COQMF_OTHERFLAGS = +COQMF_INSTALLCOQDOCROOT = Fsub diff --git a/coq-Fsub/Metatheory.v b/share/popl08-tutorial-Fsub/Metatheory.v similarity index 100% rename from coq-Fsub/Metatheory.v rename to share/popl08-tutorial-Fsub/Metatheory.v diff --git a/coq-Fsub/_CoqProject b/share/popl08-tutorial-Fsub/_CoqProject similarity index 100% rename from coq-Fsub/_CoqProject rename to share/popl08-tutorial-Fsub/_CoqProject