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 / coq_RelationClasses
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ºhX -r»†r¼hX*r½†r¾hX- coding: utf-8 -r¿†rÀhj½†rÁhX- r†rÃhX*)rĆrÅjsX
rƆrÇhX(*rȆrÉhj½†rÊhj½†rËhj½†rÌhj½†rÍhj½†rÎhj½†rÏhj½†rÐhj½†rÑhj½†rÒhj½†rÓhj½†rÔhj½†rÕhj½†rÖhj½†r×hj½†rØhj½†rÙhj½†rÚhj½†rÛhj½†rÜhj½†rÝhj½†rÞhj½†rßhj½†ràhj½†ráhj½†râhj½†rãhj½†rähj½†råhj½†ræhj½†rçhj½†rèhj½†réhj½†rêhj½†rëhj½†rìhj½†ríhj½†rîhj½†rïhj½†rðhj½†rñhj½†ròhj½†róhj½†rôhj½†rõhj½†röhj½†r÷hj½†røhj½†rùhj½†rúhj½†rûhj½†rühj½†rýhj½†rþhj½†rÿhj½†rhj½†rhj½†rhj½†rhj½†rhj½†rhj½†rhj½†rhj½†rhj½†r	hj½†r
hj½†rhj½†rhj½†r
hj½†rhj½†rhX*)r†rjsjƆrhX(*r†rhX	  v      r†rhj½†rhX<   The Coq Proof Assistant  /  The Coq Development Team     r†rhX*)r†rjsjƆrhX(*r†rhX	 <O___,, r†r hj½†r!hX<   INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2011     r"†r#hX*)r$†r%jsjƆr&hX(*r'†r(hX	   \VV/  r)†r*hj½†r+hj½†r,hj½†r-hj½†r.hj½†r/hj½†r0hj½†r1hj½†r2hj½†r3hj½†r4hj½†r5hj½†r6hj½†r7hj½†r8hj½†r9hj½†r:hj½†r;hj½†r<hj½†r=hj½†r>hj½†r?hj½†r@hj½†rAhj½†rBhj½†rChj½†rDhj½†rEhj½†rFhj½†rGhj½†rHhj½†rIhj½†rJhj½†rKhj½†rLhj½†rMhj½†rNhj½†rOhj½†rPhj½†rQhj½†rRhj½†rShj½†rThj½†rUhj½†rVhj½†rWhj½†rXhj½†rYhj½†rZhj½†r[hj½†r\hj½†r]hj½†r^hj½†r_hj½†r`hj½†rahj½†rbhj½†rchj½†rdhj½†rehj½†rfhj½†rghX*)rh†rijsjƆrjhX(*rk†rlhX	    //   rm†rnhj½†rohX<      This file is distributed under the terms of the       rp†rqhX*)rr†rsjsjƆrthX(*ru†rvhX	         rw†rxhj½†ryhX<       GNU Lesser General Public License Version 2.1        rz†r{hX*)r|†r}jsjƆr~hX(*r†r€hj½†rhj½†r‚hj½†rƒhj½†r„hj½†r…hj½†r†hj½†r‡hj½†rˆhj½†r‰hj½†rŠhj½†r‹hj½†rŒhj½†rhj½†rŽhj½†rhj½†rhj½†r‘hj½†r’hj½†r“hj½†r”hj½†r•hj½†r–hj½†r—hj½†r˜hj½†r™hj½†ršhj½†r›hj½†rœhj½†rhj½†ržhj½†rŸhj½†r hj½†r¡hj½†r¢hj½†r£hj½†r¤hj½†r¥hj½†r¦hj½†r§hj½†r¨hj½†r©hj½†rªhj½†r«hj½†r¬hj½†r­hj½†r®hj½†r¯hj½†r°hj½†r±hj½†r²hj½†r³hj½†r´hj½†rµhj½†r¶hj½†r·hj½†r¸hj½†r¹hj½†rºhj½†r»hj½†r¼hj½†r½hj½†r¾hj½†r¿hj½†rÀhj½†rÁhj½†rÂhj½†rÃhj½†rÄhj½†rÅhj½†rÆhX*)rdžrÈjsX

rɆrÊhX(*rˆrÌhj½†rÍhX rΆrÏhj½†rÐhXÚ  Typeclass-based relations, tactics and standard instances

   This is the basic theory needed to formalize morphisms and setoids.

   Author: Matthieu Sozeau
   Institution: LRI, CNRS UMR 8623 - University Paris Sud
rцrÒhX*)rÓ†rÔjsX

rÕ†rÖhX(*r׆rØhX> $Id: RelationClasses.v 14641 2011-11-06 11:59:10Z herbelin $ rÙ†rÚhX*)rÛ†rÜjsX

r݆rÞjKXRequirer߆ràjsjΆrájKXExportrâ†rãjsjΆrähŒXCoqrå†ræhtX.rç†rèhŒXClassesré†rêhtjç†rëhŒXInitrì†ríhtjç†rîjsjƆrïjKXRequirerð†rñjsjΆròjKXImportró†rôjsjΆrõhŒXCoqrö†r÷htjç†røhŒXProgramrù†rúhtjç†rûhŒXBasicsrü†rýhtjç†rþjsjƆrÿjKXRequirer†rjsjΆrjKXImportr†rjsjΆrhŒXCoqr†rhtjç†rhŒXProgramr	†r
htjç†rhŒXTacticsr†r
htjç†rjsjƆrjKXRequirer†rjsjΆrjKXImportr†rjsjΆrhŒXCoqr†rhtjç†rhŒX	Relationsr†rhtjç†rhŒXRelation_Definitionsr†rhtjç†rjsX

r†r hX(*r!†r"hj½†r#hXK We allow to unfold the [relation] definition while doing morphism search. r$†r%hX*)r&†r'jsX

r(†r)jKXNotationr*†r+jsjΆr,hŒXinverser-†r.jsjΆr/hŒXRr0†r1jsjΆr2htX:=r3†r4jsjΆr5htX(r6†r7hŒXflipr8†r9jsjΆr:htj6†r;hŒj0†r<htX:r=†r>hŒXrelationr?†r@jsjΆrAhtX_rB†rChtX)rD†rEjsjΆrFhtj=†rGjsjΆrHhŒXrelationrI†rJjsjΆrKhtjB†rLhtjD†rMhtjç†rNjsX

rO†rPjKX
DefinitionrQ†rRjsjΆrShŒX
complementrT†rUjsjΆrVhtX{rW†rXhŒXArY†rZhtX}r[†r\jsjΆr]htj6†r^hŒj0†r_jsjΆr`htj=†rajsjΆrbhŒXrelationrc†rdjsjΆrehŒjY†rfhtjD†rgjsjΆrhhtj=†rijsjΆrjhŒXrelationrk†rljsjΆrmhŒjY†rnjsjΆrohtX:=rp†rqjsjΆrrjXfunrs†rtjsjΆruhŒXxrv†rwjsjΆrxhŒXyry†rzjsjΆr{htX=>r|†r}jsjΆr~hŒj0†rjsjΆr€hŒjv†rjsjΆr‚hŒjy†rƒjsjΆr„htX->r…†r†jsjΆr‡hŒXFalserˆ†r‰htjç†rŠjsX

r‹†rŒhX(*r†rŽhj½†rhX Opaque for proof-search. r†r‘hX*)r’†r“jsjƆr”hŒXTypeclassesr•†r–jsjΆr—hŒXOpaquer˜†r™jsjΆršhŒX
complementr›†rœhtjç†rjsX

rž†rŸhX(*r †r¡hj½†r¢hX These are convertible. r£†r¤hX*)r¥†r¦jsX

r§†r¨jKXLemmar©†rªjsjΆr«hŒXcomplement_inverser¬†r­jsjΆr®htj=†r¯jsjΆr°jXforallr±†r²jsjΆr³hŒjY†r´jsjΆrµhtj6†r¶hŒj0†r·jsjΆr¸htj=†r¹jsjΆrºhŒXrelationr»†r¼jsjΆr½hŒjY†r¾htjD†r¿htX,rÀ†rÁjsjΆrÂhŒX
complementrÆrÄjsjΆrÅhtj6†rÆhŒXinverserdžrÈjsjΆrÉhŒj0†rÊhtjD†rËjsjΆrÌhtX=r͆rÎjsjΆrÏhŒXinverserІrÑjsjΆrÒhtj6†rÓhŒX
complementrÔ†rÕjsjΆrÖhŒj0†r×htjD†rØhtjç†rÙjsjƆrÚjKXProofrÛ†rÜhtjç†rÝjsjΆrÞjRXreflexivityr߆ràhtjç†rájsjΆrâjKXQedrã†rähtjç†råjsX

ræ†rçhX(*rè†réhj½†rêhXL We rebind relations in separate classes to be able to overload each proof. rë†rìhX*)rí†rîjsX

rï†rðjKXSetrñ†ròjsjΆrójKXImplicitrô†rõjsjΆröjKX	Argumentsr÷†røhtjç†rùjsjƆrújKXUnsetrû†rüjsjΆrýjKXStrictrþ†rÿjsjΆrjKXImplicitr†rhtjç†rjsX

r†rjKXClassr†rjsjΆrhŒX	Reflexiver	†r
jsjΆrhtjW†rhŒjY†r
htj[†rjsjΆrhtj6†rhŒj0†rjsjΆrhtj=†rjsjΆrhŒXrelationr†rjsjΆrhŒjY†rhtjD†rjsjΆrhtX:=r†rjsX
  r†rjRXreflexivityr†r jsjΆr!htj=†r"jsjΆr#jXforallr$†r%jsjΆr&hŒjv†r'htjÀ†r(jsjΆr)hŒj0†r*jsjΆr+hŒjv†r,jsjΆr-hŒjv†r.htjç†r/jsX

r0†r1jKXClassr2†r3jsjΆr4hŒXIrreflexiver5†r6jsjΆr7htjW†r8hŒjY†r9htj[†r:jsjΆr;htj6†r<hŒj0†r=jsjΆr>htj=†r?jsjΆr@hŒXrelationrA†rBjsjΆrChŒjY†rDhtjD†rEjsjΆrFhtX:=rG†rHjsX
  rI†rJhŒX
irreflexivityrK†rLjsjΆrMhtj=†rNjsjΆrOhŒX	ReflexiverP†rQjsjΆrRhtj6†rShŒX
complementrT†rUjsjΆrVhŒj0†rWhtjD†rXhtjç†rYjsX

rZ†r[jKXHintr\†r]jsjΆr^hŒXExternr_†r`jsjΆrajŸX1rb†rcjsjΆrdhtj6†rehŒX	Reflexiverf†rgjsjΆrhhtj6†rihŒX
complementrj†rkjsjΆrlhtjB†rmhtjD†rnhtjD†rojsjΆrphtX=>rq†rrjsjΆrshŒXclass_applyrt†rujsjΆrvhtX@rw†rxhŒX
irreflexivityry†rzjsjΆr{htj=†r|jsjΆr}hŒXtypeclass_instancesr~†rhtjç†r€jsX

r†r‚jKXClassrƒ†r„jsjΆr…hŒX	Symmetricr††r‡jsjΆrˆhtjW†r‰hŒjY†rŠhtj[†r‹jsjΆrŒhtj6†rhŒj0†rŽjsjΆrhtj=†rjsjΆr‘hŒXrelationr’†r“jsjΆr”hŒjY†r•htjD†r–jsjΆr—htX:=r˜†r™jsX
  rš†r›jXsymmetryrœ†rjsjΆržhtj=†rŸjsjΆr jXforallr¡†r¢jsjΆr£hŒjv†r¤jsjΆr¥hŒjy†r¦htjÀ†r§jsjΆr¨hŒj0†r©jsjΆrªhŒjv†r«jsjΆr¬hŒjy†r­jsjΆr®htX->r¯†r°jsjΆr±hŒj0†r²jsjΆr³hŒjy†r´jsjΆrµhŒjv†r¶htjç†r·jsX

r¸†r¹jKXClassrº†r»jsjΆr¼hŒX
Asymmetricr½†r¾jsjΆr¿htjW†rÀhŒjY†rÁhtj[†rÂjsjΆrÃhtj6†rÄhŒj0†rÅjsjΆrÆhtj=†rÇjsjΆrÈhŒXrelationrɆrÊjsjΆrËhŒjY†rÌhtjD†rÍjsjΆrÎhtX:=rφrÐjsX
  rцrÒhŒX	asymmetryrÓ†rÔjsjΆrÕhtj=†rÖjsjΆr×jXforallr؆rÙjsjΆrÚhŒjv†rÛjsjΆrÜhŒjy†rÝhtjÀ†rÞjsjΆrßhŒj0†ràjsjΆráhŒjv†râjsjΆrãhŒjy†räjsjΆråhtX->ræ†rçjsjΆrèhŒj0†réjsjΆrêhŒjy†rëjsjΆrìhŒjv†ríjsjΆrîhtX->rï†rðjsjΆrñhŒXFalserò†róhtjç†rôjsX

rõ†röjKXClassr÷†røjsjΆrùhŒX
Transitiverú†rûjsjΆrühtjW†rýhŒjY†rþhtj[†rÿjsjΆrhtj6†rhŒj0†rjsjΆrhtj=†rjsjΆrhŒXrelationr†rjsjΆrhŒjY†r	htjD†r
jsjΆrhtX:=r†r
jsX
  r†rjXtransitivityr†rjsjΆrhtj=†rjsjΆrjXforallr†rjsjΆrhŒjv†rjsjΆrhŒjy†rjsjΆrhŒXzr†rhtjÀ†rjsjΆrhŒj0†r jsjΆr!hŒjv†r"jsjΆr#hŒjy†r$jsjΆr%htX->r&†r'jsjΆr(hŒj0†r)jsjΆr*hŒjy†r+jsjΆr,hŒj†r-jsjΆr.htX->r/†r0jsjΆr1hŒj0†r2jsjΆr3hŒjv†r4jsjΆr5hŒj†r6htjç†r7jsX

r8†r9jKXHintr:†r;jsjΆr<jKXResolver=†r>jsjΆr?htjw†r@hŒX
irreflexivityrA†rBjsjΆrChtj=†rDjsjΆrEhŒXordrF†rGhtjç†rHjsX

rI†rJjKXUnsetrK†rLjsjΆrMjKXImplicitrN†rOjsjΆrPjKX	ArgumentsrQ†rRhtjç†rSjsX

rT†rUhX(*rV†rWhj½†rXhX A HintDb for relations. rY†rZhX*)r[†r\jsX

r]†r^jKXLtacr_†r`jsjΆrahŒXsolve_relationrb†rcjsjΆrdhtX:=re†rfjsX
  rg†rhjXmatchri†rjjsjΆrkhŒXgoalrl†rmjsjΆrnjXwithro†rpjsX
  rq†rrhtX|rs†rtjsjΆruhtX[rv†rwjsjΆrxhtjs†ryhtX-rz†r{jsjΆr|htX?r}†r~hŒj0†rjsjΆr€htj}†rhŒjv†r‚jsjΆrƒhtj}†r„hŒjv†r…jsjΆr†htX]r‡†rˆjsjΆr‰htX=>rІr‹jsjΆrŒjRXreflexivityr†rŽjsX
  r†rhtjs†r‘jsjΆr’htjv†r“jsjΆr”hŒXHr•†r–jsjΆr—htj=†r˜jsjΆr™htj}†ršhŒj0†r›jsjΆrœhtj}†rhŒjv†ržjsjΆrŸhtj}†r hŒjy†r¡jsjΆr¢htjs†r£htjz†r¤jsjΆr¥htj}†r¦hŒj0†r§jsjΆr¨htj}†r©hŒjy†rªjsjΆr«htj}†r¬hŒjv†r­jsjΆr®htj‡†r¯jsjΆr°htX=>r±†r²jsjΆr³jXsymmetryr´†rµjsjΆr¶htX;r·†r¸jsjΆr¹jRXexactrº†r»jsjΆr¼hŒj•†r½jsX
  r¾†r¿jXendrÀ†rÁhtjç†rÂjsX

rÆrÄjKXHintrņrÆjsjΆrÇhŒXExternrȆrÉjsjΆrÊjŸX4rˆrÌjsjΆrÍhtX=>rΆrÏjsjΆrÐhŒXsolve_relationrцrÒjsjΆrÓhtj=†rÔjsjΆrÕhŒX	relationsrÖ†r×htjç†rØjsX

rÙ†rÚhX(*rÛ†rÜhj½†rÝhX. We can already dualize all these properties. rÞ†rßhX*)rà†rájsX

râ†rãhŒX
Generalizablerä†råjsjΆræjKX	Variablesrç†rèjsjΆréhŒjY†rêjsjΆrëhŒXBrì†ríjsjΆrîhŒXCrï†rðjsjΆrñhŒXDrò†rójsjΆrôhŒj0†rõjsjΆröhŒXSr÷†røjsjΆrùhŒXTrú†rûjsjΆrühŒXUrý†rþjsjΆrÿhŒXlr†rjsjΆrhŒXeqAr†rjsjΆrhŒXeqBr†rjsjΆrhŒXeqCr	†r
jsjΆrhŒXeqDr†r
htjç†rjsX

r†rjKXLemmar†rjsjΆrhŒXflip_Reflexiver†rjsjΆrhtX`r†rhtjW†rhŒX	Reflexiver†rjsjΆrhŒjY†rjsjΆrhŒj0†rhtj[†r jsjΆr!htj=†r"jsjΆr#hŒX	Reflexiver$†r%jsjΆr&htj6†r'hŒXflipr(†r)jsjΆr*hŒj0†r+htjD†r,htjç†r-jsjƆr.jKXProofr/†r0htjç†r1jsjΆr2jXtautor3†r4htjç†r5jsjΆr6jKXQedr7†r8htjç†r9jsX

r:†r;jKXHintr<†r=jsjΆr>hŒXExternr?†r@jsjΆrAjŸX3rB†rCjsjΆrDhtj6†rEhŒX	ReflexiverF†rGjsjΆrHhtj6†rIhŒXfliprJ†rKjsjΆrLhtjB†rMhtjD†rNhtjD†rOjsjΆrPhtX=>rQ†rRjsjΆrSjXapplyrT†rUjsjΆrVhŒXflip_ReflexiverW†rXjsjΆrYhtj=†rZjsjΆr[hŒXtypeclass_instancesr\†r]htjç†r^jsX

r_†r`hŒXProgramra†rbjsjΆrcjKX
Definitionrd†rejsjΆrfhŒXflip_Irreflexiverg†rhjsjΆrihtj†rjhtj6†rkhŒXIrreflexiverl†rmjsjΆrnhŒjY†rojsjΆrphŒj0†rqhtjD†rrjsjΆrshtj=†rtjsjΆruhŒXIrreflexiverv†rwjsjΆrxhtj6†ryhŒXfliprz†r{jsjΆr|hŒj0†r}htjD†r~jsjΆrhtX:=r€†rjsX
  r‚†rƒhŒX
irreflexivityr„†r…jsjΆr†htj6†r‡hŒj0†rˆhtX:=r‰†rŠhŒj0†r‹htjD†rŒhtjç†rjsX

rކrhŒXProgramr†r‘jsjΆr’jKX
Definitionr“†r”jsjΆr•hŒXflip_Symmetricr–†r—jsjΆr˜htj†r™htj6†ršhŒX	Symmetricr›†rœjsjΆrhŒjY†ržjsjΆrŸhŒj0†r htjD†r¡jsjΆr¢htj=†r£jsjΆr¤hŒX	Symmetricr¥†r¦jsjΆr§htj6†r¨hŒXflipr©†rªjsjΆr«hŒj0†r¬htjD†r­jsjΆr®htX:=r¯†r°jsX
  r±†r²jXfunr³†r´jsjΆrµhŒjv†r¶jsjΆr·hŒjy†r¸jsjΆr¹hŒj•†rºjsjΆr»htX=>r¼†r½jsjΆr¾jXsymmetryr¿†rÀjsjΆrÁhtj6†rÂhŒj0†rÃhtX:=rĆrÅe(hŒj0†rÆhtjD†rÇjsjΆrÈhŒj•†rÉhtjç†rÊjsX

rˆrÌhŒXProgramr͆rÎjsjΆrÏjKX
DefinitionrІrÑjsjΆrÒhŒXflip_AsymmetricrÓ†rÔjsjΆrÕhtj†rÖhtj6†r×hŒX
Asymmetricr؆rÙjsjΆrÚhŒjY†rÛjsjΆrÜhŒj0†rÝhtjD†rÞjsjΆrßhtj=†ràjsjΆráhŒX
Asymmetricrâ†rãjsjΆrähtj6†råhŒXflipræ†rçjsjΆrèhŒj0†réhtjD†rêjsjΆrëhtX:=rì†ríjsX
  rî†rïjXfunrð†rñjsjΆròhŒjv†rójsjΆrôhŒjy†rõjsjΆröhŒj•†r÷jsjΆrøhŒXH'rù†rújsjΆrûhtX=>rü†rýjsjΆrþhŒX	asymmetryrÿ†r	jsjΆr	htj6†r	hŒj0†r	htX:=r	†r	hŒj0†r	htjD†r	jsjΆr	hŒj•†r		jsjΆr
	hŒXH'r	†r	htjç†r
	jsX

r	†r	hŒXProgramr	†r	jsjΆr	jKX
Definitionr	†r	jsjΆr	hŒXflip_Transitiver	†r	jsjΆr	htj†r	htj6†r	hŒX
Transitiver	†r	jsjΆr	hŒjY†r	jsjΆr	hŒj0†r 	htjD†r!	jsjΆr"	htj=†r#	jsjΆr$	hŒX
Transitiver%	†r&	jsjΆr'	htj6†r(	hŒXflipr)	†r*	jsjΆr+	hŒj0†r,	htjD†r-	jsjΆr.	htX:=r/	†r0	jsX
  r1	†r2	jXfunr3	†r4	jsjΆr5	hŒjv†r6	jsjΆr7	hŒjy†r8	jsjΆr9	hŒj†r:	jsjΆr;	hŒj•†r<	jsjΆr=	hŒXH'r>	†r?	jsjΆr@	htX=>rA	†rB	jsjΆrC	jXtransitivityrD	†rE	jsjΆrF	htj6†rG	hŒj0†rH	htX:=rI	†rJ	hŒj0†rK	htjD†rL	jsjΆrM	hŒXH'rN	†rO	jsjΆrP	hŒj•†rQ	htjç†rR	jsX

rS	†rT	jKXHintrU	†rV	jsjΆrW	hŒXExternrX	†rY	jsjΆrZ	jŸjB†r[	jsjΆr\	htj6†r]	hŒXIrreflexiver^	†r_	jsjΆr`	htj6†ra	hŒXfliprb	†rc	jsjΆrd	htjB†re	htjD†rf	htjD†rg	jsjΆrh	htX=>ri	†rj	jsjΆrk	hŒXclass_applyrl	†rm	jsjΆrn	hŒXflip_Irreflexivero	†rp	jsjΆrq	htj=†rr	jsjΆrs	hŒXtypeclass_instancesrt	†ru	htjç†rv	jsjƆrw	jKXHintrx	†ry	jsjΆrz	hŒXExternr{	†r|	jsjΆr}	jŸjB†r~	jsjΆr	htj6†r€	hŒX	Symmetricr	†r‚	jsjΆrƒ	htj6†r„	hŒXflipr…	†r†	jsjΆr‡	htjB†rˆ	htjD†r‰	htjD†rŠ	jsjΆr‹	htX=>rŒ	†r	jsjΆrŽ	hŒXclass_applyr	†r	jsjΆr‘	hŒXflip_Symmetricr’	†r“	jsjΆr”	htj=†r•	jsjΆr–	hŒXtypeclass_instancesr—	†r˜	htjç†r™	jsjƆrš	jKXHintr›	†rœ	jsjΆr	hŒXExternrž	†rŸ	jsjΆr 	jŸjB†r¡	jsjΆr¢	htj6†r£	hŒX
Asymmetricr¤	†r¥	jsjΆr¦	htj6†r§	hŒXflipr¨	†r©	jsjΆrª	htjB†r«	htjD†r¬	htjD†r­	jsjΆr®	htX=>r¯	†r°	jsjΆr±	hŒXclass_applyr²	†r³	jsjΆr´	hŒXflip_Asymmetricrµ	†r¶	jsjΆr·	htj=†r¸	jsjΆr¹	hŒXtypeclass_instancesrº	†r»	htjç†r¼	jsjƆr½	jKXHintr¾	†r¿	jsjΆrÀ	hŒXExternrÁ	†rÂ	jsjΆrÃ	jŸjB†rÄ	jsjΆrÅ	htj6†rÆ	hŒX
TransitiverÇ	†rÈ	jsjΆrÉ	htj6†rÊ	hŒXfliprË	†rÌ	jsjΆrÍ	htjB†rÎ	htjD†rÏ	htjD†rÐ	jsjΆrÑ	htX=>rÒ	†rÓ	jsjΆrÔ	hŒXclass_applyrÕ	†rÖ	jsjΆr×	hŒXflip_TransitiverØ	†rÙ	jsjΆrÚ	htj=†rÛ	jsjΆrÜ	hŒXtypeclass_instancesrÝ	†rÞ	htjç†rß	jsX

rà	†rá	jKX
Definitionrâ	†rã	jsjΆrä	hŒX Reflexive_complement_Irreflexiverå	†ræ	jsjΆrç	htj†rè	htj6†ré	hŒX	Reflexiverê	†rë	jsjΆrì	hŒjY†rí	jsjΆrî	htj6†rï	hŒj0†rð	jsjΆrñ	htj=†rò	jsjΆró	hŒXrelationrô	†rõ	jsjΆrö	hŒjY†r÷	htjD†rø	htjD†rù	jsX
   rú	†rû	htj=†rü	jsjΆrý	hŒXIrreflexiverþ	†rÿ	jsjΆr
htj6†r
hŒX
complementr
†r
jsjΆr
hŒj0†r
htjD†r
htjç†r
jsjƆr
jKXProofr	
†r

htjç†r
jsjΆr
hŒX
firstorderr
†r
htjç†r
jsjΆr
jKXQedr
†r
htjç†r
jsX

r
†r
jKX
Definitionr
†r
jsjΆr
hŒXcomplement_Symmetricr
†r
jsjΆr
htj†r
htj6†r
hŒX	Symmetricr
†r
jsjΆr 
hŒjY†r!
jsjΆr"
htj6†r#
hŒj0†r$
jsjΆr%
htj=†r&
jsjΆr'
hŒXrelationr(
†r)
jsjΆr*
hŒjY†r+
htjD†r,
htjD†r-
jsjΆr.
htj=†r/
jsjΆr0
hŒX	Symmetricr1
†r2
jsjΆr3
htj6†r4
hŒX
complementr5
†r6
jsjΆr7
hŒj0†r8
htjD†r9
htjç†r:
jsjƆr;
jKXProofr<
†r=
htjç†r>
jsjΆr?
hŒX
firstorderr@
†rA
htjç†rB
jsjΆrC
jKXQedrD
†rE
htjç†rF
jsX

rG
†rH
jKXHintrI
†rJ
jsjΆrK
hŒXExternrL
†rM
jsjΆrN
jŸjB†rO
jsjΆrP
htj6†rQ
hŒX	SymmetricrR
†rS
jsjΆrT
htj6†rU
hŒX
complementrV
†rW
jsjΆrX
htjB†rY
htjD†rZ
htjD†r[
jsjΆr\
htX=>r]
†r^
jsjΆr_
hŒXclass_applyr`
†ra
jsjΆrb
hŒXcomplement_Symmetricrc
†rd
jsjΆre
htj=†rf
jsjΆrg
hŒXtypeclass_instancesrh
†ri
htjç†rj
jsjƆrk
jKXHintrl
†rm
jsjΆrn
hŒXExternro
†rp
jsjΆrq
jŸjB†rr
jsjΆrs
htj6†rt
hŒXIrreflexiveru
†rv
jsjΆrw
htj6†rx
hŒX
complementry
†rz
jsjΆr{
htjB†r|
htjD†r}
htjD†r~
jsjΆr
htX=>r€
†r
jsjΆr‚
hŒXclass_applyrƒ
†r„
jsjΆr…
hŒX Reflexive_complement_Irreflexiver†
†r‡
jsjΆrˆ
htj=†r‰
jsjΆrŠ
hŒXtypeclass_instancesr‹
†rŒ
htjç†r
jsX

rŽ
†r
hX(*r
†r‘
hj½†r’
hjΆr“
hj½†r”
hX Standard instances. r•
†r–
hX*)r—
†r˜
jsX

r™
†rš
jKXLtacr›
†rœ
jsjΆr
hŒX
reduce_hyprž
†rŸ
jsjΆr 
hŒj•†r¡
jsjΆr¢
htX:=r£
†r¤
jsX
  r¥
†r¦
jXmatchr§
†r¨
jsjΆr©
hŒXtyperª
†r«
jsjΆr¬
jXofr­
†r®
jsjΆr¯
hŒj•†r°
jsjΆr±
jXwithr²
†r³
jsX
    r´
†rµ
htjs†r¶
jsjΆr·
hŒXcontextr¸
†r¹
jsjΆrº
htjv†r»
jsjΆr¼
htjB†r½
jsjΆr¾
htX<->r¿
†rÀ
jsjΆrÁ
htjB†rÂ
jsjΆrÃ
htj‡†rÄ
jsjΆrÅ
htX=>rÆ
†rÇ
jsjΆrÈ
hŒXfailrÉ
†rÊ
jsjΆrË
jŸjb†rÌ
jsX
    rÍ
†rÎ
htjs†rÏ
jsjΆrÐ
htjB†rÑ
jsjΆrÒ
htX=>rÓ
†rÔ
jsjΆrÕ
jXredrÖ
†r×
jsjΆrØ
jXinrÙ
†rÚ
jsjΆrÛ
hŒj•†rÜ
jsjΆrÝ
htj·†rÞ
jsjΆrß
jbXtryrà
†rá
jsjΆrâ
hŒX
reduce_hyprã
†rä
jsjΆrå
hŒj•†ræ
jsX
  rç
†rè
jXendré
†rê
htjç†rë
jsX

rì
†rí
jKXLtacrî
†rï
jsjΆrð
hŒXreduce_goalrñ
†rò
jsjΆró
htX:=rô
†rõ
jsX
  rö
†r÷
jXmatchrø
†rù
jsjΆrú
hŒXgoalrû
†rü
jsjΆrý
jXwithrþ
†rÿ
jsX
    r†rhtjs†rjsjΆrhtjv†rjsjΆrhtjs†rhtjz†rjsjΆrhtjB†r	jsjΆr
htX<->r†rjsjΆr
htjB†rjsjΆrhtj‡†rjsjΆrhtX=>r†rjsjΆrhŒXfailr†rjsjΆrjŸjb†rjsX
    r†rhtjs†rjsjΆrhtjB†rjsjΆrhtX=>r†r jsjΆr!jXredr"†r#jsjΆr$htj·†r%jsjΆr&jXintrosr'†r(jsjΆr)htj·†r*jsjΆr+jbXtryr,†r-jsjΆr.hŒXreduce_goalr/†r0jsX
  r1†r2jXendr3†r4htjç†r5jsX

r6†r7jKXTacticr8†r9jsjΆr:jKXNotationr;†r<jsjΆr=jHX"r>†r?jHXreducer@†rAjHj>†rBjsjΆrCjHj>†rDjHXinrE†rFjHj>†rGjsjΆrHhŒXhyprI†rJhtj6†rKhŒXHidrL†rMhtjD†rNjsjΆrOhtX:=rP†rQjsjΆrRhŒX
reduce_hyprS†rTjsjΆrUhŒXHidrV†rWhtjç†rXjsX

rY†rZjKXLtacr[†r\jsjΆr]hŒXreducer^†r_jsjΆr`htX:=ra†rbjsjΆrchŒXreduce_goalrd†rehtjç†rfjsX

rg†rhjKXTacticri†rjjsjΆrkjKXNotationrl†rmjsjΆrnjHj>†rojHXapplyrp†rqjHj>†rrjsjΆrsjHj>†rtjHj½†rujHj>†rvjsjΆrwhŒXconstrrx†ryhtj6†rzhŒXtr{†r|htjD†r}jsjΆr~htX:=r†r€jsX
  r†r‚jbXfirstrƒ†r„jsjΆr…htjv†r†jsjΆr‡jXrefinerˆ†r‰jsjΆrŠhŒj{†r‹jsjΆrŒhtjs†rjsjΆrŽjXrefiner†rjsjΆr‘htj6†r’hŒj{†r“jsjΆr”htjB†r•htjD†r–jsjΆr—htjs†r˜jsjΆr™jXrefinerš†r›jsjΆrœhtj6†rhŒj{†ržjsjΆrŸhtjB†r jsjΆr¡htjB†r¢htjD†r£jsjΆr¤htjs†r¥jsjΆr¦jXrefiner§†r¨jsjΆr©htj6†rªhŒj{†r«jsjΆr¬htjB†r­jsjΆr®htjB†r¯jsjΆr°htjB†r±htjD†r²jsjΆr³htjs†r´jsjΆrµjXrefiner¶†r·jsjΆr¸htj6†r¹hŒj{†rºjsjΆr»htjB†r¼jsjΆr½htjB†r¾jsjΆr¿htjB†rÀjsjΆrÁhtjB†rÂhtjD†rÃjsjΆrÄhtjs†rÅjsX
    rƆrÇjXrefinerȆrÉjsjΆrÊhtj6†rËhŒj{†rÌjsjΆrÍhtjB†rÎjsjΆrÏhtjB†rÐjsjΆrÑhtjB†rÒjsjΆrÓhtjB†rÔjsjΆrÕhtjB†rÖhtjD†r×jsjΆrØhtjs†rÙjsjΆrÚjXrefinerÛ†rÜjsjΆrÝhtj6†rÞhŒj{†rßjsjΆràhtjB†rájsjΆrâhtjB†rãjsjΆrähtjB†råjsjΆræhtjB†rçjsjΆrèhtjB†réjsjΆrêhtjB†rëhtjD†rìjsjΆríhtjs†rîjsjΆrïjXrefinerð†rñjsjΆròhtj6†róhŒj{†rôjsjΆrõhtjB†röjsjΆr÷htjB†røjsjΆrùhtjB†rújsjΆrûhtjB†rüjsjΆrýhtjB†rþjsjΆrÿhtjB†rjsjΆrhtjB†rhtjD†rjsjΆrhtj‡†rhtjç†rjsX

r†rjKXLtacr	†r
jsjΆrhŒXsimpl_relationr†r
jsjΆrhtX:=r†rjsX
  r†rjXunfoldr†rjsjΆrhŒXflipr†rhtjÀ†rjsjΆrhŒXimplr†rhtjÀ†rjsjΆrhŒXarrowr†rjsjΆr htj·†r!jsjΆr"jbXtryr#†r$jsjΆr%hŒXreducer&†r'jsjΆr(htj·†r)jsjΆr*hŒX
program_simplr+†r,jsjΆr-htj·†r.jsX
    r/†r0jbXtryr1†r2jsjΆr3htj6†r4jsjΆr5jRXsolver6†r7jsjΆr8htjv†r9jsjΆr:jX	intuitionr;†r<jsjΆr=htj‡†r>htjD†r?htjç†r@jsX

rA†rBjKXLocalrC†rDjsjΆrEhŒX
ObligationrF†rGjsjΆrHjKXTacticrI†rJjsjΆrKhtX:=rL†rMjsjΆrNhŒXsimpl_relationrO†rPhtjç†rQjsX

rR†rShX(*rT†rUhj½†rVhX Logical implication. rW†rXhX*)rY†rZjsX

r[†r\hŒXProgramr]†r^jsjΆr_jKXInstancer`†rajsjΆrbhŒXimpl_Reflexiverc†rdjsjΆrehtj=†rfjsjΆrghŒX	Reflexiverh†rijsjΆrjhŒXimplrk†rlhtjç†rmjsjƆrnhŒXProgramro†rpjsjΆrqjKXInstancerr†rsjsjΆrthŒXimpl_Transitiveru†rvjsjΆrwhtj=†rxjsjΆryhŒX
Transitiverz†r{jsjΆr|hŒXimplr}†r~htjç†rjsX

r€†rhX(*r‚†rƒhj½†r„hX Logical equivalence. r…†r†hX*)r‡†rˆjsX

r‰†rŠhŒXProgramr‹†rŒjsjΆrjKXInstancerŽ†rjsjΆrhŒX
iff_Reflexiver‘†r’jsjΆr“htj=†r”jsjΆr•hŒX	Reflexiver–†r—jsjΆr˜hŒXiffr™†ršhtjç†r›jsjƆrœhŒXProgramr†ržjsjΆrŸjKXInstancer †r¡jsjΆr¢hŒX
iff_Symmetricr£†r¤jsjΆr¥htj=†r¦jsjΆr§hŒX	Symmetricr¨†r©jsjΆrªhŒXiffr«†r¬htjç†r­jsjƆr®hŒXProgramr¯†r°jsjΆr±jKXInstancer²†r³jsjΆr´hŒXiff_Transitiverµ†r¶jsjΆr·htj=†r¸jsjΆr¹hŒX
Transitiverº†r»jsjΆr¼hŒXiffr½†r¾htjç†r¿jsX

rÀ†rÁhX(*rÂ†rÃhj½†rÄhX Leibniz equality. rÅ†rÆhX*)rÇ†rÈjsX

rÉ†rÊjKXInstancerË†rÌjsjΆrÍhŒXeq_ReflexiverÎ†rÏjsjΆrÐhtjW†rÑhŒjY†rÒhtj[†rÓjsjΆrÔhtj=†rÕjsjΆrÖhŒX	Reflexiver×†rØjsjΆrÙhtj6†rÚhtjw†rÛhŒXeqrÜ†rÝjsjΆrÞhŒjY†rßhtjD†ràjsjΆráhtX:=râ†rãjsjΆrähtjw†råhŒXeq_reflræ†rçjsjΆrèhŒjY†réhtjç†rêjsjƆrëjKXInstancerì†ríjsjΆrîhŒXeq_Symmetricrï†rðjsjΆrñhtjW†ròhŒjY†róhtj[†rôjsjΆrõhtj=†röjsjΆr÷hŒX	Symmetricrø†rùjsjΆrúhtj6†rûhtjw†rühŒXeqrý†rþjsjΆrÿhŒjY†r
htjD†r
jsjΆr
htX:=r
†r
jsjΆr
htjw†r
hŒXeq_symr
†r
jsjΆr	
hŒjY†r

htjç†r
jsjƆr
jKXInstancer

†r
jsjΆr
hŒX
eq_Transitiver
†r
jsjΆr
htjW†r
hŒjY†r
htj[†r
jsjΆr
htj=†r
jsjΆr
hŒX
Transitiver
†r
jsjΆr
htj6†r
htjw†r
hŒXeqr
†r
jsjΆr 
hŒjY†r!
htjD†r"
jsjΆr#
htX:=r$
†r%
jsjΆr&
htjw†r'
hŒXeq_transr(
†r)
jsjΆr*
hŒjY†r+
htjç†r,
jsX

r-
†r.
hX(*r/
†r0
hj½†r1
hXA Various combinations of reflexivity, symmetry and transitivity. r2
†r3
hX*)r4
†r5
jsX

r6
†r7
hX(*r8
†r9
hj½†r:
hX0 A [PreOrder] is both Reflexive and Transitive. r;
†r<
hX*)r=
†r>
jsX

r?
†r@
jKXClassrA
†rB
jsjΆrC
hŒXPreOrderrD
†rE
jsjΆrF
htjW†rG
hŒjY†rH
htj[†rI
jsjΆrJ
htj6†rK
hŒj0†rL
jsjΆrM
htj=†rN
jsjΆrO
hŒXrelationrP
†rQ
jsjΆrR
hŒjY†rS
htjD†rT
jsjΆrU
htj=†rV
jsjΆrW
j-XProprX
†rY
jsjΆrZ
htX:=r[
†r\
jsjΆr]
htjW†r^
jsX
  r_
†r`
hŒXPreOrder_Reflexivera
†rb
jsjΆrc
htX:>rd
†re
jsjΆrf
hŒX	Reflexiverg
†rh
jsjΆri
hŒj0†rj
jsjΆrk
htj·†rl
jsX
  rm
†rn
hŒXPreOrder_Transitivero
†rp
jsjΆrq
htX:>rr
†rs
jsjΆrt
hŒX
Transitiveru
†rv
jsjΆrw
hŒj0†rx
jsjΆry
htj[†rz
htjç†r{
jsX

r|
†r}
hX(*r~
†r
hj½†r€
hX= A partial equivalence relation is Symmetric and Transitive. r
†r‚
hX*)rƒ
†r„
jsX

r…
†r†
jKXClassr‡
†rˆ
jsjΆr‰
hŒXPERrŠ
†r‹
jsjΆrŒ
htjW†r
hŒjY†rŽ
htj[†r
jsjΆr
htj6†r‘
hŒj0†r’
jsjΆr“
htj=†r”
jsjΆr•
hŒXrelationr–
†r—
jsjΆr˜
hŒjY†r™
htjD†rš
jsjΆr›
htj=†rœ
jsjΆr
j-XProprž
†rŸ
jsjΆr 
htX:=r¡
†r¢
jsjΆr£
htjW†r¤
jsX
  r¥
†r¦
hŒX
PER_Symmetricr§
†r¨
jsjΆr©
htX:>rª
†r«
jsjΆr¬
hŒX	Symmetricr­
†r®
jsjΆr¯
hŒj0†r°
jsjΆr±
htj·†r²
jsX
  r³
†r´
hŒXPER_Transitiverµ
†r¶
jsjΆr·
htX:>r¸
†r¹
jsjΆrº
hŒX
Transitiver»
†r¼
jsjΆr½
hŒj0†r¾
jsjΆr¿
htj[†rÀ
htjç†rÁ
jsX

rÂ
†rÃ
hX(*rÄ
†rÅ
hj½†rÆ
hX Equivalence relations. rÇ
†rÈ
hX*)rÉ
†rÊ
jsX

rË
†rÌ
jKXClassrÍ
†rÎ
jsjΆrÏ
hŒXEquivalencerÐ
†rÑ
jsjΆrÒ
htjW†rÓ
hŒjY†rÔ
htj[†rÕ
jsjΆrÖ
htj6†r×
hŒj0†rØ
jsjΆrÙ
htj=†rÚ
jsjΆrÛ
hŒXrelationrÜ
†rÝ
jsjΆrÞ
hŒjY†rß
htjD†rà
jsjΆrá
htj=†râ
e(jsjΆrã
j-XProprä
†rå
jsjΆræ
htX:=rç
†rè
jsjΆré
htjW†rê
jsX
  rë
†rì
hŒXEquivalence_Reflexiverí
†rî
jsjΆrï
htX:>rð
†rñ
jsjΆrò
hŒX	Reflexiveró
†rô
jsjΆrõ
hŒj0†rö
jsjΆr÷
htj·†rø
jsX
  rù
†rú
hŒXEquivalence_Symmetricrû
†rü
jsjΆrý
htX:>rþ
†rÿ
jsjΆrhŒX	Symmetricr†rjsjΆrhŒj0†rjsjΆrhtj·†rjsX
  r†rhŒXEquivalence_Transitiver	†r
jsjΆrhtX:>r†r
jsjΆrhŒX
Transitiver†rjsjΆrhŒj0†rjsjΆrhtj[†rhtjç†rjsX

r†rhX(*r†rhj½†rhX+ An Equivalence is a PER plus reflexivity. r†rhX*)r†rjsX

r†r jKXInstancer!†r"jsjΆr#hŒXEquivalence_PERr$†r%jsjΆr&htj†r'htj6†r(hŒXEquivalencer)†r*jsjΆr+hŒjY†r,jsjΆr-hŒj0†r.htjD†r/jsjΆr0htj=†r1jsjΆr2hŒXPERr3†r4jsjΆr5hŒj0†r6jsjΆr7htjs†r8jsjΆr9jŸX10r:†r;jsjΆr<htX:=r=†r>jsX
  r?†r@htjW†rAjsjΆrBhŒX
PER_SymmetricrC†rDjsjΆrEhtX:=rF†rGjsjΆrHhŒXEquivalence_SymmetricrI†rJjsjΆrKhtj·†rLjsX
    rM†rNhŒXPER_TransitiverO†rPjsjΆrQhtX:=rR†rSjsjΆrThŒXEquivalence_TransitiverU†rVjsjΆrWhtj[†rXhtjç†rYjsX

rZ†r[hX(*r\†r]hj½†r^hXO We can now define antisymmetry w.r.t. an equivalence relation on the carrier. r_†r`hX*)ra†rbjsX

rc†rdjKXClassre†rfjsjΆrghŒX
Antisymmetricrh†rijsjΆrjhŒjY†rkjsjΆrlhŒXeqArm†rnjsjΆrohtj†rphtjW†rqhŒXequrr†rsjsjΆrthtj=†rujsjΆrvhŒXEquivalencerw†rxjsjΆryhŒjY†rzjsjΆr{hŒXeqAr|†r}htj[†r~jsjΆrhtj6†r€hŒj0†rjsjΆr‚htj=†rƒjsjΆr„hŒXrelationr…†r†jsjΆr‡hŒjY†rˆhtjD†r‰jsjΆrŠhtX:=r‹†rŒjsX
  r†rŽhŒXantisymmetryr†rjsjΆr‘htj=†r’jsjΆr“jXforallr”†r•jsjΆr–htjW†r—hŒjv†r˜jsjΆr™hŒjy†ršhtj[†r›htjÀ†rœjsjΆrhŒj0†ržjsjΆrŸhŒjv†r jsjΆr¡hŒjy†r¢jsjΆr£htX->r¤†r¥jsjΆr¦hŒj0†r§jsjΆr¨hŒjy†r©jsjΆrªhŒjv†r«jsjΆr¬htX->r­†r®jsjΆr¯hŒXeqAr°†r±jsjΆr²hŒjv†r³jsjΆr´hŒjy†rµhtjç†r¶jsX

r·†r¸hŒXProgramr¹†rºjsjΆr»jKX
Definitionr¼†r½jsjΆr¾hŒXflip_antiSymmetricr¿†rÀjsjΆrÁhtj†rÂhtj6†rÃhŒX
AntisymmetricrĆrÅjsjΆrÆhŒjY†rÇjsjΆrÈhŒXeqArɆrÊjsjΆrËhŒj0†rÌhtjD†rÍjsjΆrÎhtj=†rÏjsX
  rІrÑhŒX
AntisymmetricrÒ†rÓjsjΆrÔhŒjY†rÕjsjΆrÖhŒXeqAr׆rØjsjΆrÙhtj6†rÚhŒXfliprÛ†rÜjsjΆrÝhŒj0†rÞhtjD†rßhtjç†ràjsjƆrájKXProofrâ†rãhtjç†räjsjΆråhŒX
firstorderræ†rçhtjç†rèjsjΆréjKXQedrê†rëhtjç†rìjsX

rí†rîhX(*rï†rðhj½†rñhX“ Leibinz equality [eq] is an equivalence relation.
   The instance has low priority as it is always applicable
   if only the type is constrained. rò†róhX*)rô†rõjsX

rö†r÷hŒXProgramrø†rùjsjΆrújKXInstancerû†rüjsjΆrýhŒXeq_equivalencerþ†rÿjsjΆrhtj=†rjsjΆrhŒXEquivalencer†rjsjΆrhtj6†rhtjw†rhŒXeqr†r	jsjΆr
hŒjY†rhtjD†rjsjΆr
htjs†rjsjΆrjŸX10r†rhtjç†rjsX

r†rhX(*r†rhj½†rhX7 Logical equivalence [iff] is an equivalence relation. r†rhX*)r†rjsX

r†rhŒXProgramr†rjsjΆr jKXInstancer!†r"jsjΆr#hŒXiff_equivalencer$†r%jsjΆr&htj=†r'jsjΆr(hŒXEquivalencer)†r*jsjΆr+hŒXiffr,†r-htjç†r.jsX

r/†r0hX(*r1†r2hj½†r3hXÅ We now develop a generalization of results on relations for arbitrary predicates.
   The resulting theory can be applied to homogeneous binary relations but also to
   arbitrary n-ary predicates. r4†r5hX*)r6†r7jsX

r8†r9jKXLocalr:†r;jsjΆr<jKXOpenr=†r>jsjΆr?jKXScoper@†rAjsjΆrBhŒX
list_scoperC†rDhtjç†rEjsX

rF†rGhX(*rH†rIhX' Notation " [ ] " := nil : list_scope. rJ†rKhX*)rL†rMjsjƆrNhX(*rO†rPhX  Notation " [ x ; .. ; y ] " := rQ†rRhj6†rShX
cons x .. rT†rUhj6†rVhX
cons y nilrW†rXhjD†rYhX ..rZ†r[hjD†r\hjΆr]hj6†r^hX
at level 1r_†r`hjD†rahX : list_scope. rb†rchX*)rd†rejsX

rf†rghX(*rh†rihj½†rjhXS A compact representation of non-dependent arities, with the codomain singled-out. rk†rlhX*)rm†rnjsX

ro†rpjKXFixpointrq†rrjsjΆrshŒXarrowsrt†rujsjΆrvhtj6†rwhŒj†rxjsjΆryhtj=†rzjsjΆr{hŒXlistr|†r}jsjΆr~j-XTyper†r€htjD†rjsjΆr‚htj6†rƒhŒXrr„†r…jsjΆr†htj=†r‡jsjΆrˆj-XTyper‰†rŠhtjD†r‹jsjΆrŒhtj=†rjsjΆrŽj-XTyper†rjsjΆr‘htX:=r’†r“jsX
  r”†r•jXmatchr–†r—jsjΆr˜hŒj†r™jsjΆršjXwithr›†rœjsX
    r†ržhtjs†rŸjsjΆr hŒXnilr¡†r¢jsjΆr£htX=>r¤†r¥jsjΆr¦hŒj„†r§jsX
    r¨†r©htjs†rªjsjΆr«hŒjY†r¬jsjΆr­htX::r®†r¯jsjΆr°hŒXl'r±†r²jsjΆr³htX=>r´†rµjsjΆr¶hŒjY†r·jsjΆr¸htX->r¹†rºjsjΆr»hŒXarrowsr¼†r½jsjΆr¾hŒXl'r¿†rÀjsjΆrÁhŒj„†rÂjsX
  rÆrÄjXendrņrÆhtjç†rÇjsX

rȆrÉhX(*rʆrËhj½†rÌhXQ We can define abbreviations for operation and relation types based on [arrows]. r͆rÎhX*)rφrÐjsX

rцrÒjKX
DefinitionrÓ†rÔjsjΆrÕhŒXunary_operationrÖ†r×jsjΆrØhŒjY†rÙjsjΆrÚhtX:=rÛ†rÜjsjΆrÝhŒXarrowsrÞ†rßjsjΆràhtj6†ráhŒjY†râhtX::rã†rähŒXnilrå†ræhtjD†rçjsjΆrèhŒjY†réhtjç†rêjsjƆrëjKX
Definitionrì†ríjsjΆrîhŒXbinary_operationrï†rðjsjΆrñhŒjY†ròjsjΆróhtX:=rô†rõjsjΆröhŒXarrowsr÷†røjsjΆrùhtj6†rúhŒjY†rûhtX::rü†rýhŒjY†rþhtX::rÿ†rhŒXnilr†rhtjD†rjsjΆrhŒjY†rhtjç†rjsjƆrjKX
Definitionr†r	jsjΆr
hŒXternary_operationr†rjsjΆr
hŒjY†rjsjΆrhtX:=r†rjsjΆrhŒXarrowsr†rjsjΆrhtj6†rhŒjY†rhtX::r†rhŒjY†rhtX::r†rhŒjY†rhtX::r†rhŒXnilr †r!htjD†r"jsjΆr#hŒjY†r$htjç†r%jsX

r&†r'hX(*r(†r)hj½†r*hX8 We define n-ary [predicate]s as functions into [Prop]. r+†r,hX*)r-†r.jsX

r/†r0jKXNotationr1†r2jsjΆr3hŒX	predicater4†r5jsjΆr6hŒj†r7jsjΆr8htX:=r9†r:jsjΆr;htj6†r<hŒXarrowsr=†r>jsjΆr?hŒj†r@jsjΆrAj-XProprB†rChtjD†rDhtjç†rEjsX

rF†rGhX(*rH†rIhj½†rJhX Unary predicates, or sets. rK†rLhX*)rM†rNjsX

rO†rPjKX
DefinitionrQ†rRjsjΆrShŒXunary_predicaterT†rUjsjΆrVhŒjY†rWjsjΆrXhtX:=rY†rZjsjΆr[hŒX	predicater\†r]jsjΆr^htj6†r_hŒjY†r`htX::ra†rbhŒXnilrc†rdhtjD†rehtjç†rfjsX

rg†rhhX(*ri†rjhj½†rkhX; Homogeneous binary relations, equivalent to [relation A]. rl†rmhX*)rn†rojsX

rp†rqjKX
Definitionrr†rsjsjΆrthŒXbinary_relationru†rvjsjΆrwhŒjY†rxjsjΆryhtX:=rz†r{jsjΆr|hŒX	predicater}†r~jsjΆrhtj6†r€hŒjY†rhtX::r‚†rƒhŒjY†r„htX::r…†r†hŒXnilr‡†rˆhtjD†r‰htjç†rŠjsX

r‹†rŒhX(*r†rŽhj½†rhXF We can close a predicate by universal or existential quantification. r†r‘hX*)r’†r“jsX

r”†r•jKXFixpointr–†r—jsjΆr˜hŒX
predicate_allr™†ršjsjΆr›htj6†rœhŒj†rjsjΆržhtj=†rŸjsjΆr hŒXlistr¡†r¢jsjΆr£j-XTyper¤†r¥htjD†r¦jsjΆr§htj=†r¨jsjΆr©hŒX	predicaterª†r«jsjΆr¬hŒj†r­jsjΆr®htX->r¯†r°jsjΆr±j-XPropr²†r³jsjΆr´htX:=rµ†r¶jsX
  r·†r¸jXmatchr¹†rºjsjΆr»hŒj†r¼jsjΆr½jXwithr¾†r¿jsX
    rÀ†rÁhtjs†rÂjsjΆrÃhŒXnilrĆrÅjsjΆrÆhtX=>rdžrÈjsjΆrÉjXfunrʆrËjsjΆrÌhŒXfr͆rÎjsjΆrÏhtX=>rІrÑjsjΆrÒhŒj͆rÓjsX
    rÔ†rÕhtjs†rÖjsjΆr×hŒjY†rØjsjΆrÙhtX::rÚ†rÛjsjΆrÜhŒXtlr݆rÞjsjΆrßhtX=>rà†rájsjΆrâjXfunrã†räjsjΆråhŒj͆ræjsjΆrçhtX=>rè†réjsjΆrêjXforallrë†rìjsjΆríhŒjv†rîjsjΆrïhtj=†rðjsjΆrñhŒjY†ròhtjÀ†rójsjΆrôhŒX
predicate_allrõ†röjsjΆr÷hŒXtlrø†rùjsjΆrúhtj6†rûhŒj͆rüjsjΆrýhŒjv†rþhtjD†rÿjsX
  r†rjXendr†rhtjç†rjsX

r†rjKXFixpointr†rjsjΆr	hŒXpredicate_existsr
†rjsjΆrhtj6†r
hŒj†rjsjΆrhtj=†rjsjΆrhŒXlistr†rjsjΆrj-XTyper†rhtjD†rjsjΆrhtj=†rjsjΆrhŒX	predicater†rjsjΆrhŒj†rjsjΆrhtX->r †r!jsjΆr"j-XPropr#†r$jsjΆr%htX:=r&†r'jsX
  r(†r)jXmatchr*†r+jsjΆr,hŒj†r-jsjΆr.jXwithr/†r0jsX
    r1†r2htjs†r3jsjΆr4hŒXnilr5†r6jsjΆr7htX=>r8†r9jsjΆr:jXfunr;†r<jsjΆr=hŒj͆r>jsjΆr?htX=>r@†rAjsjΆrBhŒj͆rCjsX
    rD†rEhtjs†rFjsjΆrGhŒjY†rHjsjΆrIhtX::rJ†rKjsjΆrLhŒXtlrM†rNjsjΆrOhtX=>rP†rQjsjΆrRjXfunrS†rTjsjΆrUhŒj͆rVjsjΆrWhtX=>rX†rYjsjΆrZjXexistsr[†r\jsjΆr]hŒjv†r^jsjΆr_htj=†r`jsjΆrahŒjY†rbhtjÀ†rcjsjΆrdhŒXpredicate_existsre†rfjsjΆrghŒXtlrh†rijsjΆrjhtj6†rkhŒj͆rljsjΆrmhŒjv†rnhtjD†rojsX
  rp†rqjXendrr†rshtjç†rtjsX

ru†rvhX(*rw†rxhj½†ryhX» Pointwise extension of a binary operation on [T] to a binary operation
   on functions whose codomain is [T].
   For an operator on [Prop] this lifts the operator to a binary operation. rz†r{hX*)r|†r}jsX

r~†rjKXFixpointr€†rjsjΆr‚hŒXpointwise_extensionrƒ†r„jsjΆr…htjW†r†hŒjú†r‡jsjΆrˆhtj=†r‰jsjΆrŠj-XTyper‹†rŒhtj[†rjsjΆrŽhtj6†rhŒXopr†r‘jsjΆr’htj=†r“jsjΆr”hŒXbinary_operationr•†r–jsjΆr—hŒjú†r˜htjD†r™jsX
  rš†r›htj6†rœhŒj†rjsjΆržhtj=†rŸjsjΆr hŒXlistr¡†r¢jsjΆr£j-XTyper¤†r¥htjD†r¦jsjΆr§htj=†r¨jsjΆr©hŒXbinary_operationrª†r«jsjΆr¬htj6†r­hŒXarrowsr®†r¯jsjΆr°hŒj†r±jsjΆr²hŒjú†r³htjD†r´jsjΆrµhtX:=r¶†r·jsX
  r¸†r¹jXmatchrº†r»jsjΆr¼hŒj†r½jsjΆr¾jXwithr¿†rÀjsX
    rÁ†rÂhtjs†rÃjsjΆrÄhŒXnilrņrÆjsjΆrÇhtX=>rȆrÉjsjΆrÊjXfunrˆrÌjsjΆrÍhŒj0†rÎjsjΆrÏhŒXR'rІrÑjsjΆrÒhtX=>rÓ†rÔjsjΆrÕhŒXoprÖ†r×jsjΆrØhŒj0†rÙjsjΆrÚhŒXR'rÛ†rÜjsX
    r݆rÞhtjs†rßjsjΆràhŒjY†rájsjΆrâhtX::rã†räjsjΆråhŒXtlræ†rçjsjΆrèhtX=>ré†rêjsjΆrëjXfunrì†ríjsjΆrîhŒj0†rïjsjΆrðhŒXR'rñ†ròjsjΆróhtX=>rô†rõjsX
      rö†r÷jXfunrø†rùjsjΆrúhŒjv†rûjsjΆrühtX=>rý†rþjsjΆrÿhŒXpointwise_extensionr†rjsjΆrhŒXopr†rjsjΆrhŒXtlr†rjsjΆrhtj6†r	hŒj0†r
jsjΆrhŒjv†rhtjD†r
jsjΆrhtj6†rhŒXR'r†rjsjΆrhŒjv†rhtjD†rjsX
  r†rjXendr†rhtjç†rjsX

r†rhX(*r†rhj½†rhXa Pointwise lifting, equivalent to doing [pointwise_extension] and closing using [predicate_all]. r†r hX*)r!†r"jsX

r#†r$jKXFixpointr%†r&jsjΆr'hŒXpointwise_liftingr(†r)jsjΆr*htj6†r+hŒXopr,†r-jsjΆr.htj=†r/jsjΆr0hŒXbinary_relationr1†r2jsjΆr3j-XPropr4†r5htjD†r6jsX  r7†r8htj6†r9hŒj†r:jsjΆr;htj=†r<jsjΆr=hŒXlistr>†r?jsjΆr@j-XTyperA†rBhtjD†rCjsjΆrDhtj=†rEjsjΆrFhŒXbinary_relationrG†rHjsjΆrIhtj6†rJhŒX	predicaterK†rLjsjΆrMhŒj†rNhtjD†rOjsjΆrPhtX:=rQ†rRjsX
  rS†rTjXmatchrU†rVjsjΆrWhŒj†rXjsjΆrYjXwithrZ†r[jsX
    r\†r]htjs†r^jsjΆr_hŒXnilr`†rajsjΆrbhtX=>rc†rdjsjΆrejXfunrf†rgjsjΆrhhŒj0†rijsjΆrjhŒXR'rk†rljsjΆrmhtX=>rn†rojsjΆrphŒXoprq†rrjsjΆrshŒj0†rtjsjΆruhŒXR'rv†rwjsX
    rx†ryhtjs†rzjsjΆr{hŒjY†r|jsjΆr}htX::r~†rjsjΆr€hŒXtlr†r‚jsjΆrƒhtX=>r„†r…jsjΆr†jXfunr‡†rˆjsjΆr‰hŒj0†rŠjsjΆr‹hŒXR'rŒ†rjsjΆrŽhtX=>r†rjsX
      r‘†r’jXforallr“†r”jsjΆr•hŒjv†r–htjÀ†r—jsjΆr˜hŒXpointwise_liftingr™†ršjsjΆr›hŒXoprœ†rjsjΆržhŒXtlrŸ†r jsjΆr¡htj6†r¢hŒj0†r£jsjΆr¤hŒjv†r¥htjD†r¦jsjΆr§htj6†r¨hŒXR'r©†rªjsjΆr«hŒjv†r¬htjD†r­jsX
  r®†r¯jXendr°†r±htjç†r²jsX

r³†r´hX(*rµ†r¶hj½†r·hXN The n-ary equivalence relation, defined by lifting the 0-ary [iff] relation. r¸†r¹hX*)rº†r»jsX

r¼†r½jKX
Definitionr¾†r¿jsjΆrÀhŒXpredicate_equivalencerÁ†rÂjsjΆrÃhtjW†rÄhŒj†rÅjsjΆrÆhtj=†rÇjsjΆrÈhŒXlistrɆrÊjsjΆrËj-XTyper̆rÍhtj[†rÎjsjΆrÏhtj=†rÐjsjΆrÑhŒXbinary_relationrÒ†rÓjsjΆrÔhtj6†rÕhŒX	predicaterÖ†r×jsjΆrØhŒj†rÙhtjD†rÚjsjΆrÛhtX:=r܆rÝjsX
  rÞ†rßhŒXpointwise_liftingrà†rájsjΆrâhŒXiffrã†räjsjΆråhŒj†ræhtjç†rçjsX

rè†réhX(*rê†rëhj½†rìhXO The n-ary implication relation, defined by lifting the 0-ary [impl] relation. rí†rîhX*)rï†rðjsX

rñ†ròjKX
Definitionró†rôjsjΆrõhŒXpredicate_implicationrö†r÷jsjΆrøhtjW†rùhŒj†rújsjΆrûhtj=†rüjsjΆrýhŒXlistrþ†rÿjsjΆrj-XTyper†rhtj[†rjsjΆrhtX:=r†rjsX
  r†rhŒXpointwise_liftingr	†r
jsjΆrhŒXimplr†r
jsjΆrhŒj†rhtjç†rjsX

r†rhX(*r†rhj½†rhXD Notations for pointwise equivalence and implication of predicates. r†rhX*)r†rjsX

r†rhŒXInfixr†rjsjΆrjHj>†rjHX<∙>r †r!jHj>†r"jsjΆr#htX:=r$†r%jsjΆr&hŒXpredicate_equivalencer'†r(jsjΆr)htj6†r*hŒXatr+†r,jsjΆr-hŒXlevelr.†r/jsjΆr0jŸX95r1†r2htjÀ†r3jsjΆr4hŒXnor5†r6jsjΆr7hŒX
associativityr8†r9htjD†r:jsjΆr;htj=†r<jsjΆr=hŒXpredicate_scoper>†r?htjç†r@jsjƆrAhŒXInfixrB†rCjsjΆrDjHj>†rEjHX-∙>rF†rGjHj>†rHjsjΆrIhtX:=rJ†rKjsjΆrLe(hŒXpredicate_implicationrM†rNjsjΆrOhtj6†rPhŒXatrQ†rRjsjΆrShŒXlevelrT†rUjsjΆrVjŸX70rW†rXhtjÀ†rYjsjΆrZjXrightr[†r\jsjΆr]hŒX
associativityr^†r_htjD†r`jsjΆrahtj=†rbjsjΆrchŒXpredicate_scoperd†rehtjç†rfjsX

rg†rhjKXOpenri†rjjsjΆrkjKXLocalrl†rmjsjΆrnjKXScopero†rpjsjΆrqhŒXpredicate_scoperr†rshtjç†rtjsX

ru†rvhX(*rw†rxhj½†ryhX The pointwise liftings of conjunction and disjunctions.
   Note that these are [binary_operation]s, building new relations out of old ones. rz†r{hX*)r|†r}jsX

r~†rjKX
Definitionr€†rjsjΆr‚hŒXpredicate_intersectionrƒ†r„jsjΆr…htX:=r††r‡jsjΆrˆhŒXpointwise_extensionr‰†rŠjsjΆr‹hŒXandrŒ†rhtjç†rŽjsjƆrjKX
Definitionr†r‘jsjΆr’hŒXpredicate_unionr“†r”jsjΆr•htX:=r–†r—jsjΆr˜hŒXpointwise_extensionr™†ršjsjΆr›hŒXorrœ†rhtjç†ržjsX

rŸ†r hŒXInfixr¡†r¢jsjΆr£jHj>†r¤jHX/∙\r¥†r¦jHj>†r§jsjΆr¨htX:=r©†rªjsjΆr«hŒXpredicate_intersectionr¬†r­jsjΆr®htj6†r¯hŒXatr°†r±jsjΆr²hŒXlevelr³†r´jsjΆrµjŸX80r¶†r·htjÀ†r¸jsjΆr¹jXrightrº†r»jsjΆr¼hŒX
associativityr½†r¾htjD†r¿jsjΆrÀhtj=†rÁjsjΆrÂhŒXpredicate_scoperÆrÄhtjç†rÅjsjƆrÆhŒXInfixrdžrÈjsjΆrÉjHj>†rÊjHX\∙/rˆrÌjHj>†rÍjsjΆrÎhtX:=rφrÐjsjΆrÑhŒXpredicate_unionrÒ†rÓjsjΆrÔhtj6†rÕhŒXatrÖ†r×jsjΆrØhŒXlevelrÙ†rÚjsjΆrÛjŸX85r܆rÝhtjÀ†rÞjsjΆrßjXrightrà†rájsjΆrâhŒX
associativityrã†rähtjD†råjsjΆræhtj=†rçjsjΆrèhŒXpredicate_scoperé†rêhtjç†rëjsX

rì†ríhX(*rî†rïhj½†rðhX2 The always [True] and always [False] predicates. rñ†ròhX*)ró†rôjsX

rõ†röjKXFixpointr÷†røjsjΆrùjJXtruerú†rûhtjB†rühŒX	predicaterý†rþjsjΆrÿhtjW†rhŒj†rjsjΆrhtj=†rjsjΆrhŒXlistr†rjsjΆrj-XTyper†r	htj[†r
jsjΆrhtj=†rjsjΆr
hŒX	predicater†rjsjΆrhŒj†rjsjΆrhtX:=r†rjsX
  r†rjXmatchr†rjsjΆrhŒj†rjsjΆrjXwithr†rjsX
    r†rhtjs†r jsjΆr!hŒXnilr"†r#jsjΆr$htX=>r%†r&jsjΆr'hŒXTruer(†r)jsX
    r*†r+htjs†r,jsjΆr-hŒjY†r.jsjΆr/htX::r0†r1jsjΆr2hŒXtlr3†r4jsjΆr5htX=>r6†r7jsjΆr8jXfunr9†r:jsjΆr;htjB†r<jsjΆr=htX=>r>†r?jsjΆr@htjw†rAjJXtruerB†rChtjB†rDhŒX	predicaterE†rFjsjΆrGhŒXtlrH†rIjsX
  rJ†rKjXendrL†rMhtjç†rNjsX

rO†rPjKXFixpointrQ†rRjsjΆrSjJXfalserT†rUhtjB†rVhŒX	predicaterW†rXjsjΆrYhtjW†rZhŒj†r[jsjΆr\htj=†r]jsjΆr^hŒXlistr_†r`jsjΆraj-XTyperb†rchtj[†rdjsjΆrehtj=†rfjsjΆrghŒX	predicaterh†rijsjΆrjhŒj†rkjsjΆrlhtX:=rm†rnjsX
  ro†rpjXmatchrq†rrjsjΆrshŒj†rtjsjΆrujXwithrv†rwjsX
    rx†ryhtjs†rzjsjΆr{hŒXnilr|†r}jsjΆr~htX=>r†r€jsjΆrhŒXFalser‚†rƒjsX
    r„†r…htjs†r†jsjΆr‡hŒjY†rˆjsjΆr‰htX::rІr‹jsjΆrŒhŒXtlr†rŽjsjΆrhtX=>r†r‘jsjΆr’jXfunr“†r”jsjΆr•htjB†r–jsjΆr—htX=>r˜†r™jsjΆršhtjw†r›jJXfalserœ†rhtjB†ržhŒX	predicaterŸ†r jsjΆr¡hŒXtlr¢†r£jsX
  r¤†r¥jXendr¦†r§htjç†r¨jsX

r©†rªjKXNotationr«†r¬jsjΆr­jHj>†r®jHX	∙⊤∙r¯†r°jHj>†r±jsjΆr²htX:=r³†r´jsjΆrµjJXtruer¶†r·htjB†r¸hŒX	predicater¹†rºjsjΆr»htj=†r¼jsjΆr½hŒXpredicate_scoper¾†r¿htjç†rÀjsjƆrÁjKXNotationr†rÃjsjΆrÄjHj>†rÅjHX	∙⊥∙rƆrÇjHj>†rÈjsjΆrÉhtX:=rʆrËjsjΆrÌjJXfalser͆rÎhtjB†rÏhŒX	predicaterІrÑjsjΆrÒhtj=†rÓjsjΆrÔhŒXpredicate_scoperÕ†rÖhtjç†r×jsX

r؆rÙhX(*rÚ†rÛhj½†rÜhXX Predicate equivalence is an equivalence, and predicate implication defines a preorder. r݆rÞhX*)r߆ràjsX

rá†râhŒXProgramrã†räjsjΆråjKXInstanceræ†rçjsjΆrèhŒX!predicate_equivalence_equivalenceré†rêjsjΆrëhtj=†rìjsjΆríhŒXEquivalencerî†rïjsjΆrðhtj6†rñhtjw†ròhŒXpredicate_equivalenceró†rôjsjΆrõhŒj†röhtjD†r÷htjç†røjsX
  rù†rúhŒXNextrû†rüjsjΆrýhŒX
Obligationrþ†rÿhtjç†rjsX
    r†rjX	inductionr†rjsjΆrhŒj†rjsjΆrhtj·†rjsjΆr	hŒX
firstorderr
†rhtjç†rjsX
  r
†rjKXQedr†rhtjç†rjsX
  r†rhŒXNextr†rjsjΆrhŒX
Obligationr†rhtjç†rjsX
    r†rjX	inductionr†rjsjΆrhŒj†rjsjΆr htj·†r!jsjΆr"hŒX
firstorderr#†r$htjç†r%jsX
  r&†r'jKXQedr(†r)htjç†r*jsX
  r+†r,hŒXNextr-†r.jsjΆr/hŒX
Obligationr0†r1htjç†r2jsX
    r3†r4jXfoldr5†r6jsjΆr7hŒXpointwise_liftingr8†r9htjç†r:jsX
    r;†r<jX	inductionr=†r>jsjΆr?hŒj†r@htjç†rAjsjΆrBhŒX
firstorderrC†rDhtjç†rEjsX
    rF†rGjXintrosrH†rIhtjç†rJjsjΆrKjXsimplrL†rMjsjΆrNjXinrO†rPjsjΆrQhtj½†rRhtjç†rSjsjΆrTjXposerU†rVjsjΆrWhtj6†rXhŒXIHlrY†rZjsjΆr[htj6†r\hŒjv†r]jsjΆr^hŒXx0r_†r`htjD†rajsjΆrbhtj6†rchŒjy†rdjsjΆrehŒXx0rf†rghtjD†rhjsjΆrihtj6†rjhŒj†rkjsjΆrlhŒXx0rm†rnhtjD†rohtjD†rphtjç†rqjsX
    rr†rshŒX
firstorderrt†ruhtjç†rvjsX
  rw†rxjKXQedry†rzhtjç†r{jsX

r|†r}hŒXProgramr~†rjsjΆr€jKXInstancer†r‚jsjΆrƒhŒXpredicate_implication_preorderr„†r…jsjΆr†htj=†r‡jsX
  rˆ†r‰hŒXPreOrderrІr‹jsjΆrŒhtj6†rhtjw†rŽhŒXpredicate_implicationr†rjsjΆr‘hŒj†r’htjD†r“htjç†r”jsX
  r•†r–hŒXNextr—†r˜jsjΆr™hŒX
Obligationrš†r›htjç†rœjsX
    r†ržjX	inductionrŸ†r jsjΆr¡hŒj†r¢jsjΆr£htj·†r¤jsjΆr¥hŒX
firstorderr¦†r§htjç†r¨jsX
  r©†rªjKXQedr«†r¬htjç†r­jsX
  r®†r¯hŒXNextr°†r±jsjΆr²hŒX
Obligationr³†r´htjç†rµjsX
    r¶†r·jX	inductionr¸†r¹jsjΆrºhŒj†r»htjç†r¼jsjΆr½hŒX
firstorderr¾†r¿htjç†rÀjsX
    rÁ†rÂjXunfoldrÆrÄjsjΆrÅhŒXpredicate_implicationrƆrÇjsjΆrÈjXinrɆrÊjsjΆrËhtj½†rÌhtjç†rÍjsjΆrÎjXsimplrφrÐjsjΆrÑjXinrÒ†rÓjsjΆrÔhtj½†rÕhtjç†rÖjsX
    r׆rØjXintrorÙ†rÚhtjç†rÛjsjΆrÜjXposer݆rÞjsjΆrßhtj6†ràhŒXIHlrá†râjsjΆrãhtj6†rähŒjv†råjsjΆræhŒXx0rç†rèhtjD†réjsjΆrêhtj6†rëhŒjy†rìjsjΆríhŒXx0rî†rïhtjD†rðjsjΆrñhtj6†ròhŒj†rójsjΆrôhŒXx0rõ†röhtjD†r÷htjD†røhtjç†rùjsjΆrúhŒX
firstorderrû†rühtjç†rýjsX
  rþ†rÿjKXQedr†rhtjç†rjsX

r†rhX(*r†rhj½†rhXj We define the various operations which define the algebra on binary relations,
   from the general ones. r†r	hX*)r
†rjsX

r†r
jKX
Definitionr†rjsjΆrhŒXrelation_equivalencer†rjsjΆrhtjW†rhŒjY†rjsjΆrhtj=†rjsjΆrj-XTyper†rhtj[†rjsjΆrhtj=†rjsjΆrhŒXrelationr†r jsjΆr!htj6†r"hŒXrelationr#†r$jsjΆr%hŒjY†r&htjD†r'jsjΆr(htX:=r)†r*jsX
  r+†r,htjw†r-hŒXpredicate_equivalencer.†r/jsjΆr0htj6†r1htjB†r2htX::r3†r4htjB†r5htX::r6†r7hŒXnilr8†r9htjD†r:htjç†r;jsX

r<†r=jKXClassr>†r?jsjΆr@hŒXsubrelationrA†rBjsjΆrChtjW†rDhŒjY†rEhtj=†rFj-XTyperG†rHhtj[†rIjsjΆrJhtj6†rKhŒj0†rLjsjΆrMhŒXR'rN†rOjsjΆrPhtj=†rQjsjΆrRhŒXrelationrS†rTjsjΆrUhŒjY†rVhtjD†rWjsjΆrXhtj=†rYjsjΆrZj-XPropr[†r\jsjΆr]htX:=r^†r_jsX
  r`†rahŒXis_subrelationrb†rcjsjΆrdhtj=†rejsjΆrfhtjw†rghŒXpredicate_implicationrh†rijsjΆrjhtj6†rkhŒjY†rlhtX::rm†rnhŒjY†rohtX::rp†rqhŒXnilrr†rshtjD†rtjsjΆruhŒj0†rvjsjΆrwhŒXR'rx†ryhtjç†rzjsX

r{†r|jKXImplicitr}†r~jsjΆrjKX	Argumentsr€†rjsjΆr‚hŒXsubrelationrƒ†r„jsjΆr…htjv†r†htjv†r‡hŒjY†rˆhtj‡†r‰htj‡†rŠhtjç†r‹jsX

rŒ†rjKX
DefinitionrކrjsjΆrhŒXrelation_conjunctionr‘†r’jsjΆr“htjW†r”hŒjY†r•htj[†r–jsjΆr—htj6†r˜hŒj0†r™jsjΆršhtj=†r›jsjΆrœhŒXrelationr†ržjsjΆrŸhŒjY†r htjD†r¡jsjΆr¢htj6†r£hŒXR'r¤†r¥jsjΆr¦htj=†r§jsjΆr¨hŒXrelationr©†rªjsjΆr«hŒjY†r¬htjD†r­jsjΆr®htj=†r¯jsjΆr°hŒXrelationr±†r²jsjΆr³hŒjY†r´jsjΆrµhtX:=r¶†r·jsX
  r¸†r¹htjw†rºhŒXpredicate_intersectionr»†r¼jsjΆr½htj6†r¾hŒjY†r¿htX::rÀ†rÁhŒjY†rÂhtX::rÆrÄhŒXnilrņrÆhtjD†rÇjsjΆrÈhŒj0†rÉjsjΆrÊhŒXR'rˆrÌhtjç†rÍjsX

rΆrÏjKX
DefinitionrІrÑjsjΆrÒhŒXrelation_disjunctionrÓ†rÔjsjΆrÕhtjW†rÖhŒjY†r×htj[†rØjsjΆrÙhtj6†rÚhŒj0†rÛjsjΆrÜhtj=†rÝjsjΆrÞhŒXrelationr߆ràjsjΆráhŒjY†râhtjD†rãjsjΆrähtj6†råhŒXR'ræ†rçjsjΆrèhtj=†réjsjΆrêhŒXrelationrë†rìjsjΆríhŒjY†rîhtjD†rïjsjΆrðhtj=†rñjsjΆròhŒXrelationró†rôjsjΆrõhŒjY†röjsjΆr÷htX:=rø†rùjsX
  rú†rûhtjw†rühŒXpredicate_unionrý†rþjsjΆrÿhtj6†rhŒjY†rhtX::r†rhŒjY†rhtX::r†rhŒXnilr†rhtjD†r	jsjΆr
hŒj0†rjsjΆrhŒXR'r
†rhtjç†rjsX

r†rhX(*r†rhj½†rhXR Relation equivalence is an equivalence, and subrelation defines a partial order. r†rhX*)r†rjsX

r†rjKXSetr†rjsjΆrhŒX	Automaticr†rjsjΆr hŒXIntroductionr!†r"htjç†r#jsX

r$†r%jKXInstancer&†r'jsjΆr(hŒX relation_equivalence_equivalencer)†r*jsjΆr+htj6†r,hŒjY†r-jsjΆr.htj=†r/jsjΆr0j-XTyper1†r2htjD†r3jsjΆr4htj=†r5jsX
  r6†r7hŒXEquivalencer8†r9jsjΆr:htj6†r;htjw†r<hŒXrelation_equivalencer=†r>jsjΆr?hŒjY†r@htjD†rAhtjç†rBjsjƆrCjKXProofrD†rEhtjç†rFjsjΆrGjRXexactrH†rIjsjΆrJhtj6†rKhtjw†rLhŒX!predicate_equivalence_equivalencerM†rNjsjΆrOhtj6†rPhŒjY†rQhtX::rR†rShŒjY†rThtX::rU†rVhŒXnilrW†rXhtjD†rYhtjD†rZhtjç†r[jsjΆr\jKXQedr]†r^htjç†r_jsX

r`†rajKXInstancerb†rcjsjΆrdhŒXrelation_implication_preorderre†rfjsjΆrghŒjY†rhjsjΆrihtj=†rjjsjΆrkhŒXPreOrderrl†rmjsjΆrnhtj6†rohtjw†rphŒXsubrelationrq†rrjsjΆrshŒjY†rthtjD†ruhtjç†rvjsjƆrwjKXProofrx†ryhtjç†rzjsjΆr{jRXexactr|†r}jsjΆr~htj6†rhtjw†r€hŒXpredicate_implication_preorderr†r‚jsjΆrƒhtj6†r„hŒjY†r…htX::r††r‡hŒjY†rˆhtX::r‰†rŠhŒXnilr‹†rŒhtjD†rhtjD†rŽhtjç†rjsjΆrjKXQedr‘†r’htjç†r“jsX

r”†r•hX(*r–†r—hj½†r˜hjΆr™hj½†ršhj½†r›hj½†rœhX¬ Partial Order.
   A partial order is a preorder which is additionally antisymmetric.
   We give an equivalent definition, up-to an equivalence relation
   on the carrier. r†ržhX*)rŸ†r jsX

r¡†r¢jKXClassr£†r¤jsjΆr¥hŒXPartialOrderr¦†r§jsjΆr¨htjW†r©hŒjY†rªhtj[†r«jsjΆr¬hŒXeqAr­†r®jsjΆr¯htj†r°htjW†r±hŒXequr²†r³jsjΆr´htj=†rµjsjΆr¶hŒXEquivalencer·†r¸jsjΆr¹hŒjY†rºjsjΆr»hŒXeqAr¼†r½htj[†r¾jsjΆr¿hŒj0†rÀjsjΆrÁhtj†rÂhtjW†rÃhŒXpreorĆrÅjsjΆrÆhtj=†rÇjsjΆrÈhŒXPreOrderrɆrÊjsjΆrËhŒjY†rÌjsjΆrÍhŒj0†rÎhtj[†rÏjsjΆrÐhtX:=rцrÒjsX
  rÓ†rÔhŒXpartial_order_equivalencerÕ†rÖjsjΆr×htj=†rØjsjΆrÙhŒXrelation_equivalencerÚ†rÛjsjΆrÜhŒXeqAr݆rÞjsjΆrßhtj6†ràhŒXrelation_conjunctionrá†râjsjΆrãhŒj0†räjsjΆråhtj6†ræhŒXinverserç†rèjsjΆréhŒj0†rêhtjD†rëhtjD†rìhtjç†ríjsX

rî†rïhX(*rð†rñhj½†ròhX` The equivalence proof is sufficient for proving that [R] must be a morphism
   for equivalence ró†rôhj6†rõhX
see Morphismsrö†r÷hjD†røhXJ.
   It is also sufficient to show that [R] is antisymmetric w.r.t. [eqA] rù†rúhX*)rû†rüjsX

rý†rþjKXInstancerÿ†rjsjΆrhŒXpartial_order_antisymr†rjsjΆrhtj†rhtj6†rhŒXPartialOrderr†rjsjΆr	hŒjY†r
jsjΆrhŒXeqAr†r
jsjΆrhŒj0†rhtjD†rjsjΆrhtj=†rjsjΆrhtX!r†rjsjΆrhŒX
Antisymmetricr†rjsjΆrhŒjY†rjsjΆrhŒXeqAr†rjsjΆrhŒj0†rhtjç†r jsjƆr!jKXProofr"†r#jsjΆr$jXwithr%†r&jsjΆr'jXautor(†r)htjç†r*jsX
  r+†r,hŒXreduce_goalr-†r.htjç†r/jsX
  r0†r1jXposer2†r3jsjΆr4hŒXproofr5†r6jsjΆr7hŒXpartial_order_equivalencer8†r9jsjΆr:jXasr;†r<jsjΆr=hŒXpoer>†r?htjç†r@jsjΆrAjbXdorB†rCjsjΆrDjŸjB†rEjsjΆrFjXredrG†rHjsjΆrIjXinrJ†rKjsjΆrLhŒXpoerM†rNhtjç†rOjsX
  rP†rQjXapplyrR†rSjsjΆrThtX<-rU†rVjsjΆrWhŒXpoerX†rYhtjç†rZjsjΆr[hŒX
firstorderr\†r]htjç†r^jsjƆr_jKXQedr`†rahtjç†rbjsX

rc†rdhX(*re†rfhj½†rghXD The partial order defined by subrelation and relation equivalence. rh†rihX*)rj†rkjsX

rl†rmhŒXProgramrn†rojsjΆrpjKXInstancerq†rrjsjΆrshŒXsubrelation_partial_orderrt†rujsjΆrvhtj=†rwjsX
  rx†ryhtj†rzjsjΆr{hŒXPartialOrderr|†r}jsjΆr~htj6†rhŒXrelationr€†rjsjΆr‚hŒjY†rƒhtjD†r„jsjΆr…hŒXrelation_equivalencer††r‡jsjΆrˆhŒXsubrelationr‰†rŠhtjç†r‹jsX

  rŒ†rhŒXNextrކrjsjΆrhŒX
Obligationr‘†r’htjç†r“jsX
  r”†r•jKXProofr–†r—htjç†r˜jsX
    r™†ršjXunfoldr›†rœjsjΆrhŒXrelation_equivalencerž†rŸjsjΆr jXinr¡†r¢jsjΆr£htj½†r¤htjç†r¥jsjΆr¦hŒX
firstorderr§†r¨htjç†r©jsX
  rª†r«jKXQedr¬†r­htjç†r®jsX

r¯†r°e(hŒXTypeclassesr±†r²jsjΆr³hŒXOpaquer´†rµjsjΆr¶hŒXarrowsr·†r¸jsjΆr¹hŒXpredicate_implicationrº†r»jsjΆr¼hŒXpredicate_equivalencer½†r¾jsX
  r¿†rÀhŒXrelation_equivalencerÁ†rÂjsjΆrÃhŒXpointwise_liftingrĆrÅhtjç†rÆjsX

rdžrÈhX(*rɆrÊhj½†rËhX§ Rewrite relation on a given support: declares a relation as a rewrite
   relation for use by the generalized rewriting tactic.
   It helps choosing if a rewrite should be handled
   by the generalized or the regular rewriting tactic using leibniz equality.
   Users can declare an [RewriteRelation A RA] anywhere to declare default
   relations. This is also done automatically by the [Declare Relation A RA]
   commands. r̆rÍhX*)rΆrÏjsX

rІrÑjKXClassrÒ†rÓjsjΆrÔhŒXRewriteRelationrÕ†rÖjsjΆr×htjW†rØhŒjY†rÙjsjΆrÚhtj=†rÛjsjΆrÜj-XTyper݆rÞhtj[†rßjsjΆràhtj6†ráhŒXRArâ†rãjsjΆrähtj=†råjsjΆræhŒXrelationrç†rèjsjΆréhŒjY†rêhtjD†rëhtjç†rìjsX

rí†rîjKXInstancerï†rðhtj=†rñjsjΆròhŒXRewriteRelationró†rôjsjΆrõhŒXimplrö†r÷htjç†røjsjƆrùjKXInstancerú†rûhtj=†rüjsjΆrýhŒXRewriteRelationrþ†rÿjsjΆrhŒXiffr†rhtjç†rjsjƆrjKXInstancer†rhtj=†rjsjΆrhŒXRewriteRelationr	†r
jsjΆrhtj6†rhtjw†r
hŒXrelation_equivalencer†rjsjΆrhŒjY†rhtjD†rhtjç†rjsX

r†rhX(*r†rhj½†rhX^ Any [Equivalence] declared in the context is automatically considered
   a rewrite relation. r†rhX*)r†rjsX

r†rjKXInstancer†r jsjΆr!hŒXequivalence_rewrite_relationr"†r#jsjΆr$htj†r%htj6†r&hŒXEquivalencer'†r(jsjΆr)hŒjY†r*jsjΆr+hŒXeqAr,†r-htjD†r.jsjΆr/htj=†r0jsjΆr1hŒXRewriteRelationr2†r3jsjΆr4hŒXeqAr5†r6htjç†r7jsX

r8†r9hX(*r:†r;hj½†r<hX Strict Order r=†r>hX*)r?†r@jsX

rA†rBjKXClassrC†rDjsjΆrEhŒXStrictOrderrF†rGjsjΆrHhtjW†rIhŒjY†rJjsjΆrKhtj=†rLjsjΆrMj-XTyperN†rOhtj[†rPjsjΆrQhtj6†rRhŒj0†rSjsjΆrThtj=†rUjsjΆrVhŒXrelationrW†rXjsjΆrYhŒjY†rZhtjD†r[jsjΆr\htX:=r]†r^jsjΆr_htjW†r`jsX
  ra†rbhŒXStrictOrder_Irreflexiverc†rdjsjΆrehtX:>rf†rgjsjΆrhhŒXIrreflexiveri†rjjsjΆrkhŒj0†rljsjΆrmhtj·†rnjsX
  ro†rphŒXStrictOrder_Transitiverq†rrjsjΆrshtX:>rt†rujsjΆrvhŒX
Transitiverw†rxjsjΆryhŒj0†rzjsjƆr{htj[†r|htjç†r}jsX

r~†rjKXInstancer€†rjsjΆr‚hŒXStrictOrder_Asymmetricrƒ†r„jsjΆr…htj†r†htj6†r‡hŒXStrictOrderrˆ†r‰jsjΆrŠhŒjY†r‹jsjΆrŒhŒj0†rhtjD†rŽjsjΆrhtj=†rjsjΆr‘hŒX
Asymmetricr’†r“jsjΆr”hŒj0†r•htjç†r–jsjƆr—jKXProofr˜†r™htjç†ršjsjΆr›hŒX
firstorderrœ†rhtjç†ržjsjΆrŸjKXQedr †r¡htjç†r¢jsX

r£†r¤hX(*r¥†r¦hj½†r§hX7 Inversing a [StrictOrder] gives another [StrictOrder] r¨†r©hX*)rª†r«jsX

r¬†r­jKXLemmar®†r¯jsjΆr°hŒXStrictOrder_inverser±†r²jsjΆr³htj†r´htj6†rµhŒXStrictOrderr¶†r·jsjΆr¸hŒjY†r¹jsjΆrºhŒj0†r»htjD†r¼jsjΆr½htj=†r¾jsjΆr¿hŒXStrictOrderrÀ†rÁjsjΆrÂhtj6†rÃhŒXinverserĆrÅjsjΆrÆhŒj0†rÇhtjD†rÈhtjç†rÉjsjƆrÊjKXProofrˆrÌhtjç†rÍjsjΆrÎhŒX
firstorderrφrÐhtjç†rÑjsjΆrÒjKXQedrÓ†rÔhtjç†rÕjsX

rÖ†r×hX(*r؆rÙhj½†rÚhX Same for [PartialOrder]. rÛ†rÜhX*)r݆rÞjsX

r߆ràjKXLemmará†râjsjΆrãhŒXPreOrder_inverserä†råjsjΆræhtj†rçhtj6†rèhŒXPreOrderré†rêjsjΆrëhŒjY†rìjsjΆríhŒj0†rîhtjD†rïjsjΆrðhtj=†rñjsjΆròhŒXPreOrderró†rôjsjΆrõhtj6†röhŒXinverser÷†røjsjΆrùhŒj0†rúhtjD†rûhtjç†rüjsjƆrýjKXProofrþ†rÿhtjç†rjsjΆrhŒX
firstorderr†rhtjç†rjsjΆrjKXQedr†rhtjç†rjsX

r	†r
jKXHintr†rjsjΆr
hŒXExternr†rjsjΆrjŸjB†rjsjΆrhtj6†rhŒXStrictOrderr†rjsjΆrhtj6†rhŒXinverser†rjsjΆrhtjB†rhtjD†rhtjD†rjsjΆrhtX=>r†r jsjΆr!hŒXclass_applyr"†r#jsjΆr$hŒXStrictOrder_inverser%†r&jsjΆr'htj=†r(jsjΆr)hŒXtypeclass_instancesr*†r+htjç†r,jsjƆr-jKXHintr.†r/jsjΆr0hŒXExternr1†r2jsjΆr3jŸjB†r4jsjΆr5htj6†r6hŒXPreOrderr7†r8jsjΆr9htj6†r:hŒXinverser;†r<jsjΆr=htjB†r>htjD†r?htjD†r@jsjΆrAhtX=>rB†rCjsjΆrDhŒXclass_applyrE†rFjsjΆrGhŒXPreOrder_inverserH†rIjsjΆrJhtj=†rKjsjΆrLhŒXtypeclass_instancesrM†rNhtjç†rOjsX

rP†rQjKXLemmarR†rSjsjΆrThŒXPartialOrder_inverserU†rVjsjΆrWhtj†rXhtj6†rYhŒXPartialOrderrZ†r[jsjΆr\hŒjY†r]jsjΆr^hŒXeqAr_†r`jsjΆrahŒj0†rbhtjD†rcjsjΆrdhtj=†rejsjΆrfhŒXPartialOrderrg†rhjsjΆrihŒXeqArj†rkjsjΆrlhtj6†rmhŒXinversern†rojsjΆrphŒj0†rqhtjD†rrhtjç†rsjsjƆrtjKXProofru†rvhtjç†rwjsjΆrxhŒX
firstorderry†rzhtjç†r{jsjΆr|jKXQedr}†r~htjç†rjsX

r€†rjKXHintr‚†rƒjsjΆr„hŒXExternr…†r†jsjΆr‡jŸjB†rˆjsjΆr‰htj6†rŠhŒXPartialOrderr‹†rŒjsjΆrhtj6†rŽhŒXinverser†rjsjΆr‘htjB†r’htjD†r“htjD†r”jsjΆr•htX=>r–†r—jsjΆr˜hŒXclass_applyr™†ršjsjΆr›hŒXPartialOrder_inverserœ†rjsjΆržhtj=†rŸjsjΆr hŒXtypeclass_instancesr¡†r¢htjç†r£jsjƆr¤e.