From 7dd99d48514a5da256e9ac31f0b10a48b0b17a9e Mon Sep 17 00:00:00 2001 From: Isaac Date: Mon, 25 Apr 2022 17:49:22 -0700 Subject: [PATCH 1/6] first pass --- Simple Abelian Proof.pdf | Bin 0 -> 99405 bytes Simple Abelian Proof.tex | 17 +++ __pycache__/logicObjects.cpython-39.pyc | Bin 9435 -> 10928 bytes __pycache__/proof.cpython-39.pyc | Bin 22973 -> 24610 bytes gui.py | 82 +++++++++++++++ logicObjects.py | 30 ++++++ proof.py | 131 ++++++++++++++++-------- 7 files changed, 215 insertions(+), 45 deletions(-) create mode 100644 Simple Abelian Proof.pdf create mode 100644 Simple Abelian Proof.tex create mode 100644 gui.py diff --git a/Simple Abelian Proof.pdf b/Simple Abelian Proof.pdf new file mode 100644 index 0000000000000000000000000000000000000000..20ed1fee9137e4370b9bfe41cd2a24790414fd96 GIT binary patch literal 99405 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∓>U|4G`KxgH0g5?S-)B&I2xf*tn~q}Ady{$ zoO^=<-`d+2cV=)*C4-4LJ-u&_w8T||yyL0xGU(M|jn%X|fN7Cd<7YfyGsITu@LO+hmVE}%|=^3B~VO98BA*f;Mj=M2>>^!$Lt?LjWTQ<_Z`uX&ok zHwD)$eSfnrc1fsP?h9WkpF7GfupgY`DrrXzA8iHQ`}r`pheh7pTE+?nC+gJbm#NlI zHE4HDmdY&=m@OVK`OOa3i(E8)?u$w8{IsjaUo$3&Ug(_YE3*<0(#U*ujiAfO~R^B2; zI~}Lr9&v|V7PzPjs+b%F6A$CrYA2v-8I-f|PB2lKZhg@$%h}wyc{!@r}(S-z|sVSSxbO3Gj1u%pU~BioMM;m zgq_~(S|uf9hiFbtAcs7#4(HZTd^UGKR&!UVHI>%_lOlzGnQ~$W3W5IF003_s1uZ4V z9XY?fUimDg=uk!Cx{aWYN`qftykT=zyN4El%120z99kN~59;FT>N7A%n%Wdn$=x*P zA@xLlq76&m(T6B43Yi%;r<~Tg8SCwxnu9}eNnnetM4?H+=0RgudG^BeT1XrHNUBgL0T=HyB=c zSRNK07JK7zt(^G@ByzJx9r`DQ;&9snL)R8kdtkgf@Q z$??4>#Xvc=rLW7!d;pEGBlngl3Z8ri13ibU-jP=}=4NW1nH^tL^-ubR_7}SCy$Vnc zUKiE2L=~||rgd4Jb4<)q6DH)5S=}3KW>&+Cbc9H%Me1At@Za6|<8W z@#>t%#uD+$FaUbqA+)V~^PQw*RjZ@i(Uhq?)b3<e8hL`M)!1L;6Lf{^Lf7H zvHqG=5;(8P({d1$&%W0|iYVXf)AS?~$Ng8-9;io`)#0V`!oX~+1r6hKdA)Q>AGdj6Lhe~ zUzcBElx}=$oYMCC$BBxT55}=-9Qf{NzJOd+BZlI{pmo+hn^yVQf3MF*Sd=*%VTzgd zSar=m$kFjet$41?vH_B>&g-_rVa30Cj%R=dB?tVVvZOXSCT{-;06foOC> zqZpq{j@i+-D9~mjTCa2E=r_+s91F%*)n~#=gE7CjG#!B}-tP_7d=;13QQ^(lYxy+O z!4GK{t^1E+=mWg9=D#lEckCwUIjq@WoE~aOHh<}TUk~6DZ(8r)_|kDhh@qO-7EB4+ zD1~RF<|Q?Rj+D=~EC*boenrf=zY@E5X|PoPS>g!ZX~%hw2jgF+bxFl8TE7}9dt*=} zLZz~?(Y46f2)885;rP(vsx-Z&k^PMul&X19QlDDmb=0`{i0fel?4E5y&Njoqy9w`6 zA}2qUCjmRmz3Ep0w&$=y#InmO6}SHMGiZ?YPU`fhD#xpYk?WN zEvB9rp7${J)cpw`Wa0g>KUrjS*cWVx%-ZaVVkqE18HVWDc){0`3-M_Q!JCsnqRmG4^A;GH$;Y7WDD>sc=}UC#t2hG`C+&R(^@06htc4@bd9n!} zz`SIo01B>P=iBz!0-aA&;;bK-psJEb!zH@vi#~gQ0o|ZUYa$lq=WW;Mp4T`-Nm&G- z?Iz};?+-4w;DwN;!vi)}N-Z+;#RKDs(i?i{Slw zO(a!CJV!=exc5L>&Bls^%^ArfrQR;+q{#z~k)1Lrb|;5^8oE1Mt#lu}*gw#U*>+1S1&v0IYua%?uEG68jGah@=?gnq zkzQuCT6^rn-3$&RZp3G!GdA{Iv|gap(X#Wj#)Bg{3wNAa`H7|;odsOeW`&usZ+i#lfYyk|+XI0~s~dMi-67H)lQ<-1tF@dmx^&Iq#3q)Qh{4Xfi;rUQ2ivJxXXo17 z_pUuA^k5Sn%Dm_NUF$D?sGcA)G!A&_wS)Vq;FVF9(SbklK}p~yN`lB1!A z47?{}BsS`P59Dy8&vJ7O_rl)e=`3i~o7%?&-r1l;s)GyKiyN*J6&#z`-dJT5{Fc$| zAdM#&S|rw|JUV{omhMft+Js)fBKy663f_bt^lCsTm(FbE(Ghbx;bnIPTpesVM#~z^ z_J~OC9bxY0L=GRA3afGjm4=xB*?WRsxAwF3#YFt3%7}4<3?ItBbgE&0$}0>e10ekht~xcd&WDFY=e7Z+3Sh`1;zgOhK_LyfxUQ z@OSP}jPdb399=1&fajp9`fwdQcQLn$k8!v}AzG=oc6rf(8du6Gmem;mxb3fe-eW`e zM^|7_osK14SnZo?q_4cj1BTt?CDt2b)_xzV8`Ty8Imt!WFY9v5bPEm(kZkR^=;N_w zpyEW#3D(44wc2r~MX95Ldge{h@l2yfl}P<>6vm6W9mf}}B(Px+ut`w5pzfl;$l(~B zg@BGg7W`%@z)q%{2C(w|F12IdL&SLzybAi{WyR}gCdO()GX#6~i)>On;X~`5y+Ch#N$=8?RfZ2((o7M3P;il&XG<6bH#v;fue+%2?LOh8Q3GsQfXUZSr zbA7!ct@gx6*E6(EP98vBnK*xUj@fedo#@s z-VR@zeVJP#tMpgvNRa7YTg0WpN!9rKpdc+wtD%%6zr3<7_^F0+=GKeky@{Lw=qmjd zkwQ898Edx>BPsCjQ)U@W#^VW4@?`pUA?jY&r91(}xE3`{U;DKo;e>0X2#5?st?8+` zDGoR|-_7nYuBO@6XRXtCCT~ylOYYG3yl=@PCYsjX3N(c z(C7`xlWq;qXwmnEWuih%jd#NFyP8~kP;VTT4voV);^?c->Vs4@qS~w{HsEA5^6!0= zQI$&T-C7K)B7D2J4#P?L7S5C1kwMU_(0w%uS&kf3UALogX)B?8{Px&*d%y$TDw+Uf zyA;`hD2^`ec5Gbbxr+8l0@o|xQd-apVecu!Dz|S^ckk@bng7QaRux=B;3@Of$Bz^S zEO`v;mhBXXLBcjq-dyo{%5QV=Vh5=>wxZqiz((xDX7hSmVa7M`$D;6BhSQ@f55kFu zEJE8=L>@Gf$vpU_ZmQGYtq z$XAX?c9)?D8W^uQ#IZrl>2w0G+M59R%z13}H+R$+8%x$jT(BOQm;dd9=qcC9o~FQw zD!FHm@Bs|&WHNaT{=)E)r-YQ3=R@#B<%wpF;a=W#0K#Ps^ktt@q1$iki#{oRlXQ{EP3 zb2k~{kxZ6DArF{PUk2<9vQjehcBYIS7oj`T{`mn)7UT#)we_CYkcr$?xZD;$GPi) zp+f@PuS-43=?ff|;Yhxj1McBBrx56GeR7zU>RzcS{cig|()Oc0+*8Zwt~1O{gs+^d zQW0bdt)Pj>kVgf?vgCSrQzWqi!pp2t@p$`xrK6gzAHmNti z`c^WYUdb)LmM^gpt_k)K|^5(iQR0ctA{k!&ASV3r5dQFIm|wOQW^QE)Ey59zlFm zz4e3`sCJJ?fN&Kl>Zy0pf$uZAed7gQPzC-bgey6{$$%PrF7ssz z3VUjsnz{9_Tk?N`=a`3vx1BCd>QWIa6qV7omfW`bO! zh0`wX;;${o!?fOL;FS{htVUu&@`#)Z@!yuGF5_SBgv=dZh=)@PH|gS#a=i~k<)y8N zZivrTtrWF8(n4S>fPcr3<&zXDP`54mgeY{)-D4DTL~pI5XWdAOAxX1ba94=~bVPLS z?T0Qq%ft7EVV14GUTiMKUP4{Xq7o7{Hb&Kc*XA%4Ad2i7Km%LmR0@w`u`#GtetN<> z&ztRSG9b`+)u{Ajr|jB!KBK!FZII@Spxrc$1aee*^$b?}QbM2NMYLzPn%h0LE5h0` zJj%Fv5<0OtX(hjl*XUv3SY469)CN=I(F{E%7eolz)7Vh+GajK6fX5BJ!|~X-VIuz7 zhN^iC*B4kXkUfi?b&y?ekk8=KC#tH%89X!%{yfRCJJ**g13@n9_fK6Tudx**Cum)2 z$tXa4T=_~lxu>~VRf~;+u5A}?ei4;n)j|BNn4m(Xs3%gI6;Wu+O@KPeFi56Wf80WP zK!7BAOZqNp^%o~?S2sa)**w3hZdk2}wXFsdSqomYZqkJapW%^30QOxp;^7ZD$SUVd zN43T7}C?<1pc+#w<@tptB-gn2t z)wF*nYC`mAL98et$`)mJ^)86sg{Z67UA+rI^dM>wL~l_-^bjOEA&B0hiwL6guH?R- zN0O)f{(1lSy`OiLJ?Gk)IWu!+zUMpFbcIq3C6u82CzoCQ5U$@ZQU?*pij1!+*V)6ABcgEoziK6LSF6Bdk=n%HvEJ2XA z#YUQ1D*n7i^d7J5J*SFlW%UsZ>_o}Mn@}32?!d3)3!TL}Z72OgcaycYPP8zo=k|=$ zv4IaO+h{6@h4bEBb-=1klmkr3#9ZY!sZwIY$4|9#c+na$o*9aK14%mc2X^$o*3R+= z-DT?_eODU2-&xg?9plPC9z>PSi#$QjF}#lNzQaem84IwwR=X&kHJBzwlHvU3y_F`} z8i}Q7C|R4SgS=o}inT?veuD213PZh?TQyeqkqXrIdT{O6d{#5H@)i5)#qYMZUsQ*- zE`@5CQG63Gxkm^O$_&YeRWW>CH^=Et|A@*Vp|_s)0lHkHOUuwO2B%4~)@br^T`B7y zNp3%7GEKS0*fn-Y+N%^~TBuPHE2v;iKO$Sl@!;TO8Rl8jH217MrY!WN%?g}I zBo4o+mIYk6K^hn?TGkR|A1Lbm=_Ba0Q9a(Wev0({PHez|2h01O`%8MInRJ_=IDeDHYuacPO#^F@Y&y94%* z&TJ@v92le1xB5Y>ug`8SvMG+572(NGKq1p>i3?GPtN{<$}PAgpxKhXT$LmFObdgq*vE1 z|2h47z01b%6(;3F?8)u$ngqW$qy6NUqLZ(8AiEZczmZo4OwUC<_ANMZm{3%qYO&nG zUuG64yKQG-Xk_CItTdZkn|TsDx8B=RPQ15uL*Lvt1$LZ^5&oqOc&!Da`fk`BKGC?Y z-kL7W?j5zj?X{=MjlImAi5ZDJQu-Yxu|kDMLz_!c)_#0L}ksjw7h&2EgcSU1i#u+;_KlklPY zEcE!wr%*#4odm)dI-Ggzc=@wguI)W+q@rD5QSuCOmL8WX+YHboizU*0a*FHZQ7;%l zlzQhq!H7fxwQ1|!38KKlV~eoYw4zLf(Y5p`BIQl3#M_{K#pM-maSDkmtLgQRKaa0W z7x=)9?TV-*+pW{sxq`5EBIMI(y;$Nqx|MqQeXp*6QF?e@3t^p-Bp(l*OqsOVtl?X3tV%_&P#uJ_=p0S!d>6a`i9vuIxQNvqt5Bt z$@*nIpY??|GeqS?AG_te<^pj9Xq-o~?j{@CyvuMaF;N$cJr;dU-H?%9|05f|z7A3-(C z!c9o4BE;Ca>M9?~av6K_Qn75r=}gdm_)0#?=0M$s@NP=)W~o}Bvh>635CjW2@&o_+RdlQ&{WRlQbD)-?Cj zVaLnr3ggKZ$?hi=FD)wCH)N$f9VR)8I-U!eA7_s0o12#;3V8y$Z1Y0KQgm2o#DQuL z4$DUGS#-|_J?)?HzNVRuJL)XAe&4hvO z)tQ$HQS%m+lkw`e=kd|2+>ohhO1g|B>{xl}DK(1Mhv>d3-`F;$5|rUKtoQWGL~7mk z#tuaSwotUr(sO*y+Ss-JDZ1rvMviw@dp1ae6$Oq6)Vy>=Gd*5_(6N1d`-vY?GBoMN z(J7_bbx3Ole#7PbDWGYVpvS7lx`xL8g<>JQy=R4^?<8`k%4km=|uGS zVBgC6Avfo3AuPDu%P3k^fZ^;gGEmu{}MzpwxDD0F*|4;{G> zKkkl{`&>fNoh;nQg%s&$sk@fK@!V=D<1|@?v?^H#B1wF@T=DN*A|`7}^AtveDzcm@ zbtk`C!>P?)MTRZwE)%7+#8qq~9y_>4X`R1ylnoY3j||{M-9Bz%B%wQ-y7k zmgJZ1-CcnLFE_*QzwJr9+Cl}{vidTu->-p*@6yu81$x>^UIaB&H-D2Cr^ZAcN6tyz z^g=phUZ=_*(Xj&qavr;so3alj({67Y?52={$GF9f6IN-+s&??8Qv=suW&7TXj`mIG z+nV{lwxj50D71}TqN;vn0>4or@5^H$|3VobFZLW~MRs~_1Z>Wgf z)5oTWzG+J%)T0TQni!J&-4NRONpGw}I6+SRU9I8cla~vL;>aNS9{<8{%Iq24Bg!T` z?;xFav$lr7JU{bxY_LWJOg?P?wS5DzCuub~x^!7GrZ==W zQtr{LomveC7+_blvffChLp3v=F^JoIPm>Q<+lVK%#B*#)cxJa5Z2hUz`Q$C3j)c!8 z(JDs+{85U!MP?CEwl;5ax^aJVqTPB2Kt#S!y;2Ft>wtmayr$B?d`<%n6iXkH$=J&2|KdL&{K?F4HUbiA$-U&-`L*(7s(JZn;YZ) z67_j@X?zVI@=zfBU0ln1Fna{agErq&k=d=VXGi1p3w!!leEdM#UYt88;T&ULJhJs= zscrV}Ed#ZwC5aS-mu^D~-*+oiy1}tT?5|qQ&c&w-@VGPy9n{l_f4n}iY9&PLNFN>q4Th(gw>_+6X2%*_e>AEu;gFzEM`s@>5BBkAx15lE zjd_qR_HsqI>kPKSFxBVgJeZ>xJv9m?a2=E|e;vzxtth3aPS!ns)_ua=?Zm(Ft48-s z%fo|LH)48yz<65?DH+q{E=fy=AFnLFEHVdU5PtkR>q%0x+}ml`baTDBnEPuVndY}> zj;1_ZUisVacZf`1^0D{_THUcF?G|8do>sGClSagrO^k;TVwMoM>h!{GZu(L_$k`gTHNHX~!zksssA8(MK}kG+tP z=Q}-%?NiE-F7a4qnD5F;LH6KSEC&+<8xzSfW@S(6x~B%PMbt8^5U{7Z|00HSJs@MS zn0bq4D{XFf_T)`ptFwcmu%|!6WN0nyHo)_nxIgow6Qwc4d}iAoPG1Ax18>k>VUm|T zTVZ?}0%CS8j0#MQ>5D3N>DAIN^(Fh@yvvqXoq6?Hz@{K5) znec#@GgFTW#mAnG6<84h06b%Ht_xi0VI3^YVG%GJ+ctwPP&(fF3dC@+zj70nlDbk| zja3P3ew_B1)B{QNDQJxUdMiAzEN6MkC&1mMC_2jSK6IKT_P9rTZ}mZq*>xPjgqrjx zjOHLtM3SHjE*{H{Bq)n?k(JDFECX1g&gY?uFaThX=|AM2G^ zjRU#ZvMVguq(La$Kv8)Wa3Mm;0)e0)sH7Mqn4_eDe}`Xi|Nd|O?~3yGl*J|f;r|Ze{OP2Qb}zRv zGDiW>KH}2$c245r_HKatoIJcRwEH_8gm!;F_ksV-{T=?R`#bvdg8MtVpo{MBoM5!z zrvp4M+AUrCFQ<7PZtz71cx9l8y^Xyc+WFo7H<$Nw5BG~M@7$mZZT_dr`?+)d&oi{k zI}a3H_|G%$bN~CFhX4pK+JXLm>hZ4bsdvwk-dC0(!zPStEH}=|+AbTywgQpjO|s3Q zad$RbOj;T0h7ZEclk>0htxc&)hGyRStRL297dFvy7;PiT$=p`EUaN)l?Mu?$aX&fm zSwt;9TiQF(Z|vJVIK6q>^GPB(>$_~w^>?fkQ9ZlZPsAC-nZvk;RQ063y)LrI8!8~i z_&R!1uOvTK4Ro0VudR$Y@L{9hk^(a(ct}~9^AXl_{rwz8z%}FO=Z^4bvr7ywh-HIt zzWL!BYlk?*7|W8x1To}Df|uojvF4MnVQ8?Z-6K?@2^Ui*qFjHWv)%1&CUO?NZ4lQYs?j)`u40D`9EmjHGqtE3L-G(g9?fud%|I!A4&I zOdz>imq5dGfo&no-A!1=JigfiAu;_hwO|+1mPZ(}&zZ!SW*ifRF5SEvjP)3Tz;#HG z+P`#4PEEdx&Eu#EoLW%gHA*UFKH*k|-E*-L&k2|~5ORAysDa3B(F+*Z} z_i-LH-R^#n36q?vsju{v>v?#Pb=k#k$Ol;aVW>O-(P)SsB9f(U ztq>~*Qka>0U-PPkd_K4YzmsM0X)w#g>b)?T+Kk_{eNIw+@YL0owg3gCICh~bB&{0a z5?nnInduN3AKZ0jzKS!1_pv}-CFDk}S55`yBnfXp=f1&ZOxk(C+X-g8+e0B%mx5w4 z@@{rYu`fikL*J+w(cZ~L`7DUrKN8(Vy{>%WR+)O*aF%=|dpVbA@T-aw zdW&qIvHRD{VVer}vG2BVgoPh`N|)?BEWHtsxbmgZfEz^!7?Mb`Ttn#bIXiX+VagYv zu*fN`!c+Ixo6fjhbiLe8qlf44gKgS_ZC0H8EjxS#Bj1 zKsR2k`B<#S`*JtncaSWOhLd8YafTt@dELKdqob|1G~)rSFA~hKLaKF?9yE>lCsyn| zJP3{y?AwN&4bOFW1h*y|l-lwR+t#%neTq?z7^qIXPhVwOb`RH^Zes zmZv~!PreCB)OyIlGs-Fw-ZeG*QoB_;U$1N}^W9#0nkWJ&{%8XWf9;gVNZX^BY3BgE zXCA7OjCRbN?2|Av<#$CfFIt}vu4IoeRe!4krQa{LClaD{+R4ij)t>6|{qF2obbk&j zN^KH9GDp|6R0pDIlbYhV5wuu{J#WqgC@OF3lX2D&>1Ms5mP%ih*z<&AwL7 zhyF63SX{PSjgX|WQ(XlFL0u73c8?9D?yYQs=u>;C?RH&-ioFO9;jI@n_XQ(r&pan; z8*gLOujp>~@AmW+J^;>Eejy51j<_Rt-?48pki+`b9273_khbfJvsuCbC52^DokGgV zi5z4pvc+DHn$nbhIKDk*?t>0{^~rS#ewpoN?SEcS{YFD5kCdCXNY zVb+~&SI?nXD_nAI_l}dx^_LW%l-qpA7j8y-P@gEX|_gln=Wj^yu$X3s`E~-@a|6Q;jQ7~Vlqs8 z-#~oG>Iw7dZJRH(&Q_gDW826+MiiDfQO#v`<#$e-4fW?I#;lGyetw#y5fweHzBWUjY;%+5 z5W(nTT2=L>da7zojb&G}C&hqv-Lt>QAu7+ZrFkZMT4~L3Dtc~h8O}7Qy$W=1fy}-? z4$?Swo}BFodpY!Q+Oel*W_? zNr<9pC(EXVTp`A^$*?as54@GJ%3Yn7rx!PHE&HR;2(2`a9!edq+aa+o1=6vo56bQ>Nb4rbIr4yG7rb;W4IT$%sf_0e zor(F&JRZZQu*JAw3?KPhJq@ZNGljQS*W?&8r$2Tz@Y!UofHBG zaKib}bQ-*h~uLJ>LoXZ#R?vdp6C3&i8NFv=Pb)fwV+f+oCH7MA#r~(YsbJ z?j!xdp)ZnZFz+Ajm$EalH?_1gM{|2iGcyDdVP}Fs0q*ngpqaX@tr38S59olth`lL* z2L|*&Ank$nb_k%8t3A-k0*OEXc)5XQmM-Xb*iUK?;Nt~~0r;Rm2>=uflmS4wfwBM? z2&fEzaRb!=aOjWiuO>j#A6sC}&-bkYEz$pBKpWs+n_#U2Lmg8uI0i^Xw6 zF4X6*6$p$6{Br>UK(DqeZP0fKaK8L@h!q;qUg9r2uDlnW4|6@iO96TNUh75&}9BQM~k#c9sPt9D|AF}8l|b7 zp3@Jtk9URg9qjebWX0&6Pv(63^ti|ArL#`xv;&Smr0%8dY&3oo+vUw;T}hx(n(Uuu zLlwUI?(aMu|Ms%UvxhZzRkmd(O4i0zcJj3H@bBe~mB70~zw|U8`7bQ(4Su5IJF&YG zFVE}yEhTq*U-5?h!-Kb@wPkD5L%Uj*K5GX^!7p^CtaL@11;WxsQsc)LRwhZ+GD||fu6lv^dAHidLg%aN|Jo_!=a^w{)DivUe$$-{7 z+EPEVb_&?%iR-X=*cPg{*q`&=Y!=sRprc$QndaVT3tXFbd2TVokD4M0; z?lM|{^h9JGjP!jb<6`h){7cra zAU7#c+D@U`l+@%7>V3BRZaJmmlEC8P7t*(kXfv-*(DafvU>AO?#4b!G zd=@sO|E-aBto(`@fPoGU8PtR}MzjlHa_lkQ-Pm6ouG!dsa16$3P*;>sz(WyKc zgvkuNSbW-VV;aFNLGlczCh_9O?>x0b&eUU@$mMwt1laN-_lXqS8jSaq9R(vDW-Vfb zTI#hvBE<(D2L@0zMMQBo)`Vw?oUTlZ=koV%m$=e5rO!J^Qt0nYC;P-{3k@|Jyc`=w z2RpGd{cBGB1r+}}XaHJC;cV>W?tlRN01vbRLEH$1I9G|Fr>KhNU2%mAsuNX&xwDNC z@~6t=T=#*rba1jq0wCuYqz+iM{V(e@Ek?O2vl~QHOMCDidsCe?plz=_Vj=s&@3IUtL zNn(x!tJ4Lj($ZEc&lJ{naGA5oNK^h=>4)Rt?ayu#=v^TE+QsT?E{&P#XFi?|R;L@` z^v@FZveX!g3D&HFhEpTQ+atzLd$8q;wXAeT3g7H*_kX5;TYNQlWpi1=}44uOApE7aUa3wOyLNVL3+3Me&A8J{W;POHu;Ld_epzvosR^ z;PUNoPKVAKHive{xus|KG4DsdmC<)Fn2VzY`mwu^@+!2}gwPBt6DvN>>hN*ld>9e5 zCev^D+9zhFrS@2F5LF~RqHcadLt-zk=1-aY4592TjKh)_=gi-eq5hS^Zd3WGf_yKjAsgf&Vz=EB3 z+SSt+q2Q^#Zmapp)h!)!ydF6E zE55=}!_+EVKVap?q0Ojym`>4tICb$pEoN9>D@po5S7@Ibuy{Yb5e*pWnqDlC`{AF8 zf8vKCyReB18fl>H!fM`I)Q4zs>LYZ@NBh@&7=!~1Li+mELi*y+slJPQu{7@AI}TUE zX+eH4JckpGNBdEGFNx3cS$x^!t-iUcD${MzKMVD2`KpA>~i{bPgQ< z2~rfa~}X`ZuKf)RhAN6QukEsDH91Zl3>V zSW4{whm`*hDgO&0CAoQ+?@vg%I4}RXBK=R0@*e^m{RS!L4Cog~;X}tP`qz+hZectsQtLwks8!B`da4z z<$0~7q#&b)R?oN5wZwU&(z8}AYQA5vuA-I;`Y~s-7n)YTl5&#mOt$8!Iy+T+8v9Uq z^|0+Et;VcMBs_KCln9^TyS(d^=kOlZ=d4wEb(OI{XbKA)8>N!97~6PGQ|_vk5>x#} zQ%?AB?XSk9Pb-V}|<;-#ijsbksuuw*9ff(eHZOuQ6@~3R6b0GPUYDR}MA<5k?m_K3d z7WZVN{r*~+(Y4ZwXmBNh#AK+CB7Ee{!Yc+~c_4VzoXup;R8WM+bPju$8Q6`{Xo_uO z(JR;fm9>yc%{zIz)s3Y*8SJ!JBqBYHUjEE16{VxML+-xok43L`kUG8(KcR-xNz-?4 zx0X)nJz-dq-`@_MvI*&&?(V>`#-6Qgc5_WS_wK8{#Mfd z9QPKtF!hx#*#I59E&7VF+uyH2v$ zP!LZRs>np!y6@mc`>h8-dvc&;K*|5nG0nB%X#WyjFk|_0CU9iuRqJX7;VA}=!YJTR zP&r?7{Hh}PZ#?DSTaACil)r%DpDQ2UbBpXhRz4SL%3tvFpD^Vo>A65tF4p`nOyNU^ zX#4s4@5&Ts^)983!;g*?F`~~N83q*6*B!aJ$b*2a?A$Xpk_8*3uwr$ z+7c!vC$D~478N@<1nnHbUF-%jQ zeCqH~z9JJQqpLhaKkg!>-+;Hvk?qu))0tH($(;&qpe7w`o-51y_I*)~c4k0LcR^}+ zT5+da4oZ%-S)y;>W$Rqj@LBbq$RuKAVc;3)0mxx#AHCL&Hb8 zh40JAT6jG=7|b9&e?#H-k#;-<^R}sS{%ZYLvnqwc*xh*5l2(YUW?J#LU;zYd!GX5Y zf3TBMuzSn^ehX`gnBu?mQz3AxpJSa0sblap14$KZIK@`(QQ9=3DGT8BD?_B?S#zz}r{92DyJw zyQy$s9%KHfR`?_2M#Irnldq@`tk}ZObvxfkh`y@yuLhVAn2{^rq{gj=O50x%(dQWV z2A0c@*FMdNcp>x#=latIpsgA-B$LSY=|$Kh+;Ru1T0{bM49IJT^V?^o_K$E6;iT%xhA_!{89< zH7*pgRK@1fNLjsRTUA_m$`w-W>{uV?qkdvg`E66Z%}HmIXW?tf=ENZDu8_p zC+f+E%%V^qx6IAC>je+n>a0hO2CIa528$5Z5TMi9h{i&6S?>gYF}MO?OnjAu564IhMr@fJa96Cz?JnpkrY?2UuEYp*1q0y z=K+QZMM_27_}%@NFAd39%mB(n0=Tn$09rx#J8W@^-~>X;S3?kDwtG31<3kAb-LiVk zsLx!&-#7ZHi^=QnO7&`i?(oirgGL^ZL_Y4jiozcrt*xx5@L}>)%X`8^3F-1vAxO39 zmq@D6w<7cm$xzXw34>Wlj~4ka6^UK0T*xsj)CEh^7E_xPn-PJXk?lf^C(pnuYV9xj z+&Jr323Gr_GjXu;x8=*DO|l>pV_N>VbO$c|sKdlwQBcDRuT%q1BoD zURnyb=0Gsl##R%Cl9Kxl(Hvba@K22R*G^miiP`^Gi_@|YEb ze}bcg5js$+J=(_fqX@LM=l7+=#lBKT+M7C?piL&M3YPNf2yK9asTul>6U@Z};(|cX z1}+J->Ev7u%Ze8NeQIfMCy6$&09YmYAs`3@!~@|4fw@5-ZcY&NHVAYZole2t^uHxh zM;bXeAWYG!U?Uq80$pEqDQzxkXB!)1BRjkEDydsoq5$aMpH<`hSv3F;7atcG!1{L$ z*)Eu?+>i(}JP-hF#RL80g|?CLa`OVr0DsGP(ct^zQ-Iw+WIRxGKc2rX$Ux`H<6mTO z9vB=A@4w2pp)hoZ{whPWs6X;T_+aR}_ggv`^!K{Jq40A{;;-poV8|ab@So*@K+to8 z-LHAUd|>o&`$Yxp627^F<&kKX`{&8LSdFbEY^1{JTzTeA(qvId{KGxveaOfX-c|reTynz20yKr=1 z;@|HF90vYlJi}oSw7vWv?R7#Lp@SbI(RN(`P|eZTLqU@0#&C?JMk^LZWk>+PF3ey;7NHpEyz-1RrWFSY()()+ICuqUY|EAd}R`oXLiT; z8;4@}l9P})*lgvgru6;2}{`R+u6w9>t}&6(4uOO>}mQ z^+BI|#Jv=^`7*ev1g-^~tP^gyPq23Id0JT)ba~FHZM1I*eeH>|4RFu%O2dLnkEfIR z0*l3DzN92VoDMUA5F3CQr4AqzSzm{X7_eiGUB}=<#7o479A*Mm;r_gAp3y`GmYG)2 zrET=S86P`fbugVQ#yhX@W)f{7(n`cfq=QJ9NDUE@jxdF>5}zDp7}MdzRJatGw~1uD z>02R7dpK-zcYAm{X~pb}Y=dmYM|EZbaHHT%WYUS4+bq!vX!ouU(}6qi$tg%2QZ1`x zK{o3_d(2-8_v$M;o{@rCr=H`$to}d;= zP@>Fqm2KK?2Hr(&5GE)0kzBFvPEq%@A{|d6-A;KllZUI(2z<&kjZ?;AjQ8Ll-(crr z0v3GxSPzV7YeX)l;k-8H7BT|tp){Rf_axdY3vdPXcaqr+V1a(tJ)TNu@_I}%j}o{S zrQbyCOqo5E?AcMpJd4-929->-hkB7cK{g1H2ml%JF7sXs>&qqH2k%$y6S16vKdN>z z5k}+;saRoDZOP>GnUkeR0ub^CeY4K-VR6sJd@1w1A2r`1ZOe1Ya=+DReQBK%u#S;eJKIWTYS?!1$th zqMOD9&C5kwI&oxBr1Cdd+PLy;g5kUUBfbcePJDSbOy-;j8`pJ&4SqripcrSSa`~Lj z51_t)3O|UPjTI4p2`j3=iG^#Nf=lWBAwD)j0{KaU8>USgCZl|ZxKWRw+>az%*6gxU z$&ZL4e%v?{q~uy36^C6}p3T3;hwMr|hRynFe=|yyf3}g~>Nqa`MTQA-3gdA!7=*9% zNA5uq-vwVZH8u<(TTm?!j>bVQ#<C*@xx!i= zn&INKB9er?3I^Y|w6CEr1-m(sE4h`$4TY85qW4&kk3n1O%7Hf0>Lwy4q!^}RLiW>| wNDmD}P7TJXK%A1vDO8@ttChlCBEyg8!p(e`am0rxBnUEM0Z?)d2Hzpdr@@l&1Id4l_4K{h7ynWwuo^#&w zobw$%`~8%fu-VE=@Hg|v(#lcoeRYD}t{Rj~vwNFqh?%S5w{rEPN9+ruF{UZ-w=@D# zxke=qg((KbtVoIsJ8}T-mPd?Z+iP&&+6@M?Q?5r7-T?Q4ZgvJD=1VLDcg*#y4L&p9 zu+-6I&SF;avu?PeEO`#3U}AeM_?T&$kyjR(d@gyR-7T>Jc%pbhv3JcpK(|4HS^^t^ zM&KoI!HDc}Q;^fRQVIfQYf@xI;&req*Dyb@sv2dnM3XayIgUwpnR$p@!y@AmxK;M1 zCz~LiW=yL)+pC()OUa}O#w@)OMT^39i`N^|q?7ZZEF5iUH;gM~LZB>o8)bm?>NN0n z_`url?!X(~iGa@*5wZs&lWC~3oo8LJWebRqF?ij!?51aFCSFaB?F2aws^tRIs~eU) zCvQO>hvY)5=ipHF8)Ljxl!yGLa23j9!t%6>5zCG5Z&+ex=BFLOP~mzQH$y#Liq$mQxmuQ>V32v{g1ma3;9 zmP}&tUWisMi1?S_jml|Oc-#j3Rp~oP3lb{Z5sqHm>J%cUg%SDk-C&{sU~|S;KU{SB z*%s_O*DU?yJwQ+hwR_v;J}HvuLh%?!A9`#SMKbZeoa$XLST*G(Mifw}JwohHA!H26 zbzn9p+k*#HPx~}O?7$ct4jvCf-mWN>1L$!B8wL{oI{fU`T|>ksOi2g9%LgFgX$rrB z|BuBfo7indWi}J5`hUg=0$vZ!xYJEUX>!SpkA#XSdU)#{aTV+=szl=?-|>0ar0BxC z@Rsj}zZosDdg2o?L9RleN!k@ux(Da|uVp8tG&?EdWKcmc0e|{~Na?TXWN*V@afbkzLTukj*T?Bvb?(cB0QH`li06Z>LlI97F=3pB4F*0YhKZ=};3_Vbm5=A& z5e+_LDI|GTyya8)IC!&d8odsz&B4^(>g8biav~k%#m`&B>l2^%CETpNVkumo5-sjSF!D8wg&s^2Q^uIs+~h^CCl@<`=%sVC z6WsH(6I_DTdTjC)^w+oG7baVj1w4L;tGFmez95Qntzp+mRJl)HTuSm}dY_Mq%6tc| zaJ!}Gdja#|nu-f({w>i_G794tkjM#Fo0{Qa_(&ElIS#iP18fxDZ}g$MM~z|jBmCaj z{4c78raIp$GH{V~9Ctt9Iwp{4XF;*s#d5L)vPM2Q*o#vwOUo|W&Z#L*_VU> diff --git a/__pycache__/proof.cpython-39.pyc b/__pycache__/proof.cpython-39.pyc index e4c533c31b5406de45554b20bb30e7946fef338e..9a283a2a32628b7b3e0a2ab7e47e44891d4315c2 100644 GIT binary patch delta 8544 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 M+N_@d>w%#1KRGvY&Hw-a delta 7016 zcmb_hdu$uWncrFNa+gbrq8^s)$dW0)WXhIpSxy`~e#wp!D^_I1iXEGY<51kSM4KY% z*`<{bbeLAo>)He{rkAFPliEd5Kmo33Pi=vwXwhCDC{i4H_fHD!1vnHf?wTTK(LW0G z3EcO6yA9G7A)8$;+9F?I(#Bl_3_E%9qoS~nAB3;d0kt!A6} zB>St%;H8t|Gx85Mhv7x8BSa8zK^{fW5LAE#i8qUB8<6C|)dblEc7#fOTswK0DiPR;1O;Bci}FpE9nQ)-_$Y5X&A z7mF8?`;wKUcqr1X3=9lZL^0AeQ<3*2Q!!82R$LVIaYMGlJ*7|qH|DWi zGKH+g6&#LIkiK;lSS}z94cQ?6J^Iq-P8eJtr&v#xcyMSh4A?EM#h%@ddb;W~FP2Ll zow!i_-3axMXJ)P71RG)0UNO=%cX$JiSC{Qa3_AE`gk@8uL({yp(j*7PUz+Cj5!YuWa&ZI@?DPOexO5&snb)s}TI)KwlV=N(rs@uFGII<_0mluA~? zbi+WT#hsMGt~G%vb$o3kZ_Pd+e$)Kp&8A|iRrw9c48Ixbl;#9XS9GJ!+u_y8(-IuBt@|!(^Lud6egId&K9>!<>_|{< zbr#IPerEAot8cNmshN5eqC@BVNxm+at-+`9xK^*>X#w?QVwg2L5VB zJuSpn?)YJA7cR>H#y^k&ALfJN`L36ST3sbuEIsAwre&3|OZ`F>T~CbHk-lK4+OciLY+L-e|#^gNQ>0 zA7mh&D_pU-ZH?q}vtVPd!gw3)MN$(i#ul5qzx@9|Ov}0-bT)|LqcA-X1IQl`AFdm$ z9mnPvK&q8Li0yF%a(8rEk0G)}WQd>ORQx{K&J^*J4O4MbHbV`YSgiEgXq~@VKTwOTB&i#|P~@3>-gBX)Eu$S=P(3@v zeM`r2H^qKe~cQ&C6awx&B)c@}~RPcf|fJYuT5? z*)82-e$&Yv?>J4STxFe*-8&^GS`A%P=i$i@l}*6_x~Ok%W}!bd8KS4JCrqYsSRClP zqZVI@X3rqdw!r})C=-bTC@dKX`4Xved!$&yjCQ(Y+c4k@&C-mpSQ%>qmQFP z=Mg+Uu=NDMIL}}+ix4p92+vK=kbp6WL4QX;vws6q#S8s~RY&k;^6*PzndgWasiT}joJAbTUNUm%&#NgnG8ktxQI>u8?9)rXd1=vf_?W#7U z7008G*zAYi6?dN4^pg~p0-m)Lu!TvAxb=v%@R5idA|xMcrG<#bVbjcE{dPYZ^I8}z zsRj$f#{hpb#I9ZYx|TS89e%BIY_dx-e?~mNtJm5GY$(L@t5wg6NE zCUEYvsd^=DxFW@L$7v_HuF4f_)j*+QagU?*nk<{2+XH1;vh0?3#pf#vZv` z7EkQC=i`ZY`0hB1dg9>{Pl~g9`zCxDNvMX5e=9NYr|``HjZuvCzBt!FoKErK-VNfr zt0Lm)fv>7S(nUl3@xah}9pe$zfw~j-sC!fKGMy<;N(+&S=)31DWFF&uRHP5C>#nTA zq74fBr;-+=&|D#dR-U9dUlD8e_tYx!y?ZYksI4| zd%Rm-MtTJZIcEi#NbUek8;!Ct9pV;b!zGr;Q6sb(vLwW>_pcXyhnmEi1HC>)AJqOA zV))ZA-ADBzc>`r$4HqUyA(a}tdb>*enI!>1)HaEemg{ z=#FZFy+eQuL4Z^$?}=OKcJaMK?}aKIhIs36=brGgsv_X1D3gB-=H~LnVQuld!)@|= zOoWGr;qv0x@OU$xah5G57KU$xDm{i6JF*Va7EO(@(+v&7fmA-h`4M^=FFII|K>2P3 z&SI%hqonlqFt9~Y@3pbwbT0c#3EkNBY^R=ix{G90CdR zEVh;?#-lNGq?K&Ow$du%p!eq^u59F>MkpSI5%%xcV&UHBSq*ay6asjk;az1km|VJ= zNjHt+dz0lUsKbgE;9y6W8i5l52}JKu{A|OCeI78`@+O1;4^7P^QGMpWu*LcNe#Ep6 z7&^|o#Kf_Q8p(szj<+aM?+Hq)sQ9=<1=*s{2ge%HBmZ7(1y)XEi-l~yY+CiTBXBIV z(QYIS567)+BYYA}tQ#E=2Ztl#)M#SDgem~el~6xJg;T#^I9O#j<*Iy(Ri%res=QyK z9HlsL5dooF_A{44y--{D&tb@1n)v$Ye?WP3{eioubXNz7oD5udkQU_Sc(H+H9a;x% zy(^Cv8tVG=y6k>eDSY&r$BhxW{v>O~&f|Lx+#f1^-WB%oo$NL7#p9c5c}Mf?AO41_ za9vW><`t-Kwt+@+RbPX8sh2|hGt0)QRm}`T-Q$mgI!JbO&=@MF`MQoW=^QaNU*`zu zY+$y&yv@|XsUw+guzh23Y-~M?VWE>&#-LQIbcxD?UA464OI~Tt*~voDN#+Vky3(q& z-&f>GIL<*2*d?ByAxw{_qQNr>WtbC49vO>;Eecm@Y%Q4$+_aDf#jML^iufpn=pOGp zdm6{RjF1Fy*%hx+3fNLBoCb&Ud2$k8n5}3{R2gXrmXH%nhfh0v;R#W^IDTt47!sP3 zcaW`{QwNe<4F&tX!(-)!_}=I$VV}58rA#H7Y)~@}e)(yTG986V*{9C-0>(?I!3yVq zx~rguF3Y%VD(EI!Hea;M+`1R_!LTi9?NHIg&n(%`t$5m?tRtIh8GqbVFH%_K!56Jzd&5+D`xc z=z08Qob$98m|Wev4V!_zie~XvHh&V&W2eQ1$=~-kZU;Z2gi|V6yHDfcA|bgU@HFXS5LnU!C=cH```|v5%n5u z5D_b=4|fV^zKwtfRl$s%4&`U;pb)M0T+YePQ1x`;0+e%^{L@Q23+czJ;>CYG@_GV` zPug4mE>OI3=I7o8z%DU&w)?!cOh!yiX*jCqW*biB#o}O*nU2&i#s>LH$2AT79B(gP zTKvP=Z?d)hs26c@1Y1knjw*|PeKeIC!S28ox8-K>rp;dNk2l1+#}13=(Fl7>^q%Qp z&xvOq8)C1EuRS(&>~-)sI*NedY7LXF2Y4@3@wad#I+-;?8L+%QqA19Q!tU51>7*aUiWTsbx2is@#O!N zp>}AZ+QHcFzmVz|%Hx}AEvUdMgf$45pLs9BMua|u0fYkx2N8}TJc4ir;W31B2-65N z2qgp?;R?bWLKWdE!Y2?ui7+ogt;k=%=8Fjbfbc1VR}ciks|ar(+(38};qwSL5x#)X z*lB7dun%hy9lrJiHduR9H*{5Rfv>7-@J;A#@aYhDo==t6=&gD?e463YL~o9#w6x4E z4y5`AV)QUqgUn*VZLb^4V~uuV>Y@ezE8&$OD+uB0`|-v)Zykh$CfR7QF&RTXeB}QD D)`z{x diff --git a/gui.py b/gui.py new file mode 100644 index 0000000..79263ab --- /dev/null +++ b/gui.py @@ -0,0 +1,82 @@ +from tkinter import PhotoImage +from tkinter import * +from tkinter import ttk +from proof import * +from tkinter.scrolledtext import ScrolledText +import fitz + +class PDFViewer(ScrolledText): + def show(self, pdf_file): + self.delete('1.0', 'end') # clear current content + pdf = fitz.open(pdf_file) # open the PDF file + self.images = [] # for storing the page images + for page in pdf: + pix = page.get_pixmap() + pix1 = fitz.Pixmap(pix, 0) if pix.alpha else pix + photo = PhotoImage(data=pix1.tobytes('ppm')) + # insert into the text box + self.image_create('end', image=photo) + self.insert('end', '\n') + # save the image to avoid garbage collected + self.images.append(photo) + + +def enter(*args): + input = entry.get() + input = "p."+input + print(input) + try: + exec(input) + except: + messagebox.showerror('Syntax Error', 'You have either called a function that does not exist or passed a variable that is not defined - or both!') + showing.set(p.showReturn()) + entry_bar.delete(0,"end") + + +def generateLaTeX(*args): + p.writeLaTeXfile() + pdf1.show('Simple Abelian Proof.pdf') + +G = group('G','*') +abelianG = forall(['x', 'y'], G, Eq(Mult(['x', 'y']), Mult(['y','x']),G)) +p = Proof('Simple Abelian Proof', forall(['x'], G, Eq(Mult(['x', 'x']), G.elements['e'],G)), goal=abelianG) + +root = Tk() +root.title("Proof-Check") + +mainframe = ttk.Frame(root, padding="3 3 12 12") +mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) +root.columnconfigure(0, weight=1) +root.rowconfigure(0, weight=1) + +pdf1 = PDFViewer(mainframe, width=80, height=30, spacing3=5, bg='blue') +pdf1.grid(row=5, column=1, sticky='nsew') +pdf1.show('Simple Abelian Proof.pdf') + +entry = StringVar() +entry_bar = ttk.Entry(mainframe, width=50, textvariable=entry) +entry_bar.grid(column=1, row=3, sticky=(W, E)) + +showing = StringVar() +showing.set("Proof : Simple Abelian Proof\n--------------------------------") + +showProof = ttk.Label(mainframe, background="white", textvariable=showing).grid(column=1, row=2, sticky=(W, E)) + +ttk.Button(mainframe, text="Enter", command=enter).grid(column=3, row=3, sticky=W) + +ttk.Button(mainframe, text="Generate Latex", command=generateLaTeX).grid(column=3, row=4, sticky=W) + +for child in mainframe.winfo_children(): + child.grid_configure(padx=5, pady=5) + +entry_bar.focus() +root.bind("", enter) + +# creating object of ShowPdf from tkPDFViewer. +#v1 = pdf.ShowPdf().pdf_view(mainframe, pdf_location = r"Simple Abelian Proof.pdf").grid(column=1, row=4, sticky=W) + + +# Placing Pdf in my gui. +#v2.grid(column=1, row=4, sticky=W) + +root.mainloop() \ No newline at end of file diff --git a/logicObjects.py b/logicObjects.py index 65cfce8..fca5f26 100644 --- a/logicObjects.py +++ b/logicObjects.py @@ -37,6 +37,9 @@ def replace(self, var, expr): new_products.append(self.products[i]) i+=1 return Mult(new_products) + + def toLaTeX(self): + return "".join(self.elemList) class And: @@ -57,6 +60,9 @@ def __eq__(self,other): def __repr__(self): return "("+ str(self.arg1)+" and "+str(self.arg2)+ ")" + + def toLaTeX(self): + return self.arg1.toLaTeX() + r" and " + self.arg2.toLaTeX() class Or: def __init__(self, arg1, arg2): @@ -69,6 +75,9 @@ def elim(self,num,implies1,implies2): check2 = isinstance(implies2, Implies) and implies2.assum==self.arg2 if check1 and check2 and implies1.conc==implies2.conc: return implies1.conc + + def toLaTeX(self): + return self.arg1.toLaTeX() + r" or " + self.arg2.toLaTeX() class Implies: # expand a little more functionality def __init__(self, assum, conc): @@ -86,6 +95,9 @@ def __eq__(self, other): def __repr__(self): return str(self.assum) + " → " + str(self.conc) + + def toLaTeX(self): + return self.arg1.toLaTeX() + r" \implies " + self.arg2.toLaTeX() class Not: def __init__(self, arg): @@ -97,6 +109,9 @@ def elim(self, contradiction): def __repr__(self): return "Not " + str(self.arg) + + def toLaTeX(self): + return r"\lnot " + self.arg.toLaTeX() class Bottom: def elim(self, conclusion): @@ -104,6 +119,9 @@ def elim(self, conclusion): def __repr__(self): return "⊥" + + def toLaTeX(self): + return r"\bot" class In: def __init__(self, elem, grp): @@ -112,6 +130,9 @@ def __init__(self, elem, grp): def __repr__(self): return str(self.elem) + " ∈ " + str(self.group) + + def toLaTeX(self): + return str(self.elem) + r" \in " + str(self.grp) class Eq: def __init__(self,LHS,RHS,pg): @@ -132,6 +153,9 @@ def __eq__(self,other): def replace(self, var, expr): return Eq(self.LHS.replace(var,expr), self.RHS.replace(var,expr), self.group) + + def toLaTeX(self): + return str(self.LHS) + r" = " + str(self.RHS) def reduce(exp): if isinstance(exp, Eq): @@ -172,6 +196,9 @@ def __eq__(self,other): else: return False + def toLaTeX(self): + return r"\forall " + ",".join(self.arbelems) + r" \in " + str(self.group) + r"\ " + self.eq.toLaTeX() + def replace(self, replacements): # replacements = ['x','y'] - strings of the elements if len(replacements) == len(self.arbelems): @@ -211,6 +238,9 @@ def replace(self, replacements): else: print("Replacements is not the same length as the list of existential elements") + def toLaTeX(self): + return r"\exists " + ",".join(self.existelems) + r" \in " + str(self.group) + r"\ " + self.toLaTeX(self.eq) + ## Unique class - idk if we need this class uniqueElementProperty: diff --git a/proof.py b/proof.py index 7bd5772..3be9e55 100644 --- a/proof.py +++ b/proof.py @@ -4,6 +4,9 @@ from group import * from integer import * from logicObjects import * +from tkinter import messagebox +from pylatex import Document, Section, Subsection, Command, Enumerate +from pylatex.utils import italic, NoEscape class Proof: def __init__(self, label, assumption, goal=None, steps=[], justifications = [], depth=0, linestart=0): # make goal optional @@ -31,7 +34,47 @@ def undo(self): self.steps = self.steps[:-1] self.justifications = self.justifications[:-1] self.show() - + + def writeLaTeXfile(self): + doc = Document('basic') + doc.preamble.append(Command('title', self.label)) + doc.append(NoEscape(r'\maketitle')) + doc.append(italic("Proof:")) + with doc.create(Enumerate()) as enum: + doc.append(NoEscape(r"\addtocounter{enumi}{-1}")) + for i in range(len(self.steps)): + if isinstance(self.steps[i],str): + enum.add_item(NoEscape(self.steps[i]+r"\hfill")) + else: + enum.add_item(NoEscape("$"+self.steps[i].toLaTeX()+r"$\hfill")) + enum.append(" by " + str(self.justifications[i])) + doc.generate_pdf(self.label) + + def showReturn(self): + showstr = "" + if self.depth==0: + showstr += 'Proof : ' + showstr += self.label + showstr += '\n' + showstr += '--------------------------------' + showstr += '\n' + else: + showstr += 'Subproof : assume ' + showstr += str(self.assumption) + showstr += '\n' + showstr += '--------------------------------' + showstr += '\n' + i = self.linestart + while i < len(self.steps): + if isinstance(self.steps[i],Proof): + showstr += self.steps[i].show() + i+=len(self.steps[i].steps)-self.steps[i].linestart-1 + else: + linestr = "\t"*self.depth + str(i) + ': ' + str(self.steps[i]) + '\t' + str(self.justifications[i]) + '\n' + showstr += linestr + i+=1 + return showstr + def show(self): if self.depth==0: print('') @@ -102,9 +145,9 @@ def substituteRHS(self, lineNum1, lineNum2): self.justifications += [f'Replaced all instances of {ev2.LHS} with {ev2.RHS} on line {lineNum1}'] self.show() else: - print('\n'+f"The statement on line {lineNum2} is not an equality, substitutition is not possible") + messagebox.showerror('Proof Error',f"The statement on line {lineNum2} is not an equality, substitutition is not possible") else: - print('\n'+f"The statement on line {lineNum1} is not an equality, substitutition is not possible") + messagebox.showerror('Proof Error',f"The statement on line {lineNum1} is not an equality, substitutition is not possible") def substituteLHS(self, lineNum1, lineNum2): """ @@ -121,9 +164,9 @@ def substituteLHS(self, lineNum1, lineNum2): self.justifications += [f'Replaced all instances of {ev2.RHS} with {ev2.LHS} on line {lineNum1}'] self.show() else: - print('\n'+f"The statement on line {lineNum2} is not an equality, substitutition is not possible") + messagebox.showerror('Proof Error',f"The statement on line {lineNum2} is not an equality, substitutition is not possible") else: - print('\n'+f"The statement on line {lineNum1} is not an equality, substitutition is not possible") + messagebox.showerror('Proof Error',f"The statement on line {lineNum1} is not an equality, substitutition is not possible") def modus(self, lineNum1, lineNums): # lineNums because multiple assumptions may be neccessary (I think) """ @@ -143,9 +186,9 @@ def modus(self, lineNum1, lineNums): # lineNums because multiple assumptions may self.justifications += [f'Modus Ponens on {str(lineNum1)}, {str(lineNums)}'] self.show() else: - print ('\n'+f"Line {str(lineNum1)} is not an implies statement") + messagebox.showerror('Proof Error',f"Line {str(lineNum1)} is not an implies statement") else: - print('\n'+"The second argument should be a list, maybe you only have one assumption - make sure to put it into a singleton list") + messagebox.showerror('Proof Error',"The second argument should be a list, maybe you only have one assumption - make sure to put it into a singleton list") def inverseElimRHS(self,lineNum): """ @@ -170,13 +213,13 @@ def inverseElimRHS(self,lineNum): lawApplied=True break if lawApplied==False: - print ('\n'+f"Inverse laws can't be applied on line {lineNum}") + messagebox.showerror('Proof Error',f"Inverse laws can't be applied on line {lineNum}") else: self.steps += [newProducts] self.justifications += [f'Right hand side inverse elimination on line {lineNum}'] self.show() else: - print('\n'+f"It doesn't seem like line {lineNum} contains an equation") + messagebox.showerror('Proof Error',f"It doesn't seem like line {lineNum} contains an equation") def inverseElimLHS(self,lineNum): @@ -202,13 +245,13 @@ def inverseElimLHS(self,lineNum): lawApplied=True break if lawApplied==False: - print ('\n'+f"Inverse laws can't be applied on line {lineNum}") + messagebox.showerror('Proof Error',f"Inverse laws can't be applied on line {lineNum}") else: self.steps += [newProducts] self.justifications += [f'Left hand side inverse elimination on line {lineNum}'] self.show() else: - print('\n'+f"It doesn't seem like line {lineNum} contains an equation") + messagebox.showerror('Proof Error',f"It doesn't seem like line {lineNum} contains an equation") ## For all and there exists elimination @@ -225,7 +268,7 @@ def forallElim(self, lineNum, replacements): self.justifications += [f'For all elimination on line {lineNum}'] self.show() else: - print('\n'+f"There is no forall statmenent on line {lineNum}") + messagebox.showerror('Proof Error',f"There is no forall statmenent on line {lineNum}") def thereexistsElim(self, lineNum, replacements): # We can only do this once! @@ -241,7 +284,7 @@ def thereexistsElim(self, lineNum, replacements): # We can only do this once! self.justifications += [f'There exists elimination on line {lineNum}'] self.show() else: - print('\n' + f"There is no there exists statmenent on line {lineNum}") + messagebox.showerror('Proof Error', f"There is no there exists statmenent on line {lineNum}") ## Multiplication manipulation @@ -261,9 +304,9 @@ def leftMult(self, elemName, lineNum): self.justifications += ['Left multiply line {lineNum} by ' +str(elem) ] self.show() else: - print('\n' + "The element " + elemName + " is not in the " + str(eq.group)) + messagebox.showerror('Proof Error', "The element " + elemName + " is not in the " + str(eq.group)) else: - print ('\n' + f"Line {lineNum} is not an equation") + messagebox.showerror('Proof Error', f"Line {lineNum} is not an equation") def rightMult (self, elemName, lineNum): """ @@ -281,9 +324,9 @@ def rightMult (self, elemName, lineNum): self.justifications += ['Right multiply line {lineNum} by ' +str(elem) ] self.show() else: - print('\n' + "The element " + elemName + " is not in the " + str(eq.group)) + messagebox.showerror('Proof Error', "The element " + elemName + " is not in the " + str(eq.group)) else: - print ('\n' + f"Line {lineNum} is not an equation") + messagebox.showerror('Proof Error', f"Line {lineNum} is not an equation") ##power methods def breakPower(self,input): """ @@ -300,7 +343,7 @@ def breakPower(self,input): self.justifications += ['Convert power object to mult object'] self.show() else: - print ('\n'+f"Expected a power object but received type {type(input)}") + messagebox.showerror('Proof Error',f"Expected a power object but received type {type(input)}") def combinePower(self, mult): """ @@ -322,7 +365,7 @@ def combinePower(self, mult): self.justifications += ['Convert multiplications to equivalent powers'] self.show() else: - print ('\n' +f"Expected a Mult object but received type {type(mult)}") + messagebox.showerror('Proof Error',f"Expected a Mult object but received type {type(mult)}") def splitPowerAddition(self,input): """ @@ -334,7 +377,7 @@ def splitPowerAddition(self,input): exp=input.exponent l=exp.split("+") if len(l)==1: - print ('\n'+"No power addition to be split apart") + messagebox.showerror('Proof Error',"No power addition to be split apart") else: multList=[] for i in l: @@ -344,7 +387,7 @@ def splitPowerAddition(self,input): self.justifications += ["Split up power with addition in exponents"] self.show() else: - print ('\n'+f"Expected a power object but received type {type(input)}") + messagebox.showerror('Proof Error',f"Expected a power object but received type {type(input)}") def splitPowerMult(self,input): @@ -357,7 +400,7 @@ def splitPowerMult(self,input): exp=input.exponent l=exp.split("*") if len(l)==1: - print ('\n'+"No power multiplication to be split apart") + messagebox.showerror('Proof Error',"No power multiplication to be split apart") else: elem=element for i in l: @@ -367,7 +410,7 @@ def splitPowerMult(self,input): self.justifications += ["Split up power with multiplication in exponents"] self.show() else: - print ('\n'+f"Expected a power object but received type {type(input)}") + messagebox.showerror('Proof Error',f"Expected a power object but received type {type(input)}") ## Identity and equality elimination def rightSidesEq(self, lineNum1, lineNum2): @@ -383,7 +426,7 @@ def rightSidesEq(self, lineNum1, lineNum2): self.justifications += [f"Equations with same right side on lines {str(lineNum1)}, {str(lineNum2)}"] self.show() else: - print ('\n' +f"The equations on lines {str(lineNum1)}, {str(lineNum2)} do not have the same right sides") + messagebox.showerror('Proof Error',f"The equations on lines {str(lineNum1)}, {str(lineNum2)} do not have the same right sides") def leftSidesEq(self, lineNum1, lineNum2): """ @@ -398,7 +441,7 @@ def leftSidesEq(self, lineNum1, lineNum2): self.justifications += [f"Equations with same left side on lines {str(lineNum1)}, {str(lineNum2)}"] self.show() else: - print ('\n' +f"The equations on lines {str(lineNum1)}, {str(lineNum2)} do not have the same left sides") + messagebox.showerror('Proof Error',f"The equations on lines {str(lineNum1)}, {str(lineNum2)} do not have the same left sides") def identleft(self, lineNum): """ @@ -422,7 +465,7 @@ def identleft(self, lineNum): break # else we can't apply identity elimination if l1==[]: - print('\n' +"Identity can't be applied") + messagebox.showerror('Proof Error',"Identity can't be applied") else: newProduct = Mult(l1) ret = Eq(newProduct,evidence.RHS,evidence.group) @@ -430,7 +473,7 @@ def identleft(self, lineNum): self.justifications += ["identity elimination "] self.show() else: - print('\n' +f"Expected an equation on line {lineNum} but received {type(evidence)}") + messagebox.showerror('Proof Error',f"Expected an equation on line {lineNum} but received {type(evidence)}") def identright(self, lineNum): @@ -463,7 +506,7 @@ def identright(self, lineNum): self.justifications += ["identity elimination "] self.show() else: - print('\n' + f"Expected an equation on line {lineNum} but received {type(evidence)}") + messagebox.showerror('Proof Error', f"Expected an equation on line {lineNum} but received {type(evidence)}") @@ -479,7 +522,7 @@ def introReflexive(self,eq): self.justifications += ["reflexive equality"] self.show() else: - print ('\n' + "This is not reflexive") + messagebox.showerror('Proof Error', "This is not reflexive") def reduceLogic(self, lineNum): """ @@ -492,7 +535,7 @@ def reduceLogic(self, lineNum): self.justifications += ["logic reduction"] self.show() else: - print ('\n' + "This is not a logic statement") + messagebox.showerror('Proof Error', "This is not a logic statement") def introCases(self, case): """ @@ -545,7 +588,7 @@ def introElement(self,G, name): :param name: the name of the new element """ if G.contains(name): - print('\n' + f"{name} is already in {G}") + messagebox.showerror('Proof Error', f"{name} is already in {G}") else: self.env[name] = G.newElement(name) self.steps += [In(name, G)] @@ -566,11 +609,9 @@ def forAllIntroduction(self, equationLine, vars, elemIntroLines): v = vars[i] l = elemIntroLines[i] if self.steps[l].elem!=vars[i]: - print('\n') - print("Line", l, "does not introduce variable", v) + messagebox.showerror('Proof Error', f'Line {l} does not introduce variable {v}') elif self.steps[l].group!=G: - print('\n') - print("Element", v, "is not in group", G) + messagebox.showerror('Proof Error', f'Element {v} is not in group {G}') else: #If you make it here, this is a valid for all intro self.steps+=[forall(vars,G,evidence)] @@ -591,9 +632,9 @@ def closure(self,G,a,b): self.show() else: if not G.contains(a): - print('\n'+f"{a} is not in {G}") + messagebox.showerror('Proof Error',f"{a} is not in {G}") else: - print('\n'+f"{b} is not in {G}") + messagebox.showerror('Proof Error',f"{b} is not in {G}") def cancelRight(self, lineNum, mult): ''' @@ -611,9 +652,9 @@ def cancelRight(self, lineNum, mult): self.justifications += [f"Right side cancellation of {mult} on line {lineNum}"] self.show() else: - print('\n'+f"It seems like the right hand sides on line {lineNum} are not equal to {mult}") + messagebox.showerror('Proof Error',f"It seems like the right hand sides on line {lineNum} are not equal to {mult}") else: - print('\n'+f"It doesn't seem like line {lineNum} contains an equation") + messagebox.showerror('Proof Error',f"It doesn't seem like line {lineNum} contains an equation") def cancelLeft(self, lineNum, mult): ''' @@ -631,9 +672,9 @@ def cancelLeft(self, lineNum, mult): self.justifications += [f"Right side cancellation of {mult} on line {lineNum}"] self.show() else: - print('\n'+f"It seems like the left hand sides on line {lineNum} are not equal to {mult}") + messagebox.showerror('Proof Error',f"It seems like the left hand sides on line {lineNum} are not equal to {mult}") else: - print('\n'+f"It doesn't seem like line {lineNum} contains an equation") + messagebox.showerror('Proof Error',f"It doesn't seem like line {lineNum} contains an equation") def switchSidesOfEqual(self, lineNum): ''' @@ -648,7 +689,7 @@ def switchSidesOfEqual(self, lineNum): self.justifications += [f"Switched sides of line {lineNum}"] self.show() else: - print('\n'+f"Hmm, it doesn't look like line {lineNum} isn't an equality") + messagebox.showerror('Proof Error',f"Hmm, it doesn't look like line {lineNum} isn't an equality") def notElim(self, lineNum1, lineNum2): ''' @@ -663,7 +704,7 @@ def notElim(self, lineNum1, lineNum2): self.justifications += [f'Contradiction from lines {lineNum1} and {lineNum2}'] self.show() else: - print('\n'+f"The statement on line {lineNum1} isn't a Not statement") + messagebox.showerror('Proof Error',f"The statement on line {lineNum1} isn't a Not statement") def impliesIntroduction(self, lineNumsAssums, lineNumConc): # needs work, a lot of it ''' @@ -695,7 +736,7 @@ def andElim(self, lineNum, n): self.justifications += ["And elimination"] self.show() else: - print('\n'+"You must choose argument 1 or 2") + messagebox.showerror('Proof Error',"You must choose argument 1 or 2") else: - print('\n'+f"The statement on line {lineNum} isn't an And statement") + messagebox.showerror('Proof Error',f"The statement on line {lineNum} isn't an And statement") \ No newline at end of file From d5e1804f35516dd79f1883a344133da87d02c785 Mon Sep 17 00:00:00 2001 From: Isaac Date: Mon, 25 Apr 2022 18:38:25 -0700 Subject: [PATCH 2/6] suggested autocomplete --- gui.py | 75 +++++++++++++++++++++++++++++++++++++++++++++- unique inverses.py | 4 ++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/gui.py b/gui.py index 79263ab..0d93186 100644 --- a/gui.py +++ b/gui.py @@ -4,6 +4,16 @@ from proof import * from tkinter.scrolledtext import ScrolledText import fitz +from ttkwidgets.autocomplete import AutocompleteCombobox + + +proof_methods = ['MultElem', 'accessAssumption', 'andElim', 'breakPower', 'cancelLeft', +'cancelRight', 'closure', 'combinePower', 'concludeSubproof', 'forAllIntroduction', 'forallElim', +'identleft', 'identright', 'impliesIntroduction', 'introAssumption', 'introCases', 'introElement', +'introGroup', 'introReflexive', 'introSubproof', 'inverseElimLHS', 'inverseElimRHS', 'leftMult', +'leftSidesEq', 'modus', 'notElim', 'qed', 'reduceLogic', 'rightMult', 'rightSidesEq', 'show', +'showReturn', 'splitPowerAddition', 'splitPowerMult', 'substituteLHS', 'substituteRHS', +'switchSidesOfEqual', 'thereexistsElim', 'undo', 'writeLaTeXfile'] class PDFViewer(ScrolledText): def show(self, pdf_file): @@ -53,9 +63,69 @@ def generateLaTeX(*args): pdf1.grid(row=5, column=1, sticky='nsew') pdf1.show('Simple Abelian Proof.pdf') + +def match_string(): + hits = [] + got = entry_bar.get() + for item in proof_methods: + if item.startswith(got): + hits.append(item) + return hits + +def match_string_del(): + hits = [] + got = entry_bar.get()[:-1] + for item in proof_methods: + if item.startswith(got): + hits.append(item) + return hits + +def check_empty(event): + if len(entry_bar.get()) == 1: + suggestions.set("") + else: + hits = match_string_del() + show_hit(hits) + +def get_typed(event): + if len(event.keysym) == 1: + hits = match_string() + show_hit(hits) + +def show_hit(lst): + suggestions.set(lst) + if len(lst) == 1: + entry.set(lst[0]) + detect_pressed.filled = True + entry_bar.icursor(END) + +def detect_pressed(event): + key = event.keysym + if len(key) == 1 and detect_pressed.filled is True: + pos = entry_bar.index(INSERT) + entry_bar.delete(pos, END) + +detect_pressed.filled = False + + entry = StringVar() -entry_bar = ttk.Entry(mainframe, width=50, textvariable=entry) +entry_bar = Entry( + mainframe, + width = 50, + bg='black', + insertbackground='white', + fg='white', + textvariable=entry) entry_bar.grid(column=1, row=3, sticky=(W, E)) +entry_bar.focus_set() +entry_bar.bind('', get_typed) +entry_bar.bind('', detect_pressed) +entry_bar.bind('', check_empty) + + + +#entry_bar = AutocompleteCombobox(mainframe, width=50, textvariable=entry, completevalues = proof_methods) + showing = StringVar() showing.set("Proof : Simple Abelian Proof\n--------------------------------") @@ -66,6 +136,9 @@ def generateLaTeX(*args): ttk.Button(mainframe, text="Generate Latex", command=generateLaTeX).grid(column=3, row=4, sticky=W) +suggestions = StringVar() +showSuggestions = ttk.Label(mainframe, width = 50, background="white", textvariable=suggestions).grid(column=1, row=4, sticky=(W, E)) + for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) diff --git a/unique inverses.py b/unique inverses.py index 005533e..56e31e2 100644 --- a/unique inverses.py +++ b/unique inverses.py @@ -5,7 +5,7 @@ from integer import * from logicObjects import * - +''' G = group('G','*') inversePropertyOne = Eq( Mult(['a','c']) , Mult([G.identity_identifier]) , G) inversePropertyTwo = Eq( Mult(['a','d']) , Mult([G.identity_identifier]) , G) @@ -24,3 +24,5 @@ p2.switchSidesOfEqual(8) p.concludeSubproof(9) p.qed(10) +''' +print(dir(Proof)) From 55e03159395ebb7d194917493202991ba75ae6b3 Mon Sep 17 00:00:00 2001 From: Isaac Date: Tue, 26 Apr 2022 09:26:32 -0700 Subject: [PATCH 3/6] group tolatex --- __pycache__/group.cpython-39.pyc | Bin 2743 -> 2859 bytes group.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/__pycache__/group.cpython-39.pyc b/__pycache__/group.cpython-39.pyc index bc3dd3fc828b664eeaf0575f3e073c8909516c14..e2a172cb03a186a0003a5ce74412d8008e0eae34 100644 GIT binary patch delta 338 zcmdlkx>}4kk(ZZ?0SLayWF*B+ zGOpar%xuHRDg)GTYqJZB6BDD#=61GFMqX{8h$d5!5RfX;o&1vhwvY-)gc%~D0}@u7 ze2t@pQFU@Or+IxcBTxheKx`0p2I68iAW_4R#SqL;#0_K?NrDI|5FrXD#DJ_@>?Qd= zi6N;Gu0T#P6OdqFtl~{C$}cU@gUVN!z;8J8%nykg8%*4Sw I*_SH|0G~cWXaE2J delta 225 zcmZ22wq2Ark(ZZ?0SM&o#U?3E0E2~GaU zF1%ThS&flZ8mK;Mvk!|C6Qk1Rezs6XUQM8gCR33RkSfv!D!eVE1QKC}h-iU?RY3YD zf8;1+R0gxkI8|6R8T~YcC$n&w*y@3l@PY^)5FrjCq(FoWh)@6#svtrGMCgDBT@axU cA`B+~ Date: Tue, 26 Apr 2022 10:25:32 -0700 Subject: [PATCH 4/6] undo button --- gui.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gui.py b/gui.py index 0d93186..64f895b 100644 --- a/gui.py +++ b/gui.py @@ -1,6 +1,7 @@ from tkinter import PhotoImage from tkinter import * from tkinter import ttk +from turtle import undo from proof import * from tkinter.scrolledtext import ScrolledText import fitz @@ -122,6 +123,9 @@ def detect_pressed(event): entry_bar.bind('', detect_pressed) entry_bar.bind('', check_empty) +def undo(*args): + p.undo() + showing.set(p.showReturn()) #entry_bar = AutocompleteCombobox(mainframe, width=50, textvariable=entry, completevalues = proof_methods) @@ -134,6 +138,8 @@ def detect_pressed(event): ttk.Button(mainframe, text="Enter", command=enter).grid(column=3, row=3, sticky=W) +ttk.Button(mainframe, text="Undo", command=undo).grid(column=3, row=2, sticky=W) + ttk.Button(mainframe, text="Generate Latex", command=generateLaTeX).grid(column=3, row=4, sticky=W) suggestions = StringVar() From 5b97a16113ee6f5d68268e6c1caac37b86e9fd71 Mon Sep 17 00:00:00 2001 From: Isaac Date: Fri, 13 May 2022 20:40:59 -0700 Subject: [PATCH 5/6] changes --- __pycache__/logicObjects.cpython-39.pyc | Bin 10928 -> 10916 bytes gui.py | 2 +- logicObjects.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__pycache__/logicObjects.cpython-39.pyc b/__pycache__/logicObjects.cpython-39.pyc index bb978aed074a0612476a7c4ec0ed30b2e725cfcc..74f4fb559e721d9de4496a273a359fe7212a23e7 100644 GIT binary patch delta 792 zcmYk4&ubG=5XXIq-EQ12CbGJlX5;Qw+jLcgf?foRM%!vlR@){tDJil`l3Gnn@~TBC zh=txf^e`7eBo@4g7fbNs!E5~s1mn$vN5PBG3gXQ6M-q4+_I+o*^Ja#8$iB_Wt}Gup zgumh3J#TGO{-UsV@Ksq2@GIbk^w#R}qfEYzaXyA<2kHyJWCb=)c*3rVSsIL}FWEIn zi#q&N%i$!Y`_X`Jgo3srOwi{IstMcLEK9;vR7EaEe;`x+88!(U{Rw14$bl6r!y8kB zW^7$blW~;b_-{?=O({j!2q6uBb(1-u$3L1^QP>F-Ok3cFA0r$i?Alwu<6#!|>t#sI z5*&ya18fE^7_XyLwuNVjHX<^yM+}ORc$laBrjlk}aL95SHq2LS8ZKKWrFjy%x_f5T z*nI1kWiyrs?bP@4l+X^kl?v~AlT2ZPzo40e8gpQsZl0Z`I}O8gi2Z5&mpao}6sL{o z&^tK5Zo;UbMGGi?!_z%LQ0(Ic93T!)2G`g)_O605l#h6r_lI(+2a$0Pa}-z}J_nzN zwuB^#IQNT$ftL4)7_N9L@jO-~xsOmp{KK z!)x^tfArMu>|2IE)Fiq5KM-w;djuMWH*ke2tem;{AG1iW;s5{u delta 798 zcmYjPOK%cU6!vyxa&Z_112U9>8L&vlSJH(h)>uJBZ77ZQp{=cpv7x4Qr1TQq7^Bv1 z+Kr176E}v9OBX6}qlsI)bz@??^9R_taiNLvoGX+eIbZJizVl{YO}?4bU0vU^3x9*B zZ{J#Zt8YY^17D+0_Bx8#kF+>La2DL4*}50o$JF!WUx4)k4?9mcXh1Ihf}Mj;@s)6q zbQ#q1Kk|z4K)p!MOYp^LBuHOFYfx9tcz`RMb43*4X5u?5LZNqp4a4)^JmRuC1+nBj ztH94(93c5j8=*o&1Qi^~fRfqN%H&1}Mqt~tF*=-jZx@jG-7{-Ds<5O+AUA5K*CH8E z)7xQLa-7r&f(itzEE|J<>t%u}x6u5vYJ9gS%gIjK(`toMM&)>~?NxRa1~O@FmPp@_ zBD3V<(s(Ab#j^@yQxH11b)3RC71#5GZwe|ACXiPg+o?DWvA*V!YvdOQt|N3-lzqD^ zW=N+qneeAC%Pzx^Y9wZm{D$UVN#P+egDa)L%dN5!Zc~rA81swbs6S`IMLi0O{YT;5 zq0g%PlgscZZ((>dpTwJg%s) Date: Wed, 21 Sep 2022 13:35:47 -0700 Subject: [PATCH 6/6] Added readme, fixed latex button --- README.md | 27 ++++++++++++++++++++++++++- proof.py | 3 ++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d31569..392d39e 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# global-environment \ No newline at end of file +# Automated Proof Checker + +## Set up + +1. Clone the repository using `git clone` +2. Install packages using preferred installer - need to fix, create pip requirements file + +## Codebase + +The codebase we have designed seperates the elements of abstract algebra into different environments to make writing proofs a seamless experience. The main files are `proof.py,group.py,element.py,` and `logicObjects.py`. The names are pretty self explanatory, but to learn more about how each of the files work poke around some of the `__init__` calls and member functions of those files to see how they interact together. + +## Usage + +There are two options to use our proof-checker, but we **highly** recommend using the first option. + ++ Using our graphical user interface! + 1. Run `python gui.py` to open the interface + 2. The **Enter** button is used to enter new steps. As you type in the black text box the possible functions yoiu could call will appear below so you never make spelling errors! Warnings will appear if you attempt a step that is not valid. + 3. The **Generate Latex** will take the proof, convert it to a latex file and display the corresponding pdf inside of the GUI in real time! + 4. The **Undo** button deletes the last step you did - be careful to only use this when you need it! ++ Using our raw language in a python file + 1. Open a new file called `my_proof_name_here.py`, with a descriptive name for your proof + 2. Create a new proof object using the `Proof` function from `proof.py` + 3. Enter the steps of your proof using the functions in `proof.py` + 4. Run the command `python my_proof_name_here.py` to see the proof steps in the console. + diff --git a/proof.py b/proof.py index 3be9e55..5a26adb 100644 --- a/proof.py +++ b/proof.py @@ -36,7 +36,7 @@ def undo(self): self.show() def writeLaTeXfile(self): - doc = Document('basic') + doc = Document(page_numbers=False) doc.preamble.append(Command('title', self.label)) doc.append(NoEscape(r'\maketitle')) doc.append(italic("Proof:")) @@ -48,6 +48,7 @@ def writeLaTeXfile(self): else: enum.add_item(NoEscape("$"+self.steps[i].toLaTeX()+r"$\hfill")) enum.append(" by " + str(self.justifications[i])) + doc.generate_tex(self.label) doc.generate_pdf(self.label) def showReturn(self):