Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Pygments / examplefiles / output / example.thy
Size: Mime:
€]q(cpygments.token
_TokenType
qXCommentq…q…qq}q(Xsubtypesqcbuiltins
set
q]q	(hhXPreprocq
†q…qq
}q(hh]q…qRqXparentqhubhhXMultiq†q…qq}q(hh]q…qRqhhubhhXHashbangq†q…qq}q(hh]q …q!Rq"hhubhhXSingleq#†q$…q%q&}q'(hh]q(…q)Rq*hhubhhX
SingleLineq+†q,…q-q.}q/(hh]q0…q1Rq2hhubhhXDocq3†q4…q5q6}q7(hh]q8…q9Rq:hhubhhX	Directiveq;†q<…q=q>}q?(hh]q@…qARqBhhubhhX	MultilineqC†qD…qEqF}qG(hh]qH…qIRqJhhubhhX
SinglelineqK†qL…qMqN}qO(hh]qP…qQRqRhhubhhXPreprocFileqS†qT…qUqV}qW(hh]qX…qYRqZhhubhhXSpecialq[†q\…q]q^}q_(hh]q`…qaRqbhhube…qcRqdhh)…qeqf}qg(hh]qh(hXEscapeqi…qj…qkql}qm(hh]qn…qoRqphhfubhXOperatorqq…qr…qsqt}qu(hh]qv(hhqXDBSqw†qx…qyqz}q{(hh]q|…q}Rq~hhtubhhqXWordq†q€…qq‚}qƒ(hh]q„…q…Rq†hhtube…q‡Rqˆhhfhh‚hwhzubhXNameq‰…qŠ…q‹qŒ}q(hh]qŽ(hh‰XTagq†q…q‘q’}q“(hh]q”…q•Rq–hhŒubhh‰XEntityq—†q˜…q™qš}q›(hh]qœhh‰h—hw‡q…qžqŸ}q (hh]q¡…q¢Rq£hhšuba…q¤Rq¥hhŒhwhŸubhh‰X	Exceptionq¦†q§…q¨q©}qª(hh]q«…q¬Rq­hhŒubhh‰X	Decoratorq®†q¯…q°q±}q²(hh]q³…q´RqµhhŒubhh‰XClassq¶†q·…q¸q¹}qº(hh]q»(hh‰h¶hw‡q¼…q½q¾}q¿(hh]qqÁRqÂhh¹ubhh‰h¶XStartqÇqąqŁqÆ}qÇ(hh]qȅqÉRqÊhh¹ube…qËRqÌhhŒhÃhÆhwh¾ubhh‰XVariableq͆q΅qρqÐ}qÑ(hh]qÒ(hh‰hÍX	AnonymousqӇqԅqՁqÖ}q×(hh]q؅qÙRqÚhhÐubhh‰hÍh¶‡qۅq܁qÝ}qÞ(hh]q߅qàRqáhhÐubhh‰hÍXMagicqâ‡qã…qäqå}qæ(hh]qç…qèRqéhhÐubhh‰hÍXGlobalqê‡që…qìqí}qî(hh]qï…qðRqñhhÐubhh‰hÍXInstanceqò‡qó…qôqõ}qö(hh]q÷…qøRqùhhÐube…qúRqûhhŒh¶hÝhêhíhòhõhâhåhÓhÖubhh‰X	Attributeqü†qý…qþqÿ}r(hh]rhh‰hüh͇r…rr}r(hh]r…rRrhhÿuba…r	Rr
hhŒhÍjubhh‰X	Namespacer†r…r
r}r(hh]r…rRrhhŒubhh‰XPropertyr†r…rr}r(hh]r…rRrhhŒubhh‰XSymbolr†r…rr}r(hh]r …r!Rr"hhŒubhh‰XClassesr#†r$…r%r&}r'(hh]r(…r)Rr*hhŒubhh‰XPseudor+†r,…r-r.}r/(hh]r0…r1Rr2hhŒubhh‰XLabelr3†r4…r5r6}r7(hh]r8…r9Rr:hhŒubhh‰hq†r;…r<r=}r>(hh]r?…r@RrAhhŒubhh‰XBuiltinrB†rC…rDrE}rF(hh]rG(hh‰jBj+‡rH…rIrJ}rK(hh]rL…rMRrNhjEubhh‰jBXTyperO‡rP…rQrR}rS(hh]rT…rURrVhjEube…rWRrXhhŒj+jJjOjRubhh‰XFieldrY†rZ…r[r\}r](hh]r^…r_Rr`hhŒubhh‰XOtherra†rb…rcrd}re(hh]rfhh‰jaXMemberrg‡rh…rirj}rk(hh]rl…rmRrnhjduba…roRrphhŒjgjjubhh‰XFunctionrq†rr…rsrt}ru(hh]rvhh‰jqhâ‡rw…rxry}rz(hh]r{…r|Rr}hjtuba…r~RrhhŒhâjyubhh‰jO†r€…rr‚}rƒ(hh]r„…r…Rr†hhŒubhh‰XConstantr‡†rˆ…r‰rŠ}r‹(hh]rŒ…rRrŽhhŒube…rRrhhfhühÿjBjEh¶h¹j‡jŠh®h±h—hšh¦h©jqjtjjj3j6jjjajdhh’hÍhÐjYj\jjj+j.hqj=j#j&jOj‚ubhXLiteralr‘…r’…r“r”}r•(hh]r–(hj‘ja†r—…r˜r™}rš(hh]r›…rœRrhj”ubhj‘XCharrž†rŸ…r r¡}r¢(hh]r£…r¤Rr¥hj”ubhj‘XDater¦†r§…r¨r©}rª(hh]r«…r¬Rr­hj”ubhj‘XScalarr®†r¯…r°r±}r²(hh]r³hj‘j®XPlainr´‡rµ…r¶r·}r¸(hh]r¹…rºRr»hj±uba…r¼Rr½hj”j´j·ubhj‘XStringr¾†r¿…rÀrÁ}rÂ(hh]rÃ(hj‘j¾XInterpolrćrÅ…rƁrÇ}rÈ(hh]rÉ…rÊRrËhjÁubhj‘j¾X	DelimeterṙrÍ…r΁rÏ}rÐ(hh]rÑ…rÒRrÓhjÁubhj‘j¾jž‡rÔ…rՁrÖ}r×(hh]rØ…rÙRrÚhjÁubhj‘j¾j‡rÛ…r܁rÝ}rÞ(hh]rß…ràRráhjÁubhj‘j¾h#‡râ…rãrä}rå(hh]ræ…rçRrèhjÁubhj‘j¾ja‡ré…rêrë}rì(hh]rí…rîRrïhjÁubhj‘j¾XBacktickrð‡rñ…ròró}rô(hh]rõ…röRr÷hjÁubhj‘j¾hi‡rø…rùrú}rû(hh]rü…rýRrþhjÁubhj‘j¾XRegexrÿ‡r…rr}r(hh]r…rRrhjÁubhj‘j¾XMomentr‡r…r	r
}r(hh]r…r
RrhjÁubhj‘j¾XBooleanr‡r…rr}r(hh]r…rRrhjÁubhj‘j¾X	Characterr‡r…rr}r(hh]r…rRrhjÁubhj‘j¾X	Delimiterr‡r …r!r"}r#(hh]r$…r%Rr&hjÁubhj‘j¾h3‡r'…r(r)}r*(hh]r+…r,Rr-hjÁubhj‘j¾h‰‡r.…r/r0}r1(hh]r2…r3Rr4hjÁubhj‘j¾XAffixr5‡r6…r7r8}r9(hh]r:…r;Rr<hjÁubhj‘j¾XHeredocr=‡r>…r?r@}rA(hh]rB…rCRrDhjÁubhj‘j¾XDoublerE‡rF…rGrH}rI(hh]rJ…rKRrLhjÁubhj‘j¾XInterprM‡rN…rOrP}rQ(hh]rR…rSRrThjÁubhj‘j¾XAtomrU‡rV…rWrX}rY(hh]rZ…r[Rr\hjÁube…r]Rr^hj”j5j8jðjójžjÖjj"h3j)jEjHhijúj=j@jÄjÇjajëjÿjh#jäjjÝjjjj
jMjPjjjÌjÏjUjXh‰j0ubhj‘XNumberr_†r`…rarb}rc(hh]rd(hj‘j_XFloatre‡rf…rgrh}ri(hh]rj…rkRrlhjbubhj‘j_XDecrm‡rn…rorp}rq(hh]rr…rsRrthjbubhj‘j_XRadixru‡rv…rwrx}ry(hh]rz…r{Rr|hjbubhj‘j_XOctr}‡r~…rr€}r(hh]r‚…rƒRr„hjbubhj‘j_XBinr…‡r†…r‡rˆ}r‰(hh]rŠ…r‹RrŒhjbubhj‘j_hü‡r…rށr}r(hh]r‘…r’Rr“hjbubhj‘j_XHexr”‡r•…r–r—}r˜(hh]r™…ršRr›hjbubhj‘j_XIntegerrœ‡r…ržrŸ}r (hh]r¡h(j‘j_jœXLongr¢tr£…r¤r¥}r¦(hh]r§…r¨Rr©hjŸuba…rªRr«hjbj¢j¥ubhj‘j_XDecimalr¬‡r­…r®r¯}r°(hh]r±…r²Rr³hjbube…r´Rrµhj”j…jˆjejhj”j—jœjŸj}j€jujxhüjj¬j¯jmjpube…r¶Rr·hhfj¾jÁj_jbj¦j©j®j±jaj™jžj¡ubhXGenericr¸…r¹…rºr»}r¼(hh]r½(hj¸XErrorr¾†r¿…rÀrÁ}rÂ(hh]rÃ…rÄRrÅhj»ubhj¸X
SubheadingrƆrÇ…rȁrÉ}rÊ(hh]rË…rÌRrÍhj»ubhj¸X	TracebackrΆrÏ…rЁrÑ}rÒ(hh]rÓ…rÔRrÕhj»ubhj¸XOutputrÖ†r×…r؁rÙ}rÚ(hh]rÛ…rÜRrÝhj»ubhj¸XPromptrÞ†rß…ràrá}râ(hh]rã…räRråhj»ubhj¸XDeletedræ†rç…rèré}rê(hh]rë…rìRríhj»ubhj¸XInsertedrî†rï…rðrñ}rò(hh]ró…rôRrõhj»ubhj¸XHeadingrö†r÷…rørù}rú(hh]rû…rüRrýhj»ubhj¸XStrongrþ†rÿ…rr}r(hh]r…rRrhj»ubhj¸XEmphr†r…rr	}r
(hh]r…rRr
hj»ube…rRrhhfjæjéjj	j¾jÁjöjùjîjñjÖjÙjÞjájþjjÆjÉjÎjÑubhj¾…r…rr}r(hh]r…rRrhhfubhXKeywordr…r…rr}r(hh]r(hjh†r…rr}r (hh]r!…r"Rr#hjubhjj†r$…r%r&}r'(hh]r(…r)Rr*hjubhjjO†r+…r,r-}r.(hh]r/…r0Rr1hjubhjXPreProcr2†r3…r4r5}r6(hh]r7…r8Rr9hjubhjXControlr:†r;…r<r=}r>(hh]r?…r@RrAhjubhjj‡†rB…rCrD}rE(hh]rF…rGRrHhjubhjj†rI…rJrK}rL(hh]rM…rNRrOhjubhjj+†rP…rQrR}rS(hh]rT…rURrVhjubhjXDeclarationrW†rX…rYrZ}r[(hh]r\…r]Rr^hjubhjXReservedr_†r`…rarb}rc(hh]rd…reRrfhjube…rgRrhhhfj‡jDjWjZjjKj+jRj_jbjOj-j:j=jj&j2j5hjubhja…ri…rjrk}rl(hh]rm…rnRrohhfubhXTextrp…rq…rrrs}rt(hh]ru(hjpXRootrv†rw…rxry}rz(hh]r{…r|Rr}hjsubhjpj†r~…rr€}r(hh]r‚…rƒRr„hjsubhjpXRagr…†r†…r‡rˆ}r‰(hh]rŠ…r‹RrŒhjsubhjpX
Whitespacer†rŽ…rr}r‘(hh]r’…r“Rr”hjsubhjpXBeerr•†r–…r—r˜}r™(hh]rš…r›RrœhjsubhjpXPunctuationr†rž…rŸr }r¡(hh]r¢…r£Rr¤hjsube…r¥Rr¦hhfjjjj€jj jvjyj•j˜j…jˆubhhj…r§…r¨r©}rª(hh]r«hjX	Indicatorr¬†r­…r®r¯}r°(hh]r±…r²Rr³hj©uba…r´Rrµhhfj¬j¯ube…r¶Rr·jpjshihlj¾jjajkjjh‰hŒj‘j”jj©hqhthhj¸j»XTokenr¸hfj¾jÁj_jbubhhhChFh
h
hShVh#h&h[h^h;h>h+h.h3h6hhhKhNubX(*r¹†rºhX4 from Isabelle2013-2 src/HOL/Power.thy; BSD license r»†r¼hX*)r½†r¾jsX

r¿†rÀhX(*rÁ†rÂhX—  Title:      HOL/Power.thy
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
    Copyright   1997  University of Cambridge
rÆrÄhX*)rņrÆjsX

rdžrÈjùXheaderrɆrÊjsX rˆrÌhX{*r͆rÎhX Exponentiation rφrÐhX*}rцrÒjsX

rÓ†rÔjXtheoryrÕ†rÖjsjˆr×hŒXPowerr؆rÙjsX
rÚ†rÛjRXimportsr܆rÝjsjˆrÞhŒXNumr߆ràjsjÚ†rájXbeginrâ†rãjsX

rä†råjÉX
subsectionræ†rçjsjˆrèhX{*ré†rêhX Powers for Arbitrary Monoids rë†rìhX*}rí†rîjsX

rï†rðjXclassrñ†ròjsjˆróhŒXpowerrô†rõjsjˆröhtX=r÷†røjsjˆrùhŒXonerú†rûjsjˆrühtX+rý†rþjsjˆrÿhŒXtimesr†rjsjÚ†rjXbeginr†rjsX

r†rjXprimrecr†rjsjˆr	hŒXpowerr
†rjsjˆrhtX::r
†rjsjˆrjÁX"r†rjÁX'a r†rjÝX
\<Rightarrow>r†rjÁX nat r†rjÝX
\<Rightarrow>r†rjÁX 'ar†rjÁj†rjsjˆrhtX(r†rjRXinfixrr †r!jsjˆr"jÁj†r#jÁX^r$†r%jÁj†r&jsjˆr'hŒX80r(†r)htX)r*†r+jsjˆr,jRXwherer-†r.jsX
    r/†r0hŒXpower_0r1†r2htX:r3†r4jsjˆr5jÁj†r6jÁX	a ^ 0 = 1r7†r8jÁj†r9jsX
  r:†r;htX|r<†r=jsjˆr>hŒX	power_Sucr?†r@htj3†rAjsjˆrBjÁj†rCjÁXa ^ Suc n = a * a ^ nrD†rEjÁj†rFjsX

rG†rHjXnotationrI†rJjsjˆrKhtj†rLhŒXlatexrM†rNjsjˆrOjRXoutputrP†rQhtj*†rRjsX
  rS†rThŒXpowerrU†rVjsjˆrWhtj†rXjÁj†rYjÁX(_rZ†r[jÁX\r\†r]jÁX<^bsup>_r^†r_jÁj\†r`jÁX<^esup>)ra†rbjÁj†rcjsjˆrdhtX[re†rfhŒX1000rg†rhhtX]ri†rjjsjˆrkhŒX1000rl†rmhtj*†rnjsX

ro†rpjXnotationrq†rrjsjˆrshtj†rthŒXHTMLru†rvjsjˆrwjRXoutputrx†ryhtj*†rzjsX
  r{†r|hŒXpowerr}†r~jsjˆrhtj†r€jÁj†rjÁX(_r‚†rƒjÁj\†r„jÁX<^bsup>_r…†r†jÁj\†r‡jÁX<^esup>)rˆ†r‰jÁj†rŠjsjˆr‹htje†rŒhŒX1000r†rŽhtji†rjsjˆrhŒX1000r‘†r’htj*†r“jsX

r”†r•jXtextr–†r—jsjˆr˜hX{*r™†ršhX Special syntax for squares. r›†rœhX*}r†ržjsX

rŸ†r jXabbreviationr¡†r¢jsjˆr£htj†r¤hŒXxsymbolsr¥†r¦htj*†r§jsX
  r¨†r©hŒXpower2rª†r«jsjˆr¬htX::r­†r®jsjˆr¯jÁj†r°jÁX'a r±†r²jÝX
\<Rightarrow>r³†r´jÁX 'arµ†r¶jÁj†r·jsX  r¸†r¹htj†rºjÁj†r»jÁX(_r¼†r½jÁj\†r¾jÁX<^sup>2)r¿†rÀjÁj†rÁjsjˆrÂhtje†rÃhŒX1000rĆrÅhtji†rÆjsjˆrÇhŒX999rȆrÉhtj*†rÊjsjˆrËjRXwherer̆rÍjsX
  rΆrÏjÁj†rÐjÁXxrцrÒjÁj\†rÓjÁX<^sup>2 rÔ†rÕjÝX\<equiv>rÖ†r×jÁX x ^ 2r؆rÙjÁj†rÚjsX

rÛ†rÜjXnotationr݆rÞjsjˆrßhtj†ràhŒXlatexrá†râjsjˆrãjRXoutputrä†råhtj*†ræjsX
  rç†rèhŒXpower2ré†rêjsX  rë†rìhtj†ríjÁj†rîjÁX(_rï†rðjÁj\†rñjÁX<^sup>2)rò†rójÁj†rôjsjˆrõhtje†röhŒX1000r÷†røhtji†rùjsjˆrúhŒX999rû†rühtj*†rýjsX

rþ†rÿjXnotationr†rjsjˆrhtj†rhŒXHTMLr†rjsjˆrjRXoutputr†rhtj*†r	jsX
  r
†rhŒXpower2r†r
jsX  r†rhtj†rjÁj†rjÁX(_r†rjÁj\†rjÁX<^sup>2)r†rjÁj†rjsjˆrhtje†rhŒX1000r†rhtji†rjsjˆrhŒX999r†rhtj*†r jsX

r!†r"jXendr#†r$jsX

r%†r&jXcontextr'†r(jsjˆr)hŒXmonoid_multr*†r+jsjÚ†r,jXbeginr-†r.jsX

r/†r0jKXsubclassr1†r2jsjˆr3hŒXpowerr4†r5jsjˆr6h‚X.r7†r8jsX

r9†r:jKXlemmar;†r<jsjˆr=hŒX	power_oner>†r?jsjˆr@htje†rAhŒXsimprB†rChtji†rDhtj3†rEjsX
  rF†rGjÁj†rHjÁX	1 ^ n = 1rI†rJjÁj†rKjsX
  rL†rMjXbyrN†rOjsjˆrPhtj†rQhŒXinductrR†rSjsjˆrThŒXnrU†rVhtj*†rWjsjˆrXhŒXsimp_allrY†rZjsX

r[†r\jKXlemmar]†r^jsjˆr_hŒXpower_one_rightr`†rajsjˆrbhtje†rchŒXsimprd†rehtji†rfhtj3†rgjsX
  rh†rijÁj†rjjÁX	a ^ 1 = ark†rljÁj†rmjsX
  rn†rojXbyrp†rqjsjˆrrhŒXsimprs†rtjsX

ru†rvjKXlemmarw†rxjsjˆryhŒXpower_commutesrz†r{htj3†r|jsX
  r}†r~jÁj†rjÁXa ^ n * a = a * a ^ nr€†rjÁj†r‚jsX
  rƒ†r„jXbyr…†r†jsjˆr‡htj†rˆhŒXinductr‰†rŠjsjˆr‹hŒjU†rŒhtj*†rjsjˆrŽhtj†rhŒXsimp_allr†r‘jsjˆr’hŒXaddr“†r”htj3†r•jsjˆr–hŒX
mult_assocr—†r˜htj*†r™jsX

rš†r›jKXlemmarœ†rjsjˆržhŒX
power_Suc2rŸ†r htj3†r¡jsX
  r¢†r£jÁj†r¤jÁXa ^ Suc n = a ^ n * ar¥†r¦jÁj†r§jsX
  r¨†r©jXbyrª†r«jsjˆr¬htj†r­hŒXsimpr®†r¯jsjˆr°hŒXaddr±†r²htj3†r³jsjˆr´hŒXpower_commutesrµ†r¶htj*†r·jsX

r¸†r¹jKXlemmarº†r»jsjˆr¼hŒX	power_addr½†r¾htj3†r¿jsX
  rÀ†rÁjÁj†rÂjÁXa ^ (m + n) = a ^ m * a ^ nrÆrÄjÁj†rÅjsX
  rƆrÇjXbyrȆrÉjsjˆrÊhtj†rËhŒXinductr̆rÍjsjˆrÎhŒXmrφrÐhtj*†rÑjsjˆrÒhtj†rÓhŒXsimp_allrÔ†rÕjsjˆrÖhŒXaddr׆rØhtj3†rÙjsjˆrÚhŒX
algebra_simpsrÛ†rÜhtj*†rÝjsX

rÞ†rßjKXlemmarà†rájsjˆrâhŒX
power_multrã†rähtj3†råjsX
  ræ†rçjÁj†rèjÁXa ^ (m * n) = (a ^ m) ^ nré†rêjÁj†rëjsX
  rì†ríjXbyrî†rïjsjˆrðhtj†rñhŒXinductrò†rójsjˆrôhŒjU†rõhtj*†röjsjˆr÷htj†røhŒXsimp_allrù†rújsjˆrûhŒXaddrü†rýhtj3†rþjsjˆrÿhŒX	power_addr†rhtj*†rjsX

r†rjKXlemmar†rjsjˆrhŒXpower2_eq_squarer†r	htj3†r
jsjˆrjÁj†rjÁXar
†rjÁj\†rjÁX<^sup>2 = a * ar†rjÁj†rjsX
  r†rjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒXnumeral_2_eq_2r †r!htj*†r"jsX

r#†r$jKXlemmar%†r&jsjˆr'hŒXpower3_eq_cuber(†r)htj3†r*jsjˆr+jÁj†r,jÁXa ^ 3 = a * a * ar-†r.jÁj†r/jsX
  r0†r1jXbyr2†r3jsjˆr4htj†r5hŒXsimpr6†r7jsjˆr8hŒXaddr9†r:htj3†r;jsjˆr<hŒXnumeral_3_eq_3r=†r>jsjˆr?hŒX
mult_assocr@†rAhtj*†rBjsX

rC†rDjKXlemmarE†rFjsjˆrGhŒX
power_even_eqrH†rIhtj3†rJjsX
  rK†rLjÁj†rMjÁXa ^ (2 * n) = (a ^ n)rN†rOjÁj\†rPjÁX<^sup>2rQ†rRjÁj†rSjsX
  rT†rUjXbyrV†rWjsjˆrXhtj†rYhŒXsubstrZ†r[jsjˆr\hŒXmult_commuter]†r^htj*†r_jsjˆr`htj†rahŒXsimprb†rcjsjˆrdhŒXaddre†rfhtj3†rgjsjˆrhhŒX
power_multri†rjhtj*†rkjsX

rl†rmjKXlemmarn†rojsjˆrphŒXpower_odd_eqrq†rrhtj3†rsjsX
  rt†rujÁj†rvjÁXa ^ Suc (2*n) = a * (a ^ n)rw†rxjÁj\†ryjÁX<^sup>2rz†r{jÁj†r|jsX
  r}†r~jXbyr†r€jsjˆrhtj†r‚hŒXsimprƒ†r„jsjˆr…hŒXaddr††r‡htj3†rˆjsjˆr‰hŒX
power_even_eqrІr‹htj*†rŒjsX

r†rŽjKXlemmar†rjsjˆr‘hŒXpower_numeral_evenr’†r“htj3†r”jsX
  r•†r–jÁj†r—jÁX=z ^ numeral (Num.Bit0 w) = (let w = z ^ (numeral w) in w * w)r˜†r™jÁj†ršjsX
  r›†rœjX	unfoldingr†ržjsjˆrŸhŒXnumeral_Bit0r †r¡jsjˆr¢hŒX	power_addr£†r¤jsjˆr¥hŒXLet_defr¦†r§jsjˆr¨h‚X..r©†rªjsX

r«†r¬jKXlemmar­†r®jsjˆr¯hŒXpower_numeral_oddr°†r±htj3†r²jsX
  r³†r´jÁj†rµjÁXAz ^ numeral (Num.Bit1 w) = (let w = z ^ (numeral w) in z * w * w)r¶†r·jÁj†r¸jsX
  r¹†rºjX	unfoldingr»†r¼jsjˆr½hŒXnumeral_Bit1r¾†r¿jsjˆrÀhŒXOne_nat_defrÁ†rÂjsjˆrÃhŒX
add_Suc_rightrĆrÅjsjˆrÆhŒXadd_0_rightrdžrÈjsX
  rɆrÊjX	unfoldingrˆrÌjsjˆrÍhŒX	power_SucrΆrÏjsjˆrÐhŒX	power_addrцrÒjsjˆrÓhŒXLet_defrÔ†rÕjsjˆrÖhŒX
mult_assocr׆rØjsjˆrÙh‚X..rÚ†rÛjsX

r܆rÝjKXlemmarÞ†rßjsjˆràhŒXfunpow_times_powerrá†râhtj3†rãjsX
  rä†råjÁj†ræjÁX"(times x ^^ f x) = times (x ^ f x)rç†rèjÁj†réjsjÚ†rêjXproofrë†rìjsjˆríhtj†rîhŒXinductrï†rðjsjˆrñjÁj†ròjÁXf xró†rôjÁj†rõjsjˆröhŒX	arbitraryr÷†røhtj3†rùjsjˆrúhŒXfrû†rühtj*†rýjsX
  rþ†rÿjXcaser†rjsjˆrhŒX0r†rjsjˆrjXthenr†rjsjˆrjXshowr	†r
jsjˆrhtX?r†r
jXcaser†rjsjˆrjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒX
fun_eq_iffr†rhtj*†rjsjÚ†rjXnextr †r!jsX
  r"†r#jXcaser$†r%jsjˆr&htj†r'hŒXSucr(†r)jsjˆr*hŒjU†r+htj*†r,jsX
  r-†r.jXdefr/†r0jsjˆr1hŒXgr2†r3jsjˆr4j€X\<equiv>r5†r6jsjˆr7jÁj†r8jÝX	\<lambda>r9†r:jÁX
x. f x - 1r;†r<jÁj†r=jsX
  r>†r?jXwithr@†rAjsjˆrBhŒXSucrC†rDjsjˆrEjXhaverF†rGjsjˆrHjÁj†rIjÁXn = g xrJ†rKjÁj†rLjsjˆrMjXbyrN†rOjsjˆrPhŒXsimprQ†rRjsX
  rS†rTjXwithrU†rVjsjˆrWhŒXSucrX†rYjsjˆrZjXhaver[†r\jsjˆr]jÁj†r^jÁX times x ^^ g x = times (x ^ g x)r_†r`jÁj†rajsjˆrbjXbyrc†rdjsjˆrehŒXsimprf†rgjsX
  rh†rijXmoreoverrj†rkjsjˆrljXfromrm†rnjsjˆrohŒXSucrp†rqjsjˆrrhŒXg_defrs†rtjsjˆrujXhaverv†rwjsjˆrxjÁj†ryjÁX
f x = g x + 1rz†r{jÁj†r|jsjˆr}jXbyr~†rjsjˆr€hŒXsimpr†r‚jsX
  rƒ†r„jX
ultimatelyr…†r†jsjˆr‡jXshowrˆ†r‰jsjˆrŠhtj†r‹jXcaserŒ†rjsjˆrŽjXbyr†rjsjˆr‘htj†r’hŒXsimpr“†r”jsjˆr•hŒXaddr–†r—htj3†r˜jsjˆr™hŒX	power_addrš†r›jsjˆrœhŒX
funpow_addr†ržjsjˆrŸhŒX
fun_eq_iffr †r¡jsjˆr¢hŒX
mult_assocr£†r¤htj*†r¥jsjÚ†r¦jXqedr§†r¨jsX

r©†rªjXendr«†r¬jsX

r­†r®jXcontextr¯†r°jsjˆr±hŒXcomm_monoid_multr²†r³jsjÚ†r´jXbeginrµ†r¶jsX

r·†r¸jKXlemmar¹†rºjsjˆr»hŒXpower_mult_distribr¼†r½htj3†r¾jsX
  r¿†rÀjÁj†rÁjÁX(a * b) ^ n = (a ^ n) * (b ^ n)r†rÃjÁj†rÄjsX
  rņrÆjXbyrdžrÈjsjˆrÉhtj†rÊhŒXinductrˆrÌjsjˆrÍhŒjU†rÎhtj*†rÏjsjˆrÐhtj†rÑhŒXsimp_allrÒ†rÓjsjˆrÔhŒXaddrÕ†rÖhtj3†r×jsjˆrØhŒXmult_acrÙ†rÚhtj*†rÛjsX

r܆rÝjXendrÞ†rßjsX

rà†rájXcontextrâ†rãjsjˆrähŒXsemiring_numeralrå†ræjsjÚ†rçjXbeginrè†réjsX

rê†rëjKXlemmarì†ríjsjˆrîhŒXnumeral_sqrrï†rðhtj3†rñjsjˆròjÁj†rójÁX+numeral (Num.sqr k) = numeral k * numeral krô†rõjÁj†röjsX
  r÷†røjXbyrù†rújsjˆrûhtj†rühŒXsimprý†rþjsjˆrÿhŒXonlyr†rhtj3†rjsjˆrhŒX
sqr_conv_multr†rjsjˆrhŒXnumeral_multr†rhtj*†r	jsX

r
†rjKXlemmar†r
jsjˆrhŒXnumeral_powr†rhtj3†rjsjˆrjÁj†rjÁX-numeral (Num.pow k l) = numeral k ^ numeral lr†rjÁj†rjsX
  r†rjXbyr†rjsjˆrhtj†rhŒXinductr†rjsjˆrhŒXlr †r!htX,r"†r#jsjˆr$hŒXsimp_allr%†r&jsjˆr'hŒXonlyr(†r)htj3†r*jsjˆr+hŒXnumeral_class.numeral.simpsr,†r-jsjˆr.hŒX	pow.simpsr/†r0jsX
    r1†r2hŒXnumeral_sqrr3†r4jsjˆr5hŒXnumeral_multr6†r7jsjˆr8hŒX	power_addr9†r:jsjˆr;hŒXpower_one_rightr<†r=htj*†r>jsX

r?†r@jKXlemmarA†rBjsjˆrChŒX
power_numeralrD†rEjsjˆrFhtje†rGhŒXsimprH†rIhtji†rJhtj3†rKjsjˆrLjÁj†rMjÁX-numeral k ^ numeral l = numeral (Num.pow k l)rN†rOjÁj†rPjsX
  rQ†rRjXbyrS†rTjsjˆrUhtj†rVhŒXrulerW†rXjsjˆrYhŒXnumeral_powrZ†r[jsjˆr\htje†r]hŒX	symmetricr^†r_htji†r`htj*†rajsX

rb†rcjXendrd†rejsX

rf†rgjXcontextrh†rijsjˆrjhŒX
semiring_1rk†rljsjÚ†rmjXbeginrn†rojsX

rp†rqjKXlemmarr†rsjsjˆrthŒXof_nat_powerru†rvhtj3†rwjsX
  rx†ryjÁj†rzjÁXof_nat (m ^ n) = of_nat m ^ nr{†r|jÁj†r}jsX
  r~†rjXbyr€†rjsjˆr‚htj†rƒhŒXinductr„†r…jsjˆr†hŒjU†r‡htj*†rˆjsjˆr‰htj†rŠhŒXsimp_allr‹†rŒjsjˆrhŒXaddrކrhtj3†rjsjˆr‘hŒXof_nat_multr’†r“htj*†r”jsX

r•†r–jKXlemmar—†r˜jsjˆr™hŒXpower_zero_numeralrš†r›jsjˆrœhtje†rhŒXsimprž†rŸhtji†r htj3†r¡jsjˆr¢jÁj†r£jÁX(0::'a) ^ numeral k = 0r¤†r¥jÁj†r¦jsX
  r§†r¨jXbyr©†rªjsjˆr«htj†r¬hŒXsimpr­†r®jsjˆr¯hŒXaddr°†r±htj3†r²jsjˆr³hŒXnumeral_eq_Sucr´†rµhtj*†r¶jsX

r·†r¸jKXlemmar¹†rºjsjˆr»hŒXzero_power2r¼†r½htj3†r¾jsjˆr¿jÁj†rÀjÁj†rÁjÁj\†rÂjÁX<^sup>2 = 0rÆrÄjÁj†rÅjsjˆrÆhX(*rdžrÈhX	 delete? rɆrÊhX*)rˆrÌjsX
  r͆rÎjXbyrφrÐjsjˆrÑhtj†rÒhŒXrulerÓ†rÔjsjˆrÕhŒXpower_zero_numeralrÖ†r×htj*†rØjsX

rÙ†rÚjKXlemmarÛ†rÜjsjˆrÝhŒX
one_power2rÞ†rßhtj3†ràjsjˆrájÁj†râjÁX1rã†räjÁj\†råjÁX<^sup>2 = 1ræ†rçjÁj†rèjsjˆréhX(*rê†rëhX	 delete? rì†ríhX*)rî†rïjsX
  rð†rñjXbyrò†rójsjˆrôhtj†rõhŒXrulerö†r÷jsjˆrøhŒX	power_onerù†rúhtj*†rûjsX

rü†rýjXendrþ†rÿjsX

r	†r	jXcontextr	†r	jsjˆr	hŒXcomm_semiring_1r	†r	jsjÚ†r	jXbeginr	†r		jsX

r
	†r	jXtextr	†r
	jsjˆr	hX{*r	†r	hX The divides relation r	†r	hX*}r	†r	jsX

r	†r	jKXlemmar	†r	jsjˆr	hŒXle_imp_power_dvdr	†r	htj3†r	jsX
  r	†r	jRXassumesr	†r 	jsjˆr!	jÁj†r"	jÁXm r#	†r$	jÝX\<le>r%	†r&	jÁX nr'	†r(	jÁj†r)	jsjˆr*	jRXshowsr+	†r,	jsjˆr-	jÁj†r.	jÁXa ^ m dvd a ^ nr/	†r0	jÁj†r1	jsjÚ†r2	jXproofr3	†r4	jsX
  r5	†r6	jXhaver7	†r8	jsjˆr9	jÁj†r:	jÁXa ^ n = a ^ (m + (n - m))r;	†r<	jÁj†r=	jsX
    r>	†r?	jXusingr@	†rA	jsjˆrB	jëX`rC	†rD	jëXm rE	†rF	jÝX\<le>rG	†rH	jëX nrI	†rJ	jëjC	†rK	jsjˆrL	jXbyrM	†rN	jsjˆrO	hŒXsimprP	†rQ	jsX
  rR	†rS	jXalsorT	†rU	jsjˆrV	jXhaverW	†rX	jsjˆrY	jÁj†rZ	jÝX\<dots>r[	†r\	jÁX = a ^ m * a ^ (n - m)r]	†r^	jÁj†r_	jsX
    r`	†ra	jXbyrb	†rc	jsjˆrd	htj†re	hŒXrulerf	†rg	jsjˆrh	hŒX	power_addri	†rj	htj*†rk	jsX
  rl	†rm	jXfinallyrn	†ro	jsjˆrp	jXshowrq	†rr	jsjˆrs	jÁj†rt	jÁXa ^ n = a ^ m * a ^ (n - m)ru	†rv	jÁj†rw	jsjˆrx	h‚j7†ry	jsjÚ†rz	jXqedr{	†r|	jsX

r}	†r~	jKXlemmar	†r€	jsjˆr	hŒXpower_le_dvdr‚	†rƒ	htj3†r„	jsX
  r…	†r†	jÁj†r‡	jÁXa ^ n dvd b rˆ	†r‰	jÝX\<Longrightarrow>rŠ	†r‹	jÁX m rŒ	†r	jÝX\<le>rŽ	†r	jÁX n r	†r‘	jÝX\<Longrightarrow>r’	†r“	jÁX a ^ m dvd br”	†r•	jÁj†r–	jsX
  r—	†r˜	jXbyr™	†rš	jsjˆr›	htj†rœ	hŒXruler	†rž	jsjˆrŸ	hŒX	dvd_transr 	†r¡	jsjˆr¢	htje†r£	e(hŒXOFr¤	†r¥	jsjˆr¦	hŒXle_imp_power_dvdr§	†r¨	htji†r©	htj*†rª	jsX

r«	†r¬	jKXlemmar­	†r®	jsjˆr¯	hŒXdvd_power_samer°	†r±	htj3†r²	jsX
  r³	†r´	jÁj†rµ	jÁXx dvd y r¶	†r·	jÝX\<Longrightarrow>r¸	†r¹	jÁX x ^ n dvd y ^ nrº	†r»	jÁj†r¼	jsX
  r½	†r¾	jXbyr¿	†rÀ	jsjˆrÁ	htj†rÂ	hŒXinductrÃ	†rÄ	jsjˆrÅ	hŒjU†rÆ	htj*†rÇ	jsjˆrÈ	htj†rÉ	hŒXautorÊ	†rË	jsjˆrÌ	hŒXsimprÍ	†rÎ	jsjˆrÏ	hŒXaddrÐ	†rÑ	htj3†rÒ	jsjˆrÓ	hŒX
mult_dvd_monorÔ	†rÕ	htj*†rÖ	jsX

r×	†rØ	jKXlemmarÙ	†rÚ	jsjˆrÛ	hŒXdvd_power_lerÜ	†rÝ	htj3†rÞ	jsX
  rß	†rà	jÁj†rá	jÁXx dvd y râ	†rã	jÝX\<Longrightarrow>rä	†rå	jÁX m ræ	†rç	jÝX\<ge>rè	†ré	jÁX n rê	†rë	jÝX\<Longrightarrow>rì	†rí	jÁX x ^ n dvd y ^ mrî	†rï	jÁj†rð	jsX
  rñ	†rò	jXbyró	†rô	jsjˆrõ	htj†rö	hŒXruler÷	†rø	jsjˆrù	hŒXpower_le_dvdrú	†rû	jsjˆrü	htje†rý	hŒXOFrþ	†rÿ	jsjˆr
hŒXdvd_power_samer
†r
htji†r
htj*†r
jsX

r
†r
jKXlemmar
†r
jsjˆr	
hŒX	dvd_powerr

†r
jsjˆr
htje†r
hŒXsimpr
†r
htji†r
htj3†r
jsX
  r
†r
jRXassumesr
†r
jsjˆr
jÁj†r
jÁX
n > (0::nat) r
†r
jÝX\<or>r
†r
jÁX x = 1r
†r
jÁj†r
jsX
  r
†r 
jRXshowsr!
†r"
jsjˆr#
jÁj†r$
jÁX
x dvd (x ^ n)r%
†r&
jÁj†r'
jsjÚ†r(
jXusingr)
†r*
jsjˆr+
hŒXassmsr,
†r-
jsjˆr.
jXproofr/
†r0
jsX
  r1
†r2
jXassumer3
†r4
jsjˆr5
jÁj†r6
jÁX0 < nr7
†r8
jÁj†r9
jsX
  r:
†r;
jXthenr<
†r=
jsjˆr>
jXhaver?
†r@
jsjˆrA
jÁj†rB
jÁXx ^ n = x ^ Suc (n - 1)rC
†rD
jÁj†rE
jsjˆrF
jXbyrG
†rH
jsjˆrI
hŒXsimprJ
†rK
jsX
  rL
†rM
jXthenrN
†rO
jsjˆrP
jXshowrQ
†rR
jsjˆrS
jÁj†rT
jÁX
x dvd (x ^ n)rU
†rV
jÁj†rW
jsjˆrX
jXbyrY
†rZ
jsjˆr[
hŒXsimpr\
†r]
jsjÚ†r^
jXnextr_
†r`
jsX
  ra
†rb
jXassumerc
†rd
jsjˆre
jÁj†rf
jÁXx = 1rg
†rh
jÁj†ri
jsX
  rj
†rk
jXthenrl
†rm
jsjˆrn
jXshowro
†rp
jsjˆrq
jÁj†rr
jÁX
x dvd (x ^ n)rs
†rt
jÁj†ru
jsjˆrv
jXbyrw
†rx
jsjˆry
hŒXsimprz
†r{
jsjÚ†r|
jXqedr}
†r~
jsX

r
†r€
jXendr
†r‚
jsX

rƒ
†r„
jXcontextr…
†r†
jsjˆr‡
hŒXring_1rˆ
†r‰
jsjÚ†rŠ
jXbeginr‹
†rŒ
jsX

r
†rŽ
jKXlemmar
†r
jsjˆr‘
hŒXpower_minusr’
†r“
htj3†r”
jsX
  r•
†r–
jÁj†r—
jÁX(- a) ^ n = (- 1) ^ n * a ^ nr˜
†r™
jÁj†rš
jsjÚ†r›
jXproofrœ
†r
jsjˆrž
htj†rŸ
hŒXinductr 
†r¡
jsjˆr¢
hŒjU†r£
htj*†r¤
jsX
  r¥
†r¦
jXcaser§
†r¨
jsjˆr©
hŒj†rª
jsjˆr«
jXshowr¬
†r­
jsjˆr®
htj†r¯
jXcaser°
†r±
jsjˆr²
jXbyr³
†r´
jsjˆrµ
hŒXsimpr¶
†r·
jsjÚ†r¸
jXnextr¹
†rº
jsX
  r»
†r¼
jXcaser½
†r¾
jsjˆr¿
htj†rÀ
hŒXSucrÁ
†rÂ
jsjˆrÃ
hŒjU†rÄ
htj*†rÅ
jsjˆrÆ
jXthenrÇ
†rÈ
jsjˆrÉ
jXshowrÊ
†rË
jsjˆrÌ
htj†rÍ
jXcaserÎ
†rÏ
jsX
    rÐ
†rÑ
jXbyrÒ
†rÓ
jsjˆrÔ
htj†rÕ
hŒXsimprÖ
†r×
jsjˆrØ
hŒXdelrÙ
†rÚ
htj3†rÛ
jsjˆrÜ
hŒX	power_SucrÝ
†rÞ
jsjˆrß
hŒXaddrà
†rá
htj3†râ
jsjˆrã
hŒX
power_Suc2rä
†rå
jsjˆræ
hŒX
mult_assocrç
†rè
htj*†ré
jsjÚ†rê
jXqedrë
†rì
jsX

rí
†rî
jKXlemmarï
†rð
jsjˆrñ
hŒXpower_minus_Bit0rò
†ró
htj3†rô
jsX
  rõ
†rö
jÁj†r÷
jÁX7(- x) ^ numeral (Num.Bit0 k) = x ^ numeral (Num.Bit0 k)rø
†rù
jÁj†rú
jsX
  rû
†rü
jXbyrý
†rþ
jsjˆrÿ
htj†rhŒXinductr†rjsjˆrhŒXkr†rhtj"†rjsjˆrhŒXsimp_allr†r	jsjˆr
hŒXonlyr†rhtj3†r
jsjˆrhŒXnumeral_class.numeral.simpsr†rjsjˆrhŒX	power_addr†rjsX
    r†rhŒXpower_one_rightr†rjsjˆrhŒXmult_minus_leftr†rjsjˆrhŒXmult_minus_rightr†rjsjˆrhŒXminus_minusr†r htj*†r!jsX

r"†r#jKXlemmar$†r%jsjˆr&hŒXpower_minus_Bit1r'†r(htj3†r)jsX
  r*†r+jÁj†r,jÁX;(- x) ^ numeral (Num.Bit1 k) = - (x ^ numeral (Num.Bit1 k))r-†r.jÁj†r/jsX
  r0†r1jXbyr2†r3jsjˆr4htj†r5hŒXsimpr6†r7jsjˆr8hŒXonlyr9†r:htj3†r;jsjˆr<hŒXeval_nat_numeralr=†r>htj†r?hŒX3r@†rAhtj*†rBjsjˆrChŒX	power_SucrD†rEjsjˆrFhŒXpower_minus_Bit0rG†rHjsjˆrIhŒXmult_minus_leftrJ†rKhtj*†rLjsX

rM†rNjKXlemmarO†rPjsjˆrQhŒXpower_neg_numeral_Bit0rR†rSjsjˆrThtje†rUhŒXsimprV†rWhtji†rXhtj3†rYjsX
  rZ†r[jÁj†r\jÁXGneg_numeral k ^ numeral (Num.Bit0 l) = numeral (Num.pow k (Num.Bit0 l))r]†r^jÁj†r_jsX
  r`†rajXbyrb†rcjsjˆrdhtj†rehŒXsimprf†rgjsjˆrhhŒXonlyri†rjhtj3†rkjsjˆrlhŒXneg_numeral_defrm†rnjsjˆrohŒXpower_minus_Bit0rp†rqjsjˆrrhŒX
power_numeralrs†rthtj*†rujsX

rv†rwjKXlemmarx†ryjsjˆrzhŒXpower_neg_numeral_Bit1r{†r|jsjˆr}htje†r~hŒXsimpr†r€htji†rhtj3†r‚jsX
  rƒ†r„jÁj†r…jÁXKneg_numeral k ^ numeral (Num.Bit1 l) = neg_numeral (Num.pow k (Num.Bit1 l))r††r‡jÁj†rˆjsX
  r‰†rŠjXbyr‹†rŒjsjˆrhtj†rŽhŒXsimpr†rjsjˆr‘hŒXonlyr’†r“htj3†r”jsjˆr•hŒXneg_numeral_defr–†r—jsjˆr˜hŒXpower_minus_Bit1r™†ršjsjˆr›hŒX
power_numeralrœ†rjsjˆržhŒX	pow.simpsrŸ†r htj*†r¡jsX

r¢†r£jKXlemmar¤†r¥jsjˆr¦hŒXpower2_minusr§†r¨jsjˆr©htje†rªhŒXsimpr«†r¬htji†r­htj3†r®jsX
  r¯†r°jÁj†r±jÁX(- a)r²†r³jÁj\†r´jÁX<^sup>2 = arµ†r¶jÁj\†r·jÁX<^sup>2r¸†r¹jÁj†rºjsX
  r»†r¼jXbyr½†r¾jsjˆr¿htj†rÀhŒXrulerÁ†rÂjsjˆrÃhŒXpower_minus_Bit0rĆrÅhtj*†rÆjsX

rdžrÈjKXlemmarɆrÊjsjˆrËhŒXpower_minus1_evenr̆rÍjsjˆrÎhtje†rÏhŒXsimprІrÑhtji†rÒhtj3†rÓjsX
  rÔ†rÕjÁj†rÖjÁX-1 ^ (2*n) = 1r׆rØjÁj†rÙjsjÚ†rÚjXproofrÛ†rÜjsjˆrÝhtj†rÞhŒXinductr߆ràjsjˆráhŒjU†râhtj*†rãjsX
  rä†råjXcaseræ†rçjsjˆrèhŒj†réjsjˆrêjXshowrë†rìjsjˆríhtj†rîjXcaserï†rðjsjˆrñjXbyrò†rójsjˆrôhŒXsimprõ†röjsjÚ†r÷jXnextrø†rùjsX
  rú†rûjXcaserü†rýjsjˆrþhtj†rÿhŒXSucr†rjsjˆrhŒjU†rhtj*†rjsjˆrjXthenr†rjsjˆrjXshowr	†r
jsjˆrhtj†rjXcaser
†rjsjˆrjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒX	power_addr†rjsjˆrhŒXpower2_eq_squarer†rhtj*†r jsjÚ†r!jXqedr"†r#jsX

r$†r%jKXlemmar&†r'jsjˆr(hŒXpower_minus1_oddr)†r*htj3†r+jsX
  r,†r-jÁj†r.jÁX-1 ^ Suc (2*n) = -1r/†r0jÁj†r1jsX
  r2†r3jXbyr4†r5jsjˆr6hŒXsimpr7†r8jsX

r9†r:jKXlemmar;†r<jsjˆr=hŒXpower_minus_evenr>†r?jsjˆr@htje†rAhŒXsimprB†rChtji†rDhtj3†rEjsX
  rF†rGjÁj†rHjÁX(-a) ^ (2*n) = a ^ (2*n)rI†rJjÁj†rKjsX
  rL†rMjXbyrN†rOjsjˆrPhtj†rQhŒXsimprR†rSjsjˆrThŒXaddrU†rVhtj3†rWjsjˆrXhŒXpower_minusrY†rZjsjˆr[htje†r\hŒXofr]†r^jsjˆr_hŒj
†r`htji†rahtj*†rbjsX

rc†rdjXendre†rfjsX

rg†rhjXcontextri†rjjsjˆrkhŒXring_1_no_zero_divisorsrl†rmjsjÚ†rnjXbeginro†rpjsX

rq†rrjKXlemmars†rtjsjˆruhŒXfield_power_not_zerorv†rwhtj3†rxjsX
  ry†rzjÁj†r{jÁXa r|†r}jÝX\<noteq>r~†rjÁX 0 r€†rjÝX\<Longrightarrow>r‚†rƒjÁX a ^ n r„†r…jÝX\<noteq>r††r‡jÁX 0rˆ†r‰jÁj†rŠjsX
  r‹†rŒjXbyr†rŽjsjˆrhtj†rhŒXinductr‘†r’jsjˆr“hŒjU†r”htj*†r•jsjˆr–hŒXautor—†r˜jsX

r™†ršjKXlemmar›†rœjsjˆrhŒXzero_eq_power2rž†rŸjsjˆr htje†r¡hŒXsimpr¢†r£htji†r¤htj3†r¥jsX
  r¦†r§jÁj†r¨jÁj
†r©jÁj\†rªjÁX<^sup>2 = 0 r«†r¬jÝX\<longleftrightarrow>r­†r®jÁX a = 0r¯†r°jÁj†r±jsX
  r²†r³jX	unfoldingr´†rµjsjˆr¶hŒXpower2_eq_squarer·†r¸jsjˆr¹jXbyrº†r»jsjˆr¼hŒXsimpr½†r¾jsX

r¿†rÀjKXlemmarÁ†rÂjsjˆrÃhŒXpower2_eq_1_iffrÄ†rÅhtj3†rÆjsX
  rÇ†rÈjÁj†rÉjÁj
†rÊjÁj\†rËjÁX<^sup>2 = 1 rÌ†rÍjÝX\<longleftrightarrow>rÎ†rÏjÁX a = 1 rÐ†rÑjÝX\<or>rÒ†rÓjÁX a = - 1rÔ†rÕjÁj†rÖjsX
  r×†rØjX	unfoldingrÙ†rÚjsjˆrÛhŒXpower2_eq_squarerÜ†rÝjsjˆrÞjXbyrß†ràjsjˆráhtj†râhŒXrulerã†räjsjˆråhŒXsquare_eq_1_iffræ†rçhtj*†rèjsX

ré†rêjXendrë†rìjsX

rí†rîjXcontextrï†rðjsjˆrñhŒXidomrò†rójsjÚ†rôjXbeginrõ†röjsX

r÷†røjKXlemmarù†rújsjˆrûhŒX
power2_eq_iffrü†rýhtj3†rþjsjˆrÿjÁj†r
jÁjцr
jÁj\†r
jÁX<^sup>2 = yr
†r
jÁj\†r
jÁX<^sup>2 r
†r
jÝX\<longleftrightarrow>r
†r	
jÁX x = y r

†r
jÝX\<or>r
†r

jÁX x = - yr
†r
jÁj†r
jsX
  r
†r
jX	unfoldingr
†r
jsjˆr
hŒXpower2_eq_squarer
†r
jsjˆr
jXbyr
†r
jsjˆr
htj†r
hŒXruler
†r
jsjˆr
hŒX
square_eq_iffr 
†r!
htj*†r"
jsX

r#
†r$
jXendr%
†r&
jsX

r'
†r(
jXcontextr)
†r*
jsjˆr+
hŒX
division_ringr,
†r-
jsjÚ†r.
jXbeginr/
†r0
jsX

r1
†r2
jXtextr3
†r4
jsjˆr5
hX{*r6
†r7
hX9 FIXME reorient or rename to @{text nonzero_inverse_powerr8
†r9
hX}r:
†r;
hjˆr<
hX*}r=
†r>
jsjÚ†r?
jKXlemmar@
†rA
jsjˆrB
hŒXnonzero_power_inverserC
†rD
htj3†rE
jsX
  rF
†rG
jÁj†rH
jÁXa rI
†rJ
jÝX\<noteq>rK
†rL
jÁX 0 rM
†rN
jÝX\<Longrightarrow>rO
†rP
jÁX" inverse (a ^ n) = (inverse a) ^ nrQ
†rR
jÁj†rS
jsX
  rT
†rU
jXbyrV
†rW
jsjˆrX
htj†rY
hŒXinductrZ
†r[
jsjˆr\
hŒjU†r]
htj*†r^
jsX
    r_
†r`
htj†ra
hŒXsimp_allrb
†rc
jsjˆrd
hŒXaddre
†rf
htj3†rg
jsjˆrh
hŒXnonzero_inverse_mult_distribri
†rj
jsjˆrk
hŒXpower_commutesrl
†rm
jsjˆrn
hŒXfield_power_not_zeroro
†rp
htj*†rq
jsX

rr
†rs
jXendrt
†ru
jsX

rv
†rw
jXcontextrx
†ry
jsjˆrz
hŒXfieldr{
†r|
jsjÚ†r}
jXbeginr~
†r
jsX

r€
†r
jKXlemmar‚
†rƒ
jsjˆr„
hŒXnonzero_power_divider…
†r†
htj3†r‡
jsX
  rˆ
†r‰
jÁj†rŠ
jÁXb r‹
†rŒ
jÝX\<noteq>r
†rŽ
jÁX 0 r
†r
jÝX\<Longrightarrow>r‘
†r’
jÁX (a / b) ^ n = a ^ n / b ^ nr“
†r”
jÁj†r•
jsX
  r–
†r—
jXbyr˜
†r™
jsjˆrš
htj†r›
hŒXsimprœ
†r
jsjˆrž
hŒXaddrŸ
†r 
htj3†r¡
jsjˆr¢
hŒXdivide_inverser£
†r¤
jsjˆr¥
hŒXpower_mult_distribr¦
†r§
jsjˆr¨
hŒXnonzero_power_inverser©
†rª
htj*†r«
jsX

r¬
†r­
jXendr®
†r¯
jsX


r°
†r±
jÉX
subsectionr²
†r³
jsjˆr´
hX{*rµ
†r¶
hX! Exponentiation on ordered types r·
†r¸
hX*}r¹
†rº
jsX

r»
†r¼
jXcontextr½
†r¾
jsjˆr¿
hŒXlinordered_ringrÀ
†rÁ
jsjˆrÂ
hX(*rÃ
†rÄ
hX TODO: move rÅ
†rÆ
hX*)rÇ
†rÈ
jsjÚ†rÉ
jXbeginrÊ
†rË
jsX

rÌ
†rÍ
jKXlemmarÎ
†rÏ
jsjˆrÐ
hŒXsum_squares_ge_zerorÑ
†rÒ
htj3†rÓ
jsX
  rÔ
†rÕ
jÁj†rÖ
jÁX0 r×
†rØ
jÝX\<le>rÙ
†rÚ
jÁX x * x + y * yrÛ
†rÜ
jÁj†rÝ
jsX
  rÞ
†rß
jXbyrà
†rá
jsjˆrâ
htj†rã
hŒXintrorä
†rå
jsjˆræ
hŒXadd_nonneg_nonnegrç
†rè
jsjˆré
hŒXzero_le_squarerê
†rë
htj*†rì
jsX

rí
†rî
jKXlemmarï
†rð
jsjˆrñ
hŒXnot_sum_squares_lt_zerorò
†ró
htj3†rô
jsX
  rõ
†rö
jÁj†r÷
jÝX\<not>rø
†rù
jÁX x * x + y * y < 0rú
†rû
jÁj†rü
jsX
  rý
†rþ
jXbyrÿ
†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆr	hŒXnot_lessr
†rjsjˆrhŒXsum_squares_ge_zeror
†rhtj*†rjsX

r†rjXendr†rjsX

r†rjXcontextr†rjsjˆrhŒXlinordered_semidomr†rjsjÚ†rjXbeginr†rjsX

r†rjKXlemmar †r!jsjˆr"hŒXzero_less_powerr#†r$jsjˆr%htje†r&hŒXsimpr'†r(htji†r)htj3†r*jsX
  r+†r,jÁj†r-jÁX0 < a r.†r/jÝX\<Longrightarrow>r0†r1jÁX
 0 < a ^ nr2†r3jÁj†r4jsX
  r5†r6jXbyr7†r8jsjˆr9htj†r:hŒXinductr;†r<jsjˆr=hŒjU†r>htj*†r?jsjˆr@htj†rAhŒXsimp_allrB†rCjsjˆrDhŒXaddrE†rFhtj3†rGjsjˆrHhŒXmult_pos_posrI†rJhtj*†rKjsX

rL†rMjKXlemmarN†rOjsjˆrPhŒX
zero_le_powerrQ†rRjsjˆrShtje†rThŒXsimprU†rVhtji†rWhtj3†rXjsX
  rY†rZjÁj†r[jÁX0 r\†r]jÝX\<le>r^†r_jÁX a r`†rajÝX\<Longrightarrow>rb†rcjÁX 0 rd†rejÝX\<le>rf†rgjÁX a ^ nrh†rijÁj†rjjsX
  rk†rljXbyrm†rnjsjˆrohtj†rphŒXinductrq†rrjsjˆrshŒjU†rthtj*†rujsjˆrvhtj†rwhŒXsimp_allrx†ryjsjˆrzhŒXaddr{†r|htj3†r}jsjˆr~hŒXmult_nonneg_nonnegr†r€htj*†rjsX

r‚†rƒjKXlemmar„†r…jsjˆr†hŒX
power_monor‡†rˆhtj3†r‰jsX
  rІr‹jÁj†rŒjÁXa r†rŽjÝX\<le>r†rjÁX b r‘†r’jÝX\<Longrightarrow>r“†r”jÁX 0 r•†r–jÝX\<le>r—†r˜jÁX a r™†ršjÝX\<Longrightarrow>r›†rœjÁX a ^ n r†ržjÝX\<le>rŸ†r jÁX b ^ nr¡†r¢jÁj†r£jsX
  r¤†r¥jXbyr¦†r§jsjˆr¨htj†r©hŒXinductrª†r«jsjˆr¬hŒjU†r­htj*†r®jsjˆr¯htj†r°hŒXautor±†r²jsjˆr³hŒXintror´†rµhtj3†r¶jsjˆr·hŒX	mult_monor¸†r¹jsjˆrºhŒXorder_transr»†r¼jsjˆr½htje†r¾hŒXofr¿†rÀjsjˆrÁhŒj†rÂjsjˆrÃhŒj
†rÄjsjˆrÅhŒXbrƆrÇhtji†rÈhtj*†rÉjsX

rʆrËjKXlemmar̆rÍjsjˆrÎhŒXone_le_powerrφrÐjsjˆrÑhtje†rÒhŒXsimprÓ†rÔhtji†rÕhtj3†rÖjsjˆr×jÁj†rØjÁX1 rÙ†rÚjÝX\<le>rÛ†rÜjÁX a r݆rÞjÝX\<Longrightarrow>r߆ràjÁX 1 rá†râjÝX\<le>rã†räjÁX a ^ nrå†ræjÁj†rçjsX
  rè†réjXusingrê†rëjsjˆrìhŒX
power_monorí†rîjsjˆrïhtje†rðhŒXofrñ†ròjsjˆróhŒjã†rôjsjˆrõhŒj
†röjsjˆr÷hŒjU†røhtji†rùjsjˆrújXbyrû†rüjsjˆrýhŒXsimprþ†rÿjsX

r†rjKXlemmar†rjsjˆrhŒXpower_le_oner†rhtj3†rjsjˆrjÁj†r	jÝX	\<lbrakk>r
†rjÁX0 r†r
jÝX\<le>r†rjÁX a; a r†rjÝX\<le>r†rjÁX 1r†rjÝX	\<rbrakk>r†rjÁjˆrjÝX\<Longrightarrow>r†rjÁX a ^ n r†rjÝX\<le>r†rjÁX 1r†r jÁj†r!jsX
  r"†r#jXusingr$†r%jsjˆr&hŒX
power_monor'†r(jsjˆr)htje†r*hŒXofr+†r,jsjˆr-hŒj
†r.jsjˆr/hŒjã†r0jsjˆr1hŒjU†r2htji†r3jsjˆr4jXbyr5†r6jsjˆr7hŒXsimpr8†r9jsX

r:†r;jKXlemmar<†r=jsjˆr>hŒXpower_gt1_lemmar?†r@htj3†rAjsX
  rB†rCjRXassumesrD†rEjsjˆrFhŒXgt1rG†rHhtj3†rIjsjˆrJjÁj†rKjÁX1 < arL†rMjÁj†rNjsX
  rO†rPjRXshowsrQ†rRjsjˆrSjÁj†rTjÁX
1 < a * a ^ nrU†rVjÁj†rWjsjÚ†rXjXproofrY†rZjsjˆr[htX-r\†r]jsX
  r^†r_jXfromr`†rajsjˆrbhŒXgt1rc†rdjsjˆrejXhaverf†rgjsjˆrhjÁj†rijÁX0 rj†rkjÝX\<le>rl†rmjÁX arn†rojÁj†rpjsX
    rq†rrjXbyrs†rtjsjˆruhtj†rvhŒXfactrw†rxjsjˆryhŒXorder_transrz†r{jsjˆr|htje†r}hŒXOFr~†rjsjˆr€hŒXzero_le_oner†r‚jsjˆrƒhŒXless_imp_ler„†r…htji†r†htj*†r‡jsX
  rˆ†r‰jXhaverІr‹jsjˆrŒe(jÁj†rjÁX
1 * 1 < a * 1rކrjÁj†rjsjˆr‘jXusingr’†r“jsjˆr”hŒXgt1r•†r–jsjˆr—jXbyr˜†r™jsjˆršhŒXsimpr›†rœjsX
  r†ržjXalsorŸ†r jsjˆr¡jXhaver¢†r£jsjˆr¤jÁj†r¥jÝX\<dots>r¦†r§jÁjˆr¨jÝX\<le>r©†rªjÁX
 a * a ^ nr«†r¬jÁj†r­jsjˆr®jXusingr¯†r°jsjˆr±hŒXgt1r²†r³jsX
    r´†rµjXbyr¶†r·jsjˆr¸htj†r¹hŒXsimprº†r»jsjˆr¼hŒXonlyr½†r¾htj3†r¿jsjˆrÀhŒX	mult_monorÁ†rÂjsjˆrÃjëjC	†rÄjëX0 rņrÆjÝX\<le>rdžrÈjëX arɆrÊjëjC	†rËjsjˆrÌhŒXone_le_powerr͆rÎjsjˆrÏhŒXorder_less_imp_lerІrÑjsX	
        rÒ†rÓhŒXzero_le_onerÔ†rÕjsjˆrÖhŒX
order_reflr׆rØhtj*†rÙjsX
  rÚ†rÛjXfinallyr܆rÝjsjˆrÞjXshowr߆ràjsjˆráhtj†râhŒXthesisrã†räjsjˆråjXbyræ†rçjsjˆrèhŒXsimpré†rêjsjÚ†rëjXqedrì†ríjsX

rî†rïjKXlemmarð†rñjsjˆròhŒX	power_gt1ró†rôhtj3†rõjsX
  rö†r÷jÁj†røjÁX1 < a rù†rújÝX\<Longrightarrow>rû†rüjÁX 1 < a ^ Suc nrý†rþjÁj†rÿjsX
  r†rjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr	†r
htj3†rjsjˆrhŒXpower_gt1_lemmar
†rhtj*†rjsX

r†rjKXlemmar†rjsjˆrhŒXone_less_powerr†rjsjˆrhtje†rhŒXsimpr†rhtji†rhtj3†rjsX
  r†rjÁj†rjÁX1 < a r †r!jÝX\<Longrightarrow>r"†r#jÁX 0 < n r$†r%jÝX\<Longrightarrow>r&†r'jÁX
 1 < a ^ nr(†r)jÁj†r*jsX
  r+†r,jXbyr-†r.jsjˆr/htj†r0hŒXcasesr1†r2jsjˆr3hŒjU†r4htj*†r5jsjˆr6htj†r7hŒXsimp_allr8†r9jsjˆr:hŒXaddr;†r<htj3†r=jsjˆr>hŒXpower_gt1_lemmar?†r@htj*†rAjsX

rB†rCjKXlemmarD†rEjsjˆrFhŒXpower_le_imp_le_exprG†rHhtj3†rIjsX
  rJ†rKjRXassumesrL†rMjsjˆrNhŒXgt1rO†rPhtj3†rQjsjˆrRjÁj†rSjÁX1 < arT†rUjÁj†rVjsX
  rW†rXjRXshowsrY†rZjsjˆr[jÁj†r\jÁXa ^ m r]†r^jÝX\<le>r_†r`jÁX a ^ n ra†rbjÝX\<Longrightarrow>rc†rdjÁX m re†rfjÝX\<le>rg†rhjÁX nri†rjjÁj†rkjsjÚ†rljXproofrm†rnjsjˆrohtj†rphŒXinductrq†rrjsjˆrshŒjφrtjsjˆruhŒX	arbitraryrv†rwhtj3†rxjsjˆryhŒjU†rzhtj*†r{jsX
  r|†r}jXcaser~†rjsjˆr€hŒj†rjsX
  r‚†rƒjXshowr„†r…jsjˆr†htj†r‡jXcaserˆ†r‰jsjˆrŠjXbyr‹†rŒjsjˆrhŒXsimprކrjsjÚ†rjXnextr‘†r’jsX
  r“†r”jXcaser•†r–jsjˆr—htj†r˜hŒXSucr™†ršjsjˆr›hŒjφrœhtj*†rjsX
  rž†rŸjXshowr †r¡jsjˆr¢htj†r£jXcaser¤†r¥jsX
  r¦†r§jXproofr¨†r©jsjˆrªhtj†r«hŒXcasesr¬†r­jsjˆr®hŒjU†r¯htj*†r°jsX
    r±†r²jXcaser³†r´jsjˆrµhŒj†r¶jsX
    r·†r¸jXwithr¹†rºjsjˆr»hŒX	Suc.premsr¼†r½jsjˆr¾hŒXSuc.hypsr¿†rÀjsjˆrÁjXhaver†rÃjsjˆrÄjÁj†rÅjÁX
a * a ^ m rƆrÇjÝX\<le>rȆrÉjÁX 1rʆrËjÁj†rÌjsjˆrÍjXbyrΆrÏjsjˆrÐhŒXsimprцrÒjsX
    rÓ†rÔjXwithrÕ†rÖjsjˆr×hŒXgt1r؆rÙjsjˆrÚjXshowrÛ†rÜjsjˆrÝhtj†rÞhŒXthesisr߆ràjsX
      rá†râjXbyrã†räjsjˆråhtj†ræhŒXforcerç†rèjsjˆréhŒXsimprê†rëjsjˆrìhŒXonlyrí†rîhtj3†rïjsjˆrðhŒXpower_gt1_lemmarñ†ròjsX
          ró†rôhŒXnot_lessrõ†röjsjˆr÷htje†røhŒX	symmetricrù†rúhtji†rûhtj*†rüjsX
  rý†rþjXnextrÿ†rjsX
    r†rjXcaser†rjsjˆrhtj†rhŒXSucr†rjsjˆr	hŒjU†r
htj*†rjsX
    r†r
jXwithr†rjsjˆrhŒX	Suc.premsr†rjsjˆrhŒXSuc.hypsr†rjsjˆrjXshowr†rjsjˆrhtj†rhŒXthesisr†rjsX
      r†rjXbyr†r jsjˆr!htj†r"hŒXforcer#†r$jsjˆr%hŒXdestr&†r'htj3†r(jsjˆr)hŒXmult_left_le_imp_ler*†r+jsX
          r,†r-hŒXsimpr.†r/jsjˆr0hŒXaddr1†r2htj3†r3jsjˆr4hŒX
less_transr5†r6jsjˆr7htje†r8hŒXOFr9†r:jsjˆr;hŒX
zero_less_oner<†r=jsjˆr>hŒXgt1r?†r@htji†rAhtj*†rBjsX
  rC†rDjXqedrE†rFjsjÚ†rGjXqedrH†rIjsX

rJ†rKjXtextrL†rMhX{*rN†rOhX:Surely we can strengthen this? It holds for @{text "0<a<1"rP†rQhj:
†rRhX too.rS†rThX*}rU†rVjsjÚ†rWjKXlemmarX†rYjsjˆrZhŒXpower_inject_expr[†r\jsjˆr]htje†r^hŒXsimpr_†r`htji†rahtj3†rbjsX
  rc†rdjÁj†rejÁX1 < a rf†rgjÝX\<Longrightarrow>rh†rijÁX a ^ m = a ^ n rj†rkjÝX\<longleftrightarrow>rl†rmjÁX m = nrn†rojÁj†rpjsX
  rq†rrjXbyrs†rtjsjˆruhtj†rvhŒXforcerw†rxjsjˆryhŒXsimprz†r{jsjˆr|hŒXaddr}†r~htj3†rjsjˆr€hŒX
order_antisymr†r‚jsjˆrƒhŒXpower_le_imp_le_expr„†r…htj*†r†jsX

r‡†rˆjXtextr‰†rŠhX{*r‹†rŒhX+Can relax the first premise to @{term "0<a"r†rŽhj:
†rhX$ in the case of the
natural numbers.r†r‘hX*}r’†r“jsjÚ†r”jKXlemmar•†r–jsjˆr—hŒXpower_less_imp_less_expr˜†r™htj3†ršjsX
  r›†rœjÁj†rjÁX1 < a rž†rŸjÝX\<Longrightarrow>r †r¡jÁX a ^ m < a ^ n r¢†r£jÝX\<Longrightarrow>r¤†r¥jÁX m < nr¦†r§jÁj†r¨jsX
  r©†rªjXbyr«†r¬jsjˆr­htj†r®hŒXsimpr¯†r°jsjˆr±hŒXaddr²†r³htj3†r´jsjˆrµhŒX
order_less_ler¶†r·jsjˆr¸htje†r¹hŒXofrº†r»jsjˆr¼hŒjφr½jsjˆr¾hŒjU†r¿htji†rÀjsjˆrÁhŒXless_ler†rÃjsjˆrÄhtje†rÅhŒXofrƆrÇjsjˆrÈjÁj†rÉjÁXa^mrʆrËjÁj†rÌjsjˆrÍjÁj†rÎjÁXa^nrφrÐjÁj†rÑhtji†rÒjsX
    rÓ†rÔhŒXpower_le_imp_le_exprÕ†rÖhtj*†r×jsX

r؆rÙjKXlemmarÚ†rÛjsjˆrÜhŒXpower_strict_monor݆rÞjsjˆrßhtje†ràhŒXrule_formatrá†râhtji†rãhtj3†räjsX
  rå†ræjÁj†rçjÁXa < b rè†réjÝX\<Longrightarrow>rê†rëjÁX 0 rì†ríjÝX\<le>rî†rïjÁX a rð†rñjÝX\<Longrightarrow>rò†rójÁX 0 < n rô†rõjÝX\<longrightarrow>rö†r÷jÁX a ^ n < b ^ nrø†rùjÁj†rújsX
  rû†rüjXbyrý†rþjsjˆrÿhtj†rhŒXinductr†rjsjˆrhŒjU†rhtj*†rjsX
   r†rhtj†rhŒXautor	†r
jsjˆrhŒXsimpr†r
jsjˆrhŒXaddr†rhtj3†rjsjˆrhŒXmult_strict_monor†rjsjˆrhŒX
le_less_transr†rjsjˆrhtje†rhŒXofr†rjsjˆrhŒj†rjsjˆrhŒj
†rjsjˆr hŒjƆr!htji†r"htj*†r#jsX

r$†r%jXtextr&†r'hX{*r(†r)hX(Lemma for @{text power_strict_decreasingr*†r+hj:
†r,hX*}r-†r.jsjÚ†r/jKXlemmar0†r1jsjˆr2hŒXpower_Suc_lessr3†r4htj3†r5jsX
  r6†r7jÁj†r8jÁX0 < a r9†r:jÝX\<Longrightarrow>r;†r<jÁX a < 1 r=†r>jÝX\<Longrightarrow>r?†r@jÁX a * a ^ n < a ^ nrA†rBjÁj†rCjsX
  rD†rEjXbyrF†rGjsjˆrHhtj†rIhŒXinductrJ†rKjsjˆrLhŒjU†rMhtj*†rNjsX
    rO†rPhtj†rQhŒXautorR†rSjsjˆrThŒXsimprU†rVjsjˆrWhŒXaddrX†rYhtj3†rZjsjˆr[hŒXmult_strict_left_monor\†r]htj*†r^jsX

r_†r`jKXlemmara†rbjsjˆrchŒXpower_strict_decreasingrd†rejsjˆrfhtje†rghŒXrule_formatrh†rihtji†rjhtj3†rkjsX
  rl†rmjÁj†rnjÁXn < N ro†rpjÝX\<Longrightarrow>rq†rrjÁX 0 < a rs†rtjÝX\<Longrightarrow>ru†rvjÁX a < 1 rw†rxjÝX\<longrightarrow>ry†rzjÁX a ^ N < a ^ nr{†r|jÁj†r}jsjÚ†r~jXproofr†r€jsjˆrhtj†r‚hŒXinductrƒ†r„jsjˆr…hŒXNr††r‡htj*†rˆjsX
  r‰†rŠjXcaser‹†rŒjsjˆrhŒj†rŽjsjˆrjXthenr†r‘jsjˆr’jXshowr“†r”jsjˆr•htj†r–jXcaser—†r˜jsjˆr™jXbyrš†r›jsjˆrœhŒXsimpr†ržjsjÚ†rŸjXnextr †r¡jsX
  r¢†r£jXcaser¤†r¥jsjˆr¦htj†r§hŒXSucr¨†r©jsjˆrªhŒj††r«htj*†r¬jsjˆr­jXthenr®†r¯jsjˆr°jXshowr±†r²jsjˆr³htj†r´jXcaserµ†r¶jsX 
  r·†r¸jRXapplyr¹†rºjsjˆr»htj†r¼hŒXautor½†r¾jsjˆr¿hŒXsimprÀ†rÁjsjˆrÂhŒXaddrÆrÄhtj3†rÅjsjˆrÆhŒXpower_Suc_lessrdžrÈjsjˆrÉhŒXless_Suc_eqrʆrËhtj*†rÌjsX
  r͆rÎjRXapplyrφrÐjsjˆrÑhtj†rÒhŒXsubgoal_tacrÓ†rÔjsjˆrÕjÁj†rÖjÁXa * a^N < 1 * a^nr׆rØjÁj†rÙhtj*†rÚjsX
  rÛ†rÜjRXapplyr݆rÞjsjˆrßhŒXsimprà†rájsX
  râ†rãjRXapplyrä†råjsjˆræhtj†rçhŒXrulerè†réjsjˆrêhŒXmult_strict_monorë†rìhtj*†ríjsjˆrîjRXapplyrï†rðjsjˆrñhŒXautorò†rójsX
  rô†rõjXdonerö†r÷jsjÚ†røjXqedrù†rújsX

rû†rüjXtextrý†rþhX{*rÿ†rhX6Proof resembles that of @{text power_strict_decreasingr†rhj:
†rhX*}r†rjsjÚ†rjKXlemmar†rjsjˆr	hŒXpower_decreasingr
†rjsjˆrhtje†r
hŒXrule_formatr†rhtji†rhtj3†rjsX
  r†rjÁj†rjÁXn r†rjÝX\<le>r†rjÁX N r†rjÝX\<Longrightarrow>r†rjÁX 0 r†rjÝX\<le>r†r jÁX a r!†r"jÝX\<Longrightarrow>r#†r$jÁX a r%†r&jÝX\<le>r'†r(jÁX 1 r)†r*jÝX\<longrightarrow>r+†r,jÁX a ^ N r-†r.jÝX\<le>r/†r0jÁX a ^ nr1†r2jÁj†r3jsjÚ†r4jXproofr5†r6jsjˆr7htj†r8hŒXinductr9†r:jsjˆr;hŒj††r<htj*†r=jsX
  r>†r?jXcaser@†rAjsjˆrBhŒj†rCjsjˆrDjXthenrE†rFjsjˆrGjXshowrH†rIjsjˆrJhtj†rKjXcaserL†rMjsjˆrNjXbyrO†rPjsjˆrQhŒXsimprR†rSjsjÚ†rTjXnextrU†rVjsX
  rW†rXjXcaserY†rZjsjˆr[htj†r\hŒXSucr]†r^jsjˆr_hŒj††r`htj*†rajsjˆrbjXthenrc†rdjsjˆrejXshowrf†rgjsjˆrhhtj†rijXcaserj†rkjsX 
  rl†rmjRXapplyrn†rojsjˆrphtj†rqhŒXautorr†rsjsjˆrthŒXsimpru†rvjsjˆrwhŒXaddrx†ryhtj3†rzjsjˆr{hŒX	le_Suc_eqr|†r}htj*†r~jsX
  r†r€jRXapplyr†r‚jsjˆrƒhtj†r„hŒXsubgoal_tacr…†r†jsjˆr‡jÁj†rˆjÁXa * a^N r‰†rŠjÝX\<le>r‹†rŒjÁX 1 * a^nr†rŽjÁj†rhtj"†rjsjˆr‘hŒXsimpr’†r“htj*†r”jsX
  r•†r–jRXapplyr—†r˜jsjˆr™htj†ršhŒXruler›†rœjsjˆrhŒX	mult_monorž†rŸhtj*†r jsjˆr¡jRXapplyr¢†r£jsjˆr¤hŒXautor¥†r¦jsX
  r§†r¨jXdoner©†rªjsjÚ†r«jXqedr¬†r­jsX

r®†r¯jKXlemmar°†r±jsjˆr²hŒXpower_Suc_less_oner³†r´htj3†rµjsX
  r¶†r·jÁj†r¸jÁX0 < a r¹†rºjÝX\<Longrightarrow>r»†r¼jÁX a < 1 r½†r¾jÝX\<Longrightarrow>r¿†rÀjÁX a ^ Suc n < 1rÁ†rÂjÁj†rÃjsX
  rĆrÅjXusingrƆrÇjsjˆrÈhŒXpower_strict_decreasingrɆrÊjsjˆrËhtje†rÌhŒXofr͆rÎjsjˆrÏhŒj†rÐjsjˆrÑjÁj†rÒjÁXSuc nrÓ†rÔjÁj†rÕjsjˆrÖhŒj
†r×htji†rØjsjˆrÙjXbyrÚ†rÛjsjˆrÜhŒXsimpr݆rÞjsX

r߆ràjXtextrá†râhX{*rã†rähX<Proof again resembles that of @{text power_strict_decreasingrå†ræhj:
†rçhX*}rè†réjsjÚ†rêjKXlemmarë†rìjsjˆríhŒXpower_increasingrî†rïjsjˆrðhtje†rñhŒXrule_formatrò†róhtji†rôhtj3†rõjsX
  rö†r÷jÁj†røjÁXn rù†rújÝX\<le>rû†rüjÁX N rý†rþjÝX\<Longrightarrow>rÿ†rjÁX 1 r†rjÝX\<le>r†rjÁX a r†rjÝX\<Longrightarrow>r†rjÁX a ^ n r	†r
jÝX\<le>r†rjÁX a ^ Nr
†rjÁj†rjsjÚ†rjXproofr†rjsjˆrhtj†rhŒXinductr†rjsjˆrhŒj††rhtj*†rjsX
  r†rjXcaser†rjsjˆrhŒj†rjsjˆr jXthenr!†r"jsjˆr#jXshowr$†r%jsjˆr&htj†r'jXcaser(†r)jsjˆr*jXbyr+†r,jsjˆr-hŒXsimpr.†r/jsjÚ†r0jXnextr1†r2jsX
  r3†r4jXcaser5†r6jsjˆr7htj†r8hŒXSucr9†r:jsjˆr;hŒj††r<htj*†r=jsjˆr>jXthenr?†r@jsjˆrAjXshowrB†rCjsjˆrDhtj†rEjXcaserF†rGjsX 
  rH†rIjRXapplyrJ†rKjsjˆrLhtj†rMhŒXautorN†rOjsjˆrPhŒXsimprQ†rRjsjˆrShŒXaddrT†rUhtj3†rVjsjˆrWhŒX	le_Suc_eqrX†rYhtj*†rZjsX
  r[†r\jRXapplyr]†r^jsjˆr_htj†r`hŒXsubgoal_tacra†rbjsjˆrcjÁj†rdjÁX1 * a^n re†rfjÝX\<le>rg†rhjÁX a * a^Nri†rjjÁj†rkhtj"†rljsjˆrmhŒXsimprn†rohtj*†rpjsX
  rq†rrjRXapplyrs†rtjsjˆruhtj†rvhŒXrulerw†rxjsjˆryhŒX	mult_monorz†r{htj*†r|jsjˆr}jRXapplyr~†rjsjˆr€htj†rhŒXautor‚†rƒjsjˆr„hŒXsimpr…†r†jsjˆr‡hŒXaddrˆ†r‰htj3†rŠjsjˆr‹hŒXorder_transrŒ†rjsjˆrŽhtje†rhŒXOFr†r‘jsjˆr’hŒXzero_le_oner“†r”htji†r•htj*†r–jsX
  r—†r˜jXdoner™†ršjsjÚ†r›jXqedrœ†rjsX

rž†rŸjXtextr †r¡hX{*r¢†r£hX(Lemma for @{text power_strict_increasingr¤†r¥hj:
†r¦hX*}r§†r¨jsjÚ†r©jKXlemmarª†r«jsjˆr¬hŒXpower_less_power_Sucr­†r®htj3†r¯jsX
  r°†r±jÁj†r²jÁX1 < a r³†r´jÝX\<Longrightarrow>rµ†r¶jÁX a ^ n < a * a ^ nr·†r¸jÁj†r¹jsX
  rº†r»jXbyr¼†r½jsjˆr¾htj†r¿hŒXinductrÀ†rÁjsjˆrÂhŒjU†rÃhtj*†rÄjsjˆrÅhtj†rÆhŒXautordžrÈjsjˆrÉhŒXsimprʆrËjsjˆrÌhŒXaddr͆rÎhtj3†rÏjsjˆrÐhŒXmult_strict_left_monorцrÒjsjˆrÓhŒX
less_transrÔ†rÕjsjˆrÖhtje†r×hŒXOFr؆rÙjsjˆrÚhŒX
zero_less_onerÛ†rÜhtji†rÝhtj*†rÞjsX

r߆ràjKXlemmará†râjsjˆrãhŒXpower_strict_increasingrä†råjsjˆræhtje†rçhŒXrule_formatrè†réhtji†rêhtj3†rëjsX
  rì†ríjÁj†rîjÁXn < N rï†rðjÝX\<Longrightarrow>rñ†ròjÁX 1 < a ró†rôjÝX\<longrightarrow>rõ†röjÁX a ^ n < a ^ Nr÷†røjÁj†rùjsjÚ†rújXproofrû†rüjsjˆrýhtj†rþhŒXinductrÿ†rjsjˆrhŒj††rhtj*†rjsX
  r†rjXcaser†rjsjˆrhŒj†r	jsjˆr
jXthenr†rjsjˆr
jXshowr†rjsjˆrhtj†rjXcaser†rjsjˆrjXbyr†rjsjˆrhŒXsimpr†rjsjÚ†rjXnextr†rjsX
  r†rjXcaser†r jsjˆr!htj†r"hŒXSucr#†r$jsjˆr%hŒj††r&htj*†r'jsjˆr(jXthenr)†r*jsjˆr+jXshowr,†r-jsjˆr.htj†r/jXcaser0†r1jsX 
  r2†r3jRXapplyr4†r5jsjˆr6htj†r7hŒXautor8†r9jsjˆr:hŒXsimpr;†r<jsjˆr=hŒXaddr>†r?htj3†r@jsjˆrAhŒXpower_less_power_SucrB†rCjsjˆrDhŒXless_Suc_eqrE†rFhtj*†rGjsX
  rH†rIjRXapplyrJ†rKjsjˆrLhtj†rMhŒXsubgoal_tacrN†rOjsjˆrPjÁj†rQjÁX1 * a^n < a * a^NrR†rSjÁj†rThtj"†rUjsjˆrVhŒXsimprW†rXhtj*†rYjsX
  rZ†r[jRXapplyr\†r]jsjˆr^htj†r_hŒXruler`†rajsjˆrbhŒXmult_strict_monorc†rdhtj*†rejsjˆrfe(jRXapplyrg†rhjsjˆrihtj†rjhŒXautork†rljsjˆrmhŒXsimprn†rojsjˆrphŒXaddrq†rrhtj3†rsjsjˆrthŒX
less_transru†rvjsjˆrwhtje†rxhŒXOFry†rzjsjˆr{hŒX
zero_less_oner|†r}htji†r~jsjˆrhŒXless_imp_ler€†rhtj*†r‚jsX
  rƒ†r„jXdoner…†r†jsjÚ†r‡jXqedrˆ†r‰jsX

rІr‹jKXlemmarŒ†rjsjˆrŽhŒXpower_increasing_iffr†rjsjˆr‘htje†r’hŒXsimpr“†r”htji†r•htj3†r–jsX
  r—†r˜jÁj†r™jÁX1 < b rš†r›jÝX\<Longrightarrow>rœ†rjÁX b ^ x rž†rŸjÝX\<le>r †r¡jÁX b ^ y r¢†r£jÝX\<longleftrightarrow>r¤†r¥jÁX x r¦†r§jÝX\<le>r¨†r©jÁX yrª†r«jÁj†r¬jsX
  r­†r®jXbyr¯†r°jsjˆr±htj†r²hŒXblastr³†r´jsjˆrµhŒXintror¶†r·htj3†r¸jsjˆr¹hŒXpower_le_imp_le_exprº†r»jsjˆr¼hŒXpower_increasingr½†r¾jsjˆr¿hŒXless_imp_lerÀ†rÁhtj*†rÂjsX

rÆrÄjKXlemmarņrÆjsjˆrÇhŒXpower_strict_increasing_iffrȆrÉjsjˆrÊhtje†rËhŒXsimpr̆rÍhtji†rÎhtj3†rÏjsX
  rІrÑjÁj†rÒjÁX1 < b rÓ†rÔjÝX\<Longrightarrow>rÕ†rÖjÁX b ^ x < b ^ y r׆rØjÝX\<longleftrightarrow>rÙ†rÚjÁX x < yrÛ†rÜjÁj†rÝjsjÚ†rÞjXbyr߆ràjsjˆráhtj†râhŒXblastrã†räjsjˆråhŒXintroræ†rçhtj3†rèjsjˆréhŒXpower_less_imp_less_exprê†rëjsjˆrìhŒXpower_strict_increasingrí†rîhtj*†rïjsX 

rð†rñjKXlemmarò†rójsjˆrôhŒXpower_le_imp_le_baserõ†röhtj3†r÷jsX
  rø†rùjRXassumesrú†rûjsjˆrühŒXlerý†rþhtj3†rÿjsjˆrjÁj†rjÁX
a ^ Suc n r†rjÝX\<le>r†rjÁX
 b ^ Suc nr†rjÁj†rjsX
    r	†r
jRXandr†rjsjˆr
hŒXynonnegr†rhtj3†rjsjˆrjÁj†rjÁX0 r†rjÝX\<le>r†rjÁX br†rjÁj†rjsX
  r†rjRXshowsr†rjsjˆrjÁj†rjÁXa r †r!jÝX\<le>r"†r#jÁX br$†r%jÁj†r&jsjÚ†r'jXproofr(†r)jsjˆr*htj†r+hŒXruler,†r-jsjˆr.hŒXccontrr/†r0htj*†r1jsX
  r2†r3jXassumer4†r5jsjˆr6jÁj†r7jÁX~ a r8†r9jÝX\<le>r:†r;jÁX br<†r=jÁj†r>jsX
  r?†r@jXthenrA†rBjsjˆrCjXhaverD†rEjsjˆrFjÁj†rGjÁXb < arH†rIjÁj†rJjsjˆrKjXbyrL†rMjsjˆrNhtj†rOhŒXsimprP†rQjsjˆrRhŒXonlyrS†rThtj3†rUjsjˆrVhŒXlinorder_not_lerW†rXhtj*†rYjsX
  rZ†r[jXthenr\†r]jsjˆr^jXhaver_†r`jsjˆrajÁj†rbjÁXb ^ Suc n < a ^ Suc nrc†rdjÁj†rejsX
    rf†rgjXbyrh†rijsjˆrjhtj†rkhŒXsimprl†rmjsjˆrnhŒXonlyro†rphtj3†rqjsjˆrrhŒXassmsrs†rtjsjˆruhŒXpower_strict_monorv†rwhtj*†rxjsX
  ry†rzjXfromr{†r|jsjˆr}hŒXler~†rjsjˆr€jRXandr†r‚jsjˆrƒhŒXthisr„†r…jsjˆr†jXshowr‡†rˆjsjˆr‰hŒXFalserІr‹jsX
    rŒ†rjXbyrކrjsjˆrhtj†r‘hŒXsimpr’†r“jsjˆr”hŒXaddr•†r–htj3†r—jsjˆr˜hŒXlinorder_not_lessr™†ršjsjˆr›htje†rœhŒX	symmetricr†ržhtji†rŸhtj*†r jsjÚ†r¡jXqedr¢†r£jsX

r¤†r¥jKXlemmar¦†r§jsjˆr¨hŒXpower_less_imp_less_baser©†rªhtj3†r«jsX
  r¬†r­jRXassumesr®†r¯jsjˆr°hŒXlessr±†r²htj3†r³jsjˆr´jÁj†rµjÁX
a ^ n < b ^ nr¶†r·jÁj†r¸jsX
  r¹†rºjRXassumesr»†r¼jsjˆr½hŒXnonnegr¾†r¿htj3†rÀjsjˆrÁjÁj†rÂjÁX0 rÆrÄjÝX\<le>rņrÆjÁX brdžrÈjÁj†rÉjsX
  rʆrËjRXshowsr̆rÍjsjˆrÎjÁj†rÏjÁXa < brІrÑjÁj†rÒjsjÚ†rÓjXproofrÔ†rÕjsjˆrÖhtj†r×hŒXruler؆rÙjsjˆrÚhŒXcontrapos_pprÛ†rÜjsjˆrÝhtje†rÞhŒXOFr߆ràjsjˆráhŒXlessrâ†rãhtji†rähtj*†råjsX
  ræ†rçjXassumerè†réjsjˆrêjÁj†rëjÁX~ a < brì†ríjÁj†rîjsX
  rï†rðjXhencerñ†ròjsjˆrójÁj†rôjÁXb rõ†röjÝX\<le>r÷†røjÁX arù†rújÁj†rûjsjˆrüjXbyrý†rþjsjˆrÿhtj†rhŒXsimpr†rjsjˆrhŒXonlyr†rhtj3†rjsjˆrhŒXlinorder_not_lessr†r	htj*†r
jsX
  r†rjXhencer
†rjsjˆrjÁj†rjÁXb ^ n r†rjÝX\<le>r†rjÁX a ^ nr†rjÁj†rjsjˆrjXusingr†rjsjˆrhŒXnonnegr†rjsjˆrjXbyr†r jsjˆr!htj†r"hŒXruler#†r$jsjˆr%hŒX
power_monor&†r'htj*†r(jsX
  r)†r*jXthusr+†r,jsjˆr-jÁj†r.jÝX\<not>r/†r0jÁX a ^ n < b ^ nr1†r2jÁj†r3jsjˆr4jXbyr5†r6jsjˆr7htj†r8hŒXsimpr9†r:jsjˆr;hŒXonlyr<†r=htj3†r>jsjˆr?hŒXlinorder_not_lessr@†rAhtj*†rBjsjÚ†rCjXqedrD†rEjsX

rF†rGjKXlemmarH†rIjsjˆrJhŒXpower_inject_baserK†rLhtj3†rMjsX
  rN†rOjÁj†rPjÁXa ^ Suc n = b ^ Suc n rQ†rRjÝX\<Longrightarrow>rS†rTjÁX 0 rU†rVjÝX\<le>rW†rXjÁX a rY†rZjÝX\<Longrightarrow>r[†r\jÁX 0 r]†r^jÝX\<le>r_†r`jÁX b ra†rbjÝX\<Longrightarrow>rc†rdjÁX a = bre†rfjÁj†rgjsjÚ†rhjXbyri†rjjsjˆrkhtj†rlhŒXblastrm†rnjsjˆrohŒXintrorp†rqhtj3†rrjsjˆrshŒXpower_le_imp_le_basert†rujsjˆrvhŒXantisymrw†rxjsjˆryhŒXeq_reflrz†r{jsjˆr|hŒXsymr}†r~htj*†rjsX

r€†rjKXlemmar‚†rƒjsjˆr„hŒXpower_eq_imp_eq_baser…†r†htj3†r‡jsX
  rˆ†r‰jÁj†rŠjÁXa ^ n = b ^ n r‹†rŒjÝX\<Longrightarrow>r†rŽjÁX 0 r†rjÝX\<le>r‘†r’jÁX a r“†r”jÝX\<Longrightarrow>r•†r–jÁX 0 r—†r˜jÝX\<le>r™†ršjÁX b r›†rœjÝX\<Longrightarrow>r†ržjÁX 0 < n rŸ†r jÝX\<Longrightarrow>r¡†r¢jÁX a = br£†r¤jÁj†r¥jsX
  r¦†r§jXbyr¨†r©jsjˆrªhtj†r«hŒXcasesr¬†r­jsjˆr®hŒjU†r¯htj*†r°jsjˆr±htj†r²hŒXsimp_allr³†r´jsjˆrµhŒXdelr¶†r·htj3†r¸jsjˆr¹hŒX	power_Sucrº†r»htj"†r¼jsjˆr½hŒXruler¾†r¿jsjˆrÀhŒXpower_inject_baserÁ†rÂhtj*†rÃjsX

rĆrÅjKXlemmarƆrÇjsjˆrÈhŒXpower2_le_imp_lerɆrÊhtj3†rËjsX
  r̆rÍjÁj†rÎjÁjцrÏjÁj\†rÐjÁX<^sup>2 rцrÒjÝX\<le>rÓ†rÔjÁX yrÕ†rÖjÁj\†r×jÁX<^sup>2 r؆rÙjÝX\<Longrightarrow>rÚ†rÛjÁX 0 r܆rÝjÝX\<le>rÞ†rßjÁX y rà†rájÝX\<Longrightarrow>râ†rãjÁX x rä†råjÝX\<le>ræ†rçjÁX yrè†réjÁj†rêjsX
  rë†rìjX	unfoldingrí†rîjsjˆrïhŒXnumeral_2_eq_2rð†rñjsjˆròjXbyró†rôjsjˆrõhtj†röhŒXruler÷†røjsjˆrùhŒXpower_le_imp_le_baserú†rûhtj*†rüjsX

rý†rþjKXlemmarÿ†rjsjˆrhŒXpower2_less_imp_lessr†rhtj3†rjsX
  r†rjÁj†rjÁjцrjÁj\†r	jÁX<^sup>2 < yr
†rjÁj\†rjÁX<^sup>2 r
†rjÝX\<Longrightarrow>r†rjÁX 0 r†rjÝX\<le>r†rjÁX y r†rjÝX\<Longrightarrow>r†rjÁX x < yr†rjÁj†rjsX
  r†rjXbyr†rjsjˆr htj†r!hŒXruler"†r#jsjˆr$hŒXpower_less_imp_less_baser%†r&htj*†r'jsX

r(†r)jKXlemmar*†r+jsjˆr,hŒXpower2_eq_imp_eqr-†r.htj3†r/jsX
  r0†r1jÁj†r2jÁjцr3jÁj\†r4jÁX<^sup>2 = yr5†r6jÁj\†r7jÁX<^sup>2 r8†r9jÝX\<Longrightarrow>r:†r;jÁX 0 r<†r=jÝX\<le>r>†r?jÁX x r@†rAjÝX\<Longrightarrow>rB†rCjÁX 0 rD†rEjÝX\<le>rF†rGjÁX y rH†rIjÝX\<Longrightarrow>rJ†rKjÁX x = yrL†rMjÁj†rNjsX
  rO†rPjX	unfoldingrQ†rRjsjˆrShŒXnumeral_2_eq_2rT†rUjsjˆrVjXbyrW†rXjsjˆrYhtj†rZhŒXeruler[†r\jsjˆr]htj†r^hŒX2r_†r`htj*†rajsjˆrbhŒXpower_eq_imp_eq_baserc†rdhtj*†rejsjˆrfhŒXsimprg†rhjsX

ri†rjjXendrk†rljsX

rm†rnjXcontextro†rpjsjˆrqhŒXlinordered_ring_strictrr†rsjsjÚ†rtjXbeginru†rvjsX

rw†rxjKXlemmary†rzjsjˆr{hŒXsum_squares_eq_zero_iffr|†r}htj3†r~jsX
  r†r€jÁj†rjÁXx * x + y * y = 0 r‚†rƒjÝX\<longleftrightarrow>r„†r…jÁX x = 0 r††r‡jÝX\<and>rˆ†r‰jÁX y = 0rІr‹jÁj†rŒjsX
  r†rŽjXbyr†rjsjˆr‘htj†r’hŒXsimpr“†r”jsjˆr•hŒXaddr–†r—htj3†r˜jsjˆr™hŒXadd_nonneg_eq_0_iffrš†r›htj*†rœjsX

r†ržjKXlemmarŸ†r jsjˆr¡hŒXsum_squares_le_zero_iffr¢†r£htj3†r¤jsX
  r¥†r¦jÁj†r§jÁXx * x + y * y r¨†r©jÝX\<le>rª†r«jÁX 0 r¬†r­jÝX\<longleftrightarrow>r®†r¯jÁX x = 0 r°†r±jÝX\<and>r²†r³jÁX y = 0r´†rµjÁj†r¶jsX
  r·†r¸jXbyr¹†rºjsjˆr»htj†r¼hŒXsimpr½†r¾jsjˆr¿hŒXaddrÀ†rÁhtj3†rÂjsjˆrÃhŒXle_lessrĆrÅjsjˆrÆhŒXnot_sum_squares_lt_zerordžrÈjsjˆrÉhŒXsum_squares_eq_zero_iffrʆrËhtj*†rÌjsX

r͆rÎjKXlemmarφrÐjsjˆrÑhŒXsum_squares_gt_zero_iffrÒ†rÓhtj3†rÔjsX
  rÕ†rÖjÁj†r×jÁX0 < x * x + y * y r؆rÙjÝX\<longleftrightarrow>rÚ†rÛjÁX x r܆rÝjÝX\<noteq>rÞ†rßjÁX 0 rà†rájÝX\<or>râ†rãjÁX y rä†råjÝX\<noteq>ræ†rçjÁX 0rè†réjÁj†rêjsX
  rë†rìjXbyrí†rîjsjˆrïhtj†rðhŒXsimprñ†ròjsjˆróhŒXaddrô†rõhtj3†röjsjˆr÷hŒXnot_lerø†rùjsjˆrúhtje†rûhŒX	symmetricrü†rýhtji†rþjsjˆrÿhŒXsum_squares_le_zero_iffr†rhtj*†rjsX

r†rjXendr†rjsX

r†rjXcontextr	†r
jsjˆrhŒXlinordered_idomr†r
jsjÚ†rjXbeginr†rjsX

r†rjKXlemmar†rjsjˆrhŒX	power_absr†rhtj3†rjsX
  r†rjÁj†rjÁXabs (a ^ n) = abs a ^ nr†rjÁj†rjsX
  r†r jXbyr!†r"jsjˆr#htj†r$hŒXinductr%†r&jsjˆr'hŒjU†r(htj*†r)jsjˆr*htj†r+hŒXautor,†r-jsjˆr.hŒXsimpr/†r0jsjˆr1hŒXaddr2†r3htj3†r4jsjˆr5hŒXabs_multr6†r7htj*†r8jsX

r9†r:jKXlemmar;†r<jsjˆr=hŒXabs_power_minusr>†r?jsjˆr@htje†rAhŒXsimprB†rChtji†rDhtj3†rEjsX
  rF†rGjÁj†rHjÁXabs ((-a) ^ n) = abs (a ^ n)rI†rJjÁj†rKjsX
  rL†rMjXbyrN†rOjsjˆrPhtj†rQhŒXsimprR†rSjsjˆrThŒXaddrU†rVhtj3†rWjsjˆrXhŒX	power_absrY†rZhtj*†r[jsX

r\†r]jKXlemmar^†r_jsjˆr`hŒXzero_less_power_abs_iffra†rbjsjˆrchtje†rdhŒXsimpre†rfhtj"†rgjsjˆrhhŒXno_atpri†rjhtji†rkhtj3†rljsX
  rm†rnjÁj†rojÁX0 < abs a ^ n rp†rqjÝX\<longleftrightarrow>rr†rsjÁX a rt†rujÝX\<noteq>rv†rwjÁX 0 rx†ryjÝX\<or>rz†r{jÁX n = 0r|†r}jÁj†r~jsjÚ†rjXproofr€†rjsjˆr‚htj†rƒhŒXinductr„†r…jsjˆr†hŒjU†r‡htj*†rˆjsX
  r‰†rŠjXcaser‹†rŒjsjˆrhŒj†rŽjsjˆrjXshowr†r‘jsjˆr’htj†r“jXcaser”†r•jsjˆr–jXbyr—†r˜jsjˆr™hŒXsimprš†r›jsjÚ†rœjXnextr†ržjsX
  rŸ†r jXcaser¡†r¢jsjˆr£htj†r¤hŒXSucr¥†r¦jsjˆr§hŒjU†r¨htj*†r©jsjˆrªjXshowr«†r¬jsjˆr­htj†r®jXcaser¯†r°jsjˆr±jXbyr²†r³jsjˆr´htj†rµhŒXautor¶†r·jsjˆr¸hŒXsimpr¹†rºjsjˆr»hŒXaddr¼†r½htj3†r¾jsjˆr¿hŒXSucrÀ†rÁjsjˆrÂhŒXzero_less_mult_iffrÆrÄhtj*†rÅjsjÚ†rÆjXqedrdžrÈjsX

rɆrÊjKXlemmarˆrÌjsjˆrÍhŒXzero_le_power_absrΆrÏjsjˆrÐhtje†rÑhŒXsimprÒ†rÓhtji†rÔhtj3†rÕjsX
  rÖ†r×jÁj†rØjÁX0 rÙ†rÚjÝX\<le>rÛ†rÜjÁX
 abs a ^ nr݆rÞjÁj†rßjsX
  rà†rájXbyrâ†rãjsjˆrähtj†råhŒXruleræ†rçjsjˆrèhŒX
zero_le_powerré†rêjsjˆrëhtje†rìhŒXOFrí†rîjsjˆrïhŒXabs_ge_zerorð†rñhtji†ròhtj*†rójsX

rô†rõjKXlemmarö†r÷jsjˆrøhŒXzero_le_power2rù†rújsjˆrûhtje†rühŒXsimprý†rþhtji†rÿhtj3†rjsX
  r†rjÁj†rjÁX0 r†rjÝX\<le>r†rjÁX ar†r	jÁj\†r
jÁX<^sup>2r†rjÁj†r
jsX
  r†rjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒXpower2_eq_squarer†rhtj*†rjsX

r†rjKXlemmar †r!jsjˆr"hŒXzero_less_power2r#†r$jsjˆr%htje†r&hŒXsimpr'†r(htji†r)htj3†r*jsX
  r+†r,jÁj†r-jÁX0 < ar.†r/jÁj\†r0jÁX<^sup>2 r1†r2jÝX\<longleftrightarrow>r3†r4jÁX a r5†r6jÝX\<noteq>r7†r8jÁX 0r9†r:jÁj†r;jsX
  r<†r=jXbyr>†r?jsjˆr@htj†rAhŒXforcerB†rCjsjˆrDhŒXsimprE†rFjsjˆrGhŒXaddrH†rIhtj3†rJjsjˆrKhŒXpower2_eq_squarerL†rMjsjˆrNhŒXzero_less_mult_iffrO†rPjsjˆrQhŒXlinorder_neq_iffrR†rShtj*†rTjsX

rU†rVjKXlemmarW†rXjsjˆrYhŒX
power2_less_0rZ†r[jsjˆr\htje†r]hŒXsimpr^†r_htji†r`htj3†rajsX
  rb†rcjÁj†rdjÝX\<not>re†rfjÁX arg†rhjÁj\†rijÁX<^sup>2 < 0rj†rkjÁj†rljsX
  rm†rnjXbyro†rpjsjˆrqhtj†rrhŒXforcers†rtjsjˆruhŒXsimprv†rwjsjˆrxhŒXaddry†rzhtj3†r{jsjˆr|hŒXpower2_eq_squarer}†r~jsjˆrhŒXmult_less_0_iffr€†rhtj*†r‚jsX

rƒ†r„jKXlemmar…†r†jsjˆr‡hŒX
abs_power2rˆ†r‰jsjˆrŠhtje†r‹hŒXsimprŒ†rhtji†rŽhtj3†rjsX
  r†r‘jÁj†r’jÁXabs (ar“†r”jÁj\†r•jÁX<^sup>2) = ar–†r—jÁj\†r˜jÁX<^sup>2r™†ršjÁj†r›jsX
  rœ†rjXbyrž†rŸjsjˆr htj†r¡hŒXsimpr¢†r£jsjˆr¤hŒXaddr¥†r¦htj3†r§jsjˆr¨hŒXpower2_eq_squarer©†rªjsjˆr«hŒXabs_multr¬†r­jsjˆr®hŒX
abs_mult_selfr¯†r°htj*†r±jsX

r²†r³jKXlemmar´†rµjsjˆr¶hŒX
power2_absr·†r¸jsjˆr¹htje†rºhŒXsimpr»†r¼htji†r½htj3†r¾jsX
  r¿†rÀjÁj†rÁjÁX(abs a)r†rÃjÁj\†rÄjÁX<^sup>2 = arņrÆjÁj\†rÇjÁX<^sup>2rȆrÉjÁj†rÊjsX
  rˆrÌjXbyr͆rÎjsjˆrÏhtj†rÐhŒXsimprцrÒjsjˆrÓhŒXaddrÔ†rÕhtj3†rÖjsjˆr×hŒXpower2_eq_squarer؆rÙjsjˆrÚhŒX
abs_mult_selfrÛ†rÜhtj*†rÝjsX

rÞ†rßjKXlemmarà†rájsjˆrâhŒXodd_power_less_zerorã†rähtj3†råjsX
  ræ†rçjÁj†rèjÁXa < 0 ré†rêjÝX\<Longrightarrow>rë†rìjÁX a ^ Suc (2*n) < 0rí†rîjÁj†rïjsjÚ†rðjXproofrñ†ròjsjˆróhtj†rôhŒXinductrõ†röjsjˆr÷hŒjU†røhtj*†rùjsX
  rú†rûjXcaserü†rýjsjˆrþhŒj†rÿjsX
  r†rjXthenr†rjsjˆrjXshowr†rjsjˆrhtj†rjXcaser	†r
jsjˆrjXbyr†r
jsjˆrhŒXsimpr†rjsjÚ†rjXnextr†rjsX
  r†rjXcaser†rjsjˆrhtj†rhŒXSucr†rjsjˆrhŒjU†rhtj*†rjsX
  r†r jXhaver!†r"jsjˆr#jÁj†r$jÁX*a ^ Suc (2 * Suc n) = (a*a) * a ^ Suc(2*n)r%†r&jÁj†r'jsX
    r(†r)jXbyr*†r+jsjˆr,htj†r-hŒXsimpr.†r/jsjˆr0hŒXaddr1†r2htj3†r3jsjˆr4hŒXmult_acr5†r6jsjˆr7hŒX	power_addr8†r9jsjˆr:hŒXpower2_eq_squarer;†r<htj*†r=jsX
  r>†r?jXthusr@†rAjsjˆrBhtj†rCjXcaserD†rEjsX
    rF†rGjXbyrH†rIjsjˆrJhtj†rKhŒXsimprL†rMjsjˆrNhŒXdelrO†rPhtj3†rQjsjˆrRhŒX	power_SucrS†rTjsjˆrUe(hŒXaddrV†rWhtj3†rXjsjˆrYhŒXSucrZ†r[jsjˆr\hŒXmult_less_0_iffr]†r^jsjˆr_hŒXmult_neg_negr`†rahtj*†rbjsjÚ†rcjXqedrd†rejsX

rf†rgjKXlemmarh†rijsjˆrjhŒXodd_0_le_power_imp_0_lerk†rlhtj3†rmjsX
  rn†rojÁj†rpjÁX0 rq†rrjÝX\<le>rs†rtjÁX a ^ Suc (2*n) ru†rvjÝX\<Longrightarrow>rw†rxjÁX 0 ry†rzjÝX\<le>r{†r|jÁX ar}†r~jÁj†rjsX
  r€†rjXusingr‚†rƒjsjˆr„hŒXodd_power_less_zeror…†r†jsjˆr‡htje†rˆhŒXofr‰†rŠjsjˆr‹hŒj
†rŒjsjˆrhŒjU†rŽhtji†rjsX
    r†r‘jXbyr’†r“jsjˆr”htj†r•hŒXforcer–†r—jsjˆr˜hŒXsimpr™†ršjsjˆr›hŒXaddrœ†rhtj3†ržjsjˆrŸhŒXlinorder_not_lessr †r¡jsjˆr¢htje†r£hŒX	symmetricr¤†r¥htji†r¦htj*†r§jsX 

r¨†r©jKXlemmarª†r«jsjˆr¬hŒXzero_le_even_power'r­†r®htje†r¯hŒXsimpr°†r±htji†r²htj3†r³jsX
  r´†rµjÁj†r¶jÁX0 r·†r¸jÝX\<le>r¹†rºjÁX
 a ^ (2*n)r»†r¼jÁj†r½jsjÚ†r¾jXproofr¿†rÀjsjˆrÁhtj†rÂhŒXinductrÆrÄjsjˆrÅhŒjU†rÆhtj*†rÇjsX
  rȆrÉjXcaserʆrËjsjˆrÌhŒj†rÍjsX
    rΆrÏjXshowrІrÑjsjˆrÒhtj†rÓjXcaserÔ†rÕjsjˆrÖjXbyr׆rØjsjˆrÙhŒXsimprÚ†rÛjsjÚ†rÜjXnextr݆rÞjsX
  r߆ràjXcaserá†râjsjˆrãhtj†rähŒXSucrå†ræjsjˆrçhŒjU†rèhtj*†réjsX
    rê†rëjXhaverì†ríjsjˆrîjÁj†rïjÁX#a ^ (2 * Suc n) = (a*a) * a ^ (2*n)rð†rñjÁj†ròjsX 
      ró†rôjXbyrõ†röjsjˆr÷htj†røhŒXsimprù†rújsjˆrûhŒXaddrü†rýhtj3†rþjsjˆrÿhŒXmult_acr†rjsjˆrhŒX	power_addr†rjsjˆrhŒXpower2_eq_squarer†rhtj*†rjsX
    r	†r
jXthusr†rjsjˆr
htj†rjXcaser†rjsX
      r†rjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒXSucr†rjsjˆr hŒXzero_le_mult_iffr!†r"htj*†r#jsjÚ†r$jXqedr%†r&jsX

r'†r(jKXlemmar)†r*jsjˆr+hŒXsum_power2_ge_zeror,†r-htj3†r.jsX
  r/†r0jÁj†r1jÁX0 r2†r3jÝX\<le>r4†r5jÁX xr6†r7jÁj\†r8jÁX<^sup>2 + yr9†r:jÁj\†r;jÁX<^sup>2r<†r=jÁj†r>jsX
  r?†r@jXbyrA†rBjsjˆrChtj†rDhŒXintrorE†rFjsjˆrGhŒXadd_nonneg_nonnegrH†rIjsjˆrJhŒXzero_le_power2rK†rLhtj*†rMjsX

rN†rOjKXlemmarP†rQjsjˆrRhŒXnot_sum_power2_lt_zerorS†rThtj3†rUjsX
  rV†rWjÁj†rXjÝX\<not>rY†rZjÁX xr[†r\jÁj\†r]jÁX<^sup>2 + yr^†r_jÁj\†r`jÁX<^sup>2 < 0ra†rbjÁj†rcjsX
  rd†rejX	unfoldingrf†rgjsjˆrhhŒXnot_lessri†rjjsjˆrkjXbyrl†rmjsjˆrnhtj†rohŒXrulerp†rqjsjˆrrhŒXsum_power2_ge_zerors†rthtj*†rujsX

rv†rwjKXlemmarx†ryjsjˆrzhŒXsum_power2_eq_zero_iffr{†r|htj3†r}jsX
  r~†rjÁj†r€jÁjцrjÁj\†r‚jÁX<^sup>2 + yrƒ†r„jÁj\†r…jÁX<^sup>2 = 0 r††r‡jÝX\<longleftrightarrow>rˆ†r‰jÁX x = 0 rІr‹jÝX\<and>rŒ†rjÁX y = 0rކrjÁj†rjsX
  r‘†r’jX	unfoldingr“†r”jsjˆr•hŒXpower2_eq_squarer–†r—jsjˆr˜jXbyr™†ršjsjˆr›htj†rœhŒXsimpr†ržjsjˆrŸhŒXaddr †r¡htj3†r¢jsjˆr£hŒXadd_nonneg_eq_0_iffr¤†r¥htj*†r¦jsX

r§†r¨jKXlemmar©†rªjsjˆr«hŒXsum_power2_le_zero_iffr¬†r­htj3†r®jsX
  r¯†r°jÁj†r±jÁjцr²jÁj\†r³jÁX<^sup>2 + yr´†rµjÁj\†r¶jÁX<^sup>2 r·†r¸jÝX\<le>r¹†rºjÁX 0 r»†r¼jÝX\<longleftrightarrow>r½†r¾jÁX x = 0 r¿†rÀjÝX\<and>rÁ†rÂjÁX y = 0rÆrÄjÁj†rÅjsX
  rƆrÇjXbyrȆrÉjsjˆrÊhtj†rËhŒXsimpr̆rÍjsjˆrÎhŒXaddrφrÐhtj3†rÑjsjˆrÒhŒXle_lessrÓ†rÔjsjˆrÕhŒXsum_power2_eq_zero_iffrÖ†r×jsjˆrØhŒXnot_sum_power2_lt_zerorÙ†rÚhtj*†rÛjsX

r܆rÝjKXlemmarÞ†rßjsjˆràhŒXsum_power2_gt_zero_iffrá†râhtj3†rãjsX
  rä†råjÁj†ræjÁX0 < xrç†rèjÁj\†réjÁX<^sup>2 + yrê†rëjÁj\†rìjÁX<^sup>2 rí†rîjÝX\<longleftrightarrow>rï†rðjÁX x rñ†ròjÝX\<noteq>ró†rôjÁX 0 rõ†röjÝX\<or>r÷†røjÁX y rù†rújÝX\<noteq>rû†rüjÁX 0rý†rþjÁj†rÿjsX
  r†rjX	unfoldingr†rjsjˆrhŒXnot_ler†rjsjˆrhtje†rhŒX	symmetricr	†r
htji†rjsjˆrjXbyr
†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆrhŒXsum_power2_le_zero_iffr†rhtj*†rjsX

r†rjXendr†rjsX


r†r jÉX
subsectionr!†r"jsjˆr#hX{*r$†r%hX Miscellaneous rules r&†r'hX*}r(†r)jsX

r*†r+jKXlemmar,†r-jsjˆr.hŒXpower_eq_ifr/†r0htj3†r1jsjˆr2jÁj†r3jÁX.p ^ m = (if m=0 then 1 else p * (p ^ (m - 1)))r4†r5jÁj†r6jsX
  r7†r8jX	unfoldingr9†r:jsjˆr;hŒXOne_nat_defr<†r=jsjˆr>jXbyr?†r@jsjˆrAhtj†rBhŒXcasesrC†rDjsjˆrEhŒjφrFhtj*†rGjsjˆrHhŒXsimp_allrI†rJjsX

rK†rLjKXlemmarM†rNjsjˆrOhŒX
power2_sumrP†rQhtj3†rRjsX
  rS†rTjRXfixesrU†rVjsjˆrWhŒjцrXjsjˆrYhŒXyrZ†r[jsjˆr\htX::r]†r^jsjˆr_jÁj†r`jÁX'a::comm_semiring_1ra†rbjÁj†rcjsX
  rd†rejRXshowsrf†rgjsjˆrhjÁj†rijÁX(x + y)rj†rkjÁj\†rljÁX<^sup>2 = xrm†rnjÁj\†rojÁX<^sup>2 + yrp†rqjÁj\†rrjÁX<^sup>2 + 2 * x * yrs†rtjÁj†rujsX
  rv†rwjXbyrx†ryjsjˆrzhtj†r{hŒXsimpr|†r}jsjˆr~hŒXaddr†r€htj3†rjsjˆr‚hŒX
algebra_simpsrƒ†r„jsjˆr…hŒXpower2_eq_squarer††r‡jsjˆrˆhŒXmult_2_rightr‰†rŠhtj*†r‹jsX

rŒ†rjKXlemmarކrjsjˆrhŒXpower2_diffr‘†r’htj3†r“jsX
  r”†r•jRXfixesr–†r—jsjˆr˜hŒjцr™jsjˆršhŒjZ†r›jsjˆrœhtX::r†ržjsjˆrŸjÁj†r jÁX'a::comm_ring_1r¡†r¢jÁj†r£jsX
  r¤†r¥jRXshowsr¦†r§jsjˆr¨jÁj†r©jÁX(x - y)rª†r«jÁj\†r¬jÁX<^sup>2 = xr­†r®jÁj\†r¯jÁX<^sup>2 + yr°†r±jÁj\†r²jÁX<^sup>2 - 2 * x * yr³†r´jÁj†rµjsX
  r¶†r·jXbyr¸†r¹jsjˆrºhtj†r»hŒXsimpr¼†r½jsjˆr¾hŒXaddr¿†rÀhtj3†rÁjsjˆrÂhŒX
ring_distribsrÆrÄjsjˆrÅhŒXpower2_eq_squarerƆrÇjsjˆrÈhŒXmult_2rɆrÊhtj*†rËjsjˆrÌhtj†rÍhŒXrulerΆrÏjsjˆrÐhŒXmult_commuterцrÒhtj*†rÓjsX

rÔ†rÕjKXlemmarÖ†r×jsjˆrØhŒXpower_0_SucrÙ†rÚjsjˆrÛhtje†rÜhŒXsimpr݆rÞhtji†rßhtj3†ràjsX
  rá†râjÁj†rãjÁX((0::'a::{power, semiring_0}) ^ Suc n = 0rä†råjÁj†ræjsX
  rç†rèjXbyré†rêjsjˆrëhŒXsimprì†ríjsX

rî†rïjXtextrð†rñhX{*rò†róhX@It looks plausible as a simprule, but its effect can be strange.rô†rõhX*}rö†r÷jsjÚ†røjKXlemmarù†rújsjˆrûhŒXpower_0_leftrü†rýhtj3†rþjsX
  rÿ†rjÁj†rjÁX;0 ^ n = (if n = 0 then 1 else (0::'a::{power, semiring_0}))r†rjÁj†rjsX
  r†rjXbyr†rjsjˆr	htj†r
hŒXinductr†rjsjˆr
hŒjU†rhtj*†rjsjˆrhŒXsimp_allr†rjsX

r†rjKXlemmar†rjsjˆrhŒXpower_eq_0_iffr†rjsjˆrhtje†rhŒXsimpr†rhtji†rhtj3†rjsX
  r †r!jÁj†r"jÁX
a ^ n = 0 r#†r$jÝX\<longleftrightarrow>r%†r&jÁXC
     a = (0::'a::{mult_zero,zero_neq_one,no_zero_divisors,power}) r'†r(jÝX\<and>r)†r*jÁX n r+†r,jÝX\<noteq>r-†r.jÁX 0r/†r0jÁj†r1jsX
  r2†r3jXbyr4†r5jsjˆr6htj†r7hŒXinductr8†r9jsjˆr:hŒjU†r;htj*†r<jsX
    r=†r>htj†r?hŒXautor@†rAjsjˆrBhŒXsimprC†rDjsjˆrEhŒXaddrF†rGhtj3†rHjsjˆrIhŒXno_zero_divisorsrJ†rKjsjˆrLhŒXelimrM†rNhtj3†rOjsjˆrPhŒXcontrapos_pprQ†rRhtj*†rSjsX

rT†rUjKXlemmarV†rWjsjˆrXhtj†rYjRXinrZ†r[jsjˆr\hŒXfieldr]†r^htj*†r_jsjˆr`hŒX
power_diffra†rbhtj3†rcjsX
  rd†rejRXassumesrf†rgjsjˆrhhŒXnzri†rjhtj3†rkjsjˆrljÁj†rmjÁXa rn†rojÝX\<noteq>rp†rqjÁX 0rr†rsjÁj†rtjsX
  ru†rvjRXshowsrw†rxjsjˆryjÁj†rzjÁXn r{†r|jÝX\<le>r}†r~jÁX m r†r€jÝX\<Longrightarrow>r†r‚jÁX a ^ (m - n) = a ^ m / a ^ nrƒ†r„jÁj†r…jsX
  r††r‡jXbyrˆ†r‰jsjˆrŠhtj†r‹hŒXinductrŒ†rjsjˆrŽhŒjφrjsjˆrhŒjU†r‘jsjˆr’hŒXruler“†r”htj3†r•jsjˆr–hŒXdiff_inductr—†r˜htj*†r™jsjˆršhtj†r›hŒXsimp_allrœ†rjsjˆržhŒXaddrŸ†r htj3†r¡jsjˆr¢hŒXnzr£†r¤jsjˆr¥hŒXfield_power_not_zeror¦†r§htj*†r¨jsX

r©†rªjXtextr«†r¬hX{*r­†r®hX"Perhaps these should be simprules.r¯†r°hX*}r±†r²jsjÚ†r³jKXlemmar´†rµjsjˆr¶hŒX
power_inverser·†r¸htj3†r¹jsX
  rº†r»jRXfixesr¼†r½jsjˆr¾hŒj
†r¿jsjˆrÀhtX::rÁ†rÂjsjˆrÃjÁj†rÄjÁX'a::division_ring_inverse_zerorņrÆjÁj†rÇjsX
  rȆrÉjRXshowsrʆrËjsjˆrÌjÁj†rÍjÁXinverse (a ^ n) = inverse a ^ nrΆrÏjÁj†rÐjsjÚ†rÑjRXapplyrÒ†rÓjsjˆrÔhtj†rÕhŒXcasesrÖ†r×jsjˆrØjÁj†rÙjÁXa = 0rÚ†rÛjÁj†rÜhtj*†rÝjsjÚ†rÞjRXapplyr߆ràjsjˆráhtj†râhŒXsimprã†räjsjˆråhŒXaddræ†rçhtj3†rèjsjˆréhŒXpower_0_leftrê†rëhtj*†rìjsjÚ†ríjRXapplyrî†rïjsjˆrðhtj†rñhŒXsimprò†rójsjˆrôhŒXaddrõ†röhtj3†r÷jsjˆrøhŒXnonzero_power_inverserù†rúhtj*†rûjsjÚ†rüjXdonerý†rþjsjˆrÿhX(*r†rhX+ TODO: reorient or rename to inverse_power r†rhX*)r†rjsX

r†rjKXlemmar†r	jsjˆr
hŒXpower_one_overr†rhtj3†r
jsX
  r†rjÁj†rjÁX;1 / (a::'a::{field_inverse_zero, power}) ^ n =  (1 / a) ^ nr†rjÁj†rjsX
  r†rjXbyr†rjsjˆrhtj†rhŒXsimpr†rjsjˆrhŒXaddr†rhtj3†rjsjˆr hŒXdivide_inverser!†r"htj*†r#jsjˆr$htj†r%hŒXruler&†r'jsjˆr(hŒX
power_inverser)†r*htj*†r+jsX

r,†r-jKXlemmar.†r/jsjˆr0hŒXpower_divider1†r2htj3†r3jsX
  r4†r5jÁj†r6jÁX5(a / b) ^ n = (a::'a::field_inverse_zero) ^ n / b ^ nr7†r8jÁj†r9jsjÚ†r:jRXapplyr;†r<jsjˆr=htj†r>hŒXcasesr?†r@jsjˆrAjÁj†rBjÁXb = 0rC†rDjÁj†rEhtj*†rFjsjÚ†rGjRXapplyrH†rIjsjˆrJhtj†rKhŒXsimprL†rMjsjˆrNhŒXaddrO†rPhtj3†rQjsjˆrRhŒXpower_0_leftrS†rThtj*†rUjsjÚ†rVjRXapplyrW†rXjsjˆrYhtj†rZhŒXruler[†r\jsjˆr]hŒXnonzero_power_divider^†r_htj*†r`jsjÚ†rajRXapplyrb†rcjsjˆrdhŒX
assumptionre†rfjsjÚ†rgjXdonerh†rijsX

rj†rkjXtextrl†rmjsjˆrnhX{*ro†rphXB Simprules for comparisons where common factors can be cancelled. rq†rrhX*}rs†rtjsX

ru†rvjXlemmasrw†rxjsjˆryhŒXzero_compare_simpsrz†r{jsjˆr|htj÷†r}jsX
    r~†rhŒXadd_strict_increasingr€†rjsjˆr‚hŒXadd_strict_increasing2rƒ†r„jsjˆr…hŒXadd_increasingr††r‡jsX
    rˆ†r‰hŒXzero_le_mult_iffrІr‹jsjˆrŒhŒXzero_le_divide_iffr†rŽjsX 
    r†rhŒXzero_less_mult_iffr‘†r’jsjˆr“hŒXzero_less_divide_iffr”†r•jsX 
    r–†r—hŒX
mult_le_0_iffr˜†r™jsjˆršhŒXdivide_le_0_iffr›†rœjsX 
    r†ržhŒXmult_less_0_iffrŸ†r jsjˆr¡hŒXdivide_less_0_iffr¢†r£jsX 
    r¤†r¥hŒXzero_le_power2r¦†r§jsjˆr¨hŒX
power2_less_0r©†rªjsX


r«†r¬jÉX
subsectionr­†r®jsjˆr¯hX{*r°†r±hX( Exponentiation for the Natural Numbers r²†r³hX*}r´†rµjsX

r¶†r·jKXlemmar¸†r¹jsjˆrºhŒXnat_one_le_powerr»†r¼jsjˆr½htje†r¾hŒXsimpr¿†rÀhtji†rÁhtj3†rÂjsX
  rÆrÄjÁj†rÅjÁXSuc 0 rƆrÇjÝX\<le>rȆrÉjÁX i rʆrËjÝX\<Longrightarrow>r̆rÍjÁX Suc 0 rΆrÏjÝX\<le>rІrÑjÁX i ^ nrÒ†rÓjÁj†rÔjsX
  rÕ†rÖjXbyr׆rØjsjˆrÙhtj†rÚhŒXrulerÛ†rÜjsjˆrÝhŒXone_le_powerrÞ†rßjsjˆràhtje†ráhŒXofrâ†rãjsjˆrähŒXirå†ræjsjˆrçhŒjU†rèhtj"†réjsjˆrêhŒXunfoldedrë†rìjsjˆríhŒXOne_nat_defrî†rïhtji†rðhtj*†rñjsX

rò†rójKXlemmarô†rõjsjˆröhŒXnat_zero_less_power_iffr÷†røjsjˆrùhtje†rúhŒXsimprû†rühtji†rýhtj3†rþjsX
  rÿ†r jÁj†r jÁX
x ^ n > 0 r †r jÝX\<longleftrightarrow>r †r jÁX x > (0::nat) r †r jÝX\<or>r †r	 jÁX n = 0r
 †r jÁj†r jsX
  r
 †r jXbyr †r jsjˆr htj†r hŒXinductr †r jsjˆr hŒjU†r htj*†r jsjˆr hŒXautor †r jsX

r †r jKXlemmar †r jsjˆr hŒXnat_power_eq_Suc_0_iffr  †r! jsjˆr" htje†r# hŒXsimpr$ †r% htji†r& htj3†r' jsX 
  r( †r) jÁj†r* jÁXx ^ m = Suc 0 r+ †r, jÝX\<longleftrightarrow>r- †r. jÁX m = 0 r/ †r0 jÝX\<or>r1 †r2 jÁX
 x = Suc 0r3 †r4 jÁj†r5 jsX
  r6 †r7 jXbyr8 †r9 jsjˆr: htj†r; hŒXinductr< †r= jsjˆr> hŒjφr? htj*†r@ jsjˆrA hŒXautorB †rC jsX

rD †rE jKXlemmarF †rG jsjˆrH hŒXpower_Suc_0rI †rJ jsjˆrK htje†rL hŒXsimprM †rN htji†rO htj3†rP jsX
  rQ †rR jÁj†rS jÁXSuc 0 ^ n = Suc 0rT †rU jÁj†rV jsX
  rW †rX jXbyrY †rZ jsjˆr[ hŒXsimpr\ †r] jsX

r^ †r_ jXtextr` †ra hX{*rb †rc hX1Valid for the naturals, but what if @{text"0<i<1"rd †re hj:
†rf hXC?
Premises cannot be weakened: consider the case where @{term "i=0"rg †rh hj:
†ri hX,
@{term "m=1"rj †rk hj:
†rl hX and @{term "n=0"rm †rn hj:
†ro hj7†rp hX*}rq †rr jsjÚ†rs jKXlemmart †ru jsjˆrv hŒXnat_power_less_imp_lessrw †rx htj3†ry jsX
  rz †r{ jRXassumesr| †r} jsjˆr~ hŒXnonnegr †r€ htj3†r jsjˆr‚ jÁj†rƒ jÁX0 < (ir„ †r… jÝX\<Colon>r† †r‡ jÁXnat)rˆ †r‰ jÁj†rŠ jsX
  r‹ †rŒ jRXassumesr †rŽ jsjˆr hŒXlessr †r‘ htj3†r’ jsjˆr“ jÁj†r” jÁX
i ^ m < i ^ nr• †r– jÁj†r— jsX
  r˜ †r™ jRXshowsrš †r› jsjˆrœ jÁj†r jÁXm < nrž †rŸ jÁj†r  jsjÚ†r¡ jXproofr¢ †r£ jsjˆr¤ htj†r¥ hŒXcasesr¦ †r§ jsjˆr¨ jÁj†r© jÁXi = 1rª †r« jÁj†r¬ htj*†r­ jsX
  r® †r¯ jXcaser° †r± jsjˆr² hŒXTruer³ †r´ jsjˆrµ jXwithr¶ †r· jsjˆr¸ hŒXlessr¹ †rº jsjˆr» hŒX	power_oner¼ †r½ jsjˆr¾ htje†r¿ jRXwhererÀ †rÁ jsjˆr j‚X'arà †rÄ jsjˆrÅ htj÷†rÆ jsjˆrÇ hŒXnatrÈ †rÉ htji†rÊ jsjˆrË jXshowrÌ †rÍ jsjˆrÎ htj†rÏ hŒXthesisrÐ †rÑ jsjˆrÒ jXbyrÓ †rÔ jsjˆrÕ hŒXsimprÖ †r× jsjÚ†rØ jXnextrÙ †rÚ jsX
  rÛ †rÜ jXcaserÝ †rÞ jsjˆrß hŒXFalserà †rá jsjˆrâ jXwithr㠆rä jsjˆrå hŒXnonnegræ †rç jsjˆrè jXhaveré †rê jsjˆrë jÁj†rì jÁX1 < irí †rî jÁj†rï jsjˆrð jXbyrñ †rò jsjˆró hŒXautorô †rõ jsX
  rö †r÷ jXfromrø †rù jsjˆrú hŒXpower_strict_increasing_iffrû †rü jsjˆrý htje†rþ hŒXOFrÿ †r!jsjˆr!hŒXthisr!†r!htji†r!jsjˆr!hŒXlessr!†r!jsjˆr!jXshowr	!†r
!jsjˆr!htj†r!hŒXthesisr
!†r!jsjˆr!h‚X..r!†r!jsjÚ†r!jXqedr!†r!jsX

r!†r!jKXlemmar!†r!jsjˆr!hŒXpower_dvd_imp_ler!†r!htj3†r!jsX
  r!†r!jÁj†r!jÁXi ^ m dvd i ^ n r !†r!!jÝX\<Longrightarrow>r"!†r#!jÁX (1::nat) < i r$!†r%!jÝX\<Longrightarrow>r&!†r'!jÁX m r(!†r)!jÝX\<le>r*!†r+!jÁX nr,!†r-!jÁj†r.!jsX
  r/!†r0!jRXapplyr1!†r2!jsjˆr3!htj†r4!hŒXruler5!†r6!jsjˆr7!hŒXpower_le_imp_le_expr8!†r9!e(htj"†r:!jsjˆr;!hŒX
assumptionr<!†r=!htj*†r>!jsX
  r?!†r@!jRXapplyrA!†rB!jsjˆrC!htj†rD!hŒXerulerE!†rF!jsjˆrG!hŒX
dvd_imp_lerH!†rI!htj"†rJ!jsjˆrK!hŒXsimprL!†rM!htj*†rN!jsX
  rO!†rP!jXdonerQ!†rR!jsX

rS!†rT!jKXlemmarU!†rV!jsjˆrW!hŒXpower2_nat_le_eq_lerX!†rY!htj3†rZ!jsX
  r[!†r\!jRXfixesr]!†r^!jsjˆr_!hŒjφr`!jsjˆra!hŒjU†rb!jsjˆrc!htX::rd!†re!jsjˆrf!hŒXnatrg!†rh!jsX
  ri!†rj!jRXshowsrk!†rl!jsjˆrm!jÁj†rn!jÁjφro!jÁj\†rp!jÁX<^sup>2 rq!†rr!jÝX\<le>rs!†rt!jÁX nru!†rv!jÁj\†rw!jÁX<^sup>2 rx!†ry!jÝX\<longleftrightarrow>rz!†r{!jÁX m r|!†r}!jÝX\<le>r~!†r!jÁX nr€!†r!jÁj†r‚!jsX
  rƒ!†r„!jXbyr…!†r†!jsjˆr‡!htj†rˆ!hŒXautor‰!†rŠ!jsjˆr‹!hŒXintrorŒ!†r!htj3†rŽ!jsjˆr!hŒXpower2_le_imp_ler!†r‘!jsjˆr’!hŒX
power_monor“!†r”!htj*†r•!jsX

r–!†r—!jKXlemmar˜!†r™!jsjˆrš!hŒXpower2_nat_le_imp_ler›!†rœ!htj3†r!jsX
  rž!†rŸ!jRXfixesr !†r¡!jsjˆr¢!hŒjφr£!jsjˆr¤!hŒjU†r¥!jsjˆr¦!htX::r§!†r¨!jsjˆr©!hŒXnatrª!†r«!jsX
  r¬!†r­!jRXassumesr®!†r¯!jsjˆr°!jÁj†r±!jÁjφr²!jÁj\†r³!jÁX<^sup>2 r´!†rµ!jÝX\<le>r¶!†r·!jÁX nr¸!†r¹!jÁj†rº!jsX
  r»!†r¼!jRXshowsr½!†r¾!jsjˆr¿!jÁj†rÀ!jÁXm rÁ!†rÂ!jÝX\<le>rÃ!†rÄ!jÁX nrÅ!†rÆ!jÁj†rÇ!jsX
  rÈ!†rÉ!jXusingrÊ!†rË!jsjˆrÌ!hŒXassmsrÍ!†rÎ!jsjˆrÏ!jXbyrÐ!†rÑ!jsjˆrÒ!htj†rÓ!hŒXcasesrÔ!†rÕ!jsjˆrÖ!hŒjφr×!htj*†rØ!jsjˆrÙ!htj†rÚ!hŒXsimp_allrÛ!†rÜ!jsjˆrÝ!hŒXaddrÞ!†rß!htj3†rà!jsjˆrá!hŒXpower2_eq_squarerâ!†rã!htj*†rä!jsX



rå!†ræ!jÉX
subsectionrç!†rè!jsjˆré!hX{*rê!†rë!hX Code generator tweak rì!†rí!hX*}rî!†rï!jsX

rð!†rñ!jKXlemmarò!†ró!jsjˆrô!hŒXpower_power_powerrõ!†rö!jsjˆr÷!htje†rø!hŒXcoderù!†rú!htji†rû!htj3†rü!jsX
  rý!†rþ!jÁj†rÿ!jÁX+power = power.power (1::'a::{power}) (op *)r"†r"jÁj†r"jsX
  r"†r"jX	unfoldingr"†r"jsjˆr"hŒX	power_defr"†r	"jsjˆr
"hŒXpower.power_defr"†r"jsjˆr
"h‚X..r"†r"jsX

r"†r"jXdeclarer"†r"jsjˆr"hŒXpower.power.simpsr"†r"jsjˆr"htje†r"hŒXcoder"†r"htji†r"jsX

r"†r"jXcode_identifierr"†r"jsX
  r "†r!"jRXcode_moduler""†r#"jsjˆr$"hŒXPowerr%"†r&"jsjˆr'"j€X\<rightharpoonup>r("†r)"jsjˆr*"htj†r+"hŒXSMLr,"†r-"htj*†r."jsjˆr/"hŒXArithr0"†r1"jsjˆr2"jRXandr3"†r4"jsjˆr5"htj†r6"hŒXOCamlr7"†r8"htj*†r9"jsjˆr:"hŒXArithr;"†r<"jsjˆr="jRXandr>"†r?"jsjˆr@"htj†rA"hŒXHaskellrB"†rC"htj*†rD"jsjˆrE"hŒXArithrF"†rG"jsX

rH"†rI"jXendrJ"†rK"jsjÚ†rL"e.