e(0ddZddlZGddZdZdZGddZd Zd Zd ZdS) a An implementation of the Knuth-Bendix algorithm, as described in (1), p. 143. For determining if two paths in a category are equal. The algorithm as given here, takes a set of equations in the form of a sequence: E = [(a, b), (c, d) ...] where a, b, c, d are 'paths'. Paths are given as strings, for example: E = [ ('fhk', 'gh'), ('m', 'kkm') ] means that the path 'fhk' equals 'gh' and 'm' equals 'kkm'. Each arrow in the path is here a single character. If longer arrow names are required, a delimiter string can be specified as in: kb(E, delim='.') The paths must then be given by the delimiter between each arrow; E = [ ('h_arrow.g_arrow', 'g_arrow.k_arrow') ... ] The function kb(E) returns an object, say A, which is o callable: A(a, b)->boolean determines if two paths given by a, b are equal. o has a method A.reduce(a)->pathstring, which reduces a path to normal form. An optional parameter to kb, max_iterations, determines the maximum number of iterations the algorithm should try making the reduction system 'confluent'. The algorithm is not guaranteed to terminate with a confluent system in a finite number of iterations, so if the number of iterations needed exceeds max_iterations an exception (ValueError) will be raised. The default is 100. References (1) @book{walters91categories, title={Categories and Computer Science}, author={R. F. C. Walters}, publisher={Cambridge University Press}, location={Cambridge}, year=1991} (2) @book{grimaldi94discrete, author="Ralph P. Grimaldi". title="Discrete and Combinatorial Mathematics: An Applied Introduction", publisher="Addison-Wesley", location="Readin, Massachusetts", year=1994 } NcHeZdZd dZdZdZdZdZdZdd Z d Z d Z d S) KnuthBendixdcHg|_||_|D]g\}}|r*||}||}|||r||}}|j||fh|||dSN) reductionsdelim wrap_delimgtappendmake_confluentsort)selfEr max_iterationsabs /srv/buildsys-work-dir/castor/build_node/builder-2/WGSG1/unpkd_srcs/cloudlinux-venv-1.0.6/venv/lib/python3.11/site-packages/guppy/etc/KnuthBendix.py__init__zKnuthBendix.__init__Ds  + +DAq 'OOA&&OOA&&wwq!}} !1 O " "Aq6 * * * * N+++ cZ||||kSrreduce)rxys r__call__zKnuthBendix.__call__Qs!{{1~~Q//rc|j}|rt|}t|}n*||}||}||krdS||krdS||kS)Nr)r lencount)rrrr lalbs rr zKnuthBendix.gtTsl   QBQBBBB 771 7711u rc fd}i}t|D]P}d_tj}|D][\}}|D]Q\}} |||| f} | |vrd|| <||vr|} ||}|dkrh|d|| z||t |zdz} | } || | |||dz}|dkht |}td|t jz D]j}|d||z ||dkrO||||z dz} |d|| z} || | kS]d|vsJg}jjf}tjD]n\}}|\}}|j|<|}|}||kr*||kr$||f}| ||j|<not |jkr d|vsJ|_djvsJjrdSRtd|z)Nc||krX||rj||fnj||fd_dSdS)Nr)r r r confluent)pqrs r add_reductionz1KnuthBendix.make_confluent..add_reductioncsiAvv771a==3O**Aq62222O**Aq6222!" vrrr)rrzKnuthBendix.make_confluent did not terminate in %d iterations. Check your equations or specify an higher max_iterations value.' ) ranger&listr freduceindexr findr enumerater ValueError)rrr) reds_testediredsu1v1u2v2redr'uuur(lu1newrnullreduvuvrurvurvs` rrzKnuthBendix.make_confluentbs # # # # # ~&&2 2 ADN((D 0 0B"00FBr2r*Ck)) '(K$Rxx LL,,HHRLL1ff"$RaR&)BqRyzzN":C $ S 1 1A)M!Q/// "AaC 0 0A  1ff b''C"1c#dj//&9::00fs1uf:ABB// $ R"SUVV*_ = =A $ RVb[ 9 9A)M!Q/// 00(4''''Dz4:.G"4?33  21%,"\\!__\\!__77rRxxb'CKK$$$),DOA&&4yyDO++t++++"&4?2222~   rcD |}|jD] }|j|} ||krn|Sr)r replace)rr'r(r=s rr,zKnuthBendix.freducesD Ao # #AIrNAvv   rc|jr||}||}|jr||j}|Sr)r r r,striprr's rrzKnuthBendix.reducesP : #""A LLOO : $ ##ArNct|j}fd}|tj|dS)Nc\|\}}|\}}||rdS||krdSdS)Nrr)r )xxx_todo_changemexxx_todo_changeme1r_r__rs rcmpzKnuthBendix.sort..cmpsA&FQ(GQwwq!}} qAvvq2r)key)r r functools cmp_to_key)rr3rOs` rrzKnuthBendix.sortsO <?D      i*3// 00000rc.t|jdSr) printredsr )rs rppzKnuthBendix.pps$/"""""rc||js |j|z}||js ||jz}|Sr) startswithr endswithrGs rr zKnuthBendix.wrap_delimsI||DJ''  QAzz$*%% DJAr)rrr) __name__ __module__ __qualname__rrr rr,rrrUr rrrrCs    000   <<<|       1 1 1 1###rrct|D]3\}}t|dd|dzdzdkrt4|dzdzdkrtdSdS)N  )endrr)r/print)r3r2r=s rrTrTsy42 n#&&&& EQ;!   GGG A{a rc"t|g|Ri|Sr)r)rrks rkbres q "1 " " " " ""rceZdZdS) _GLUECLAMP_N)rYrZr[r\rrrgrgsDrrgcgdgd}t|ddgzgfdDz}|gdgdgdgd gd gksJS) N)1-1r2-i))z1.ir2)zi.irj)zi.i.irk)zi.i.i.iri.r c8g|]gfdDzS)cDg|]}d|S)rlr).0rRrs r z$test2...s0@@@!((aaa#344@@@rr\)rprGrqs @rrrztest2..s9LLLQaS@@@@@a@@@@LLLr)rlrirjr2rk)ririrjr2rk)rjrjrirkr2)r2r2rkrjri)rkrkr2rirj)re)rTrsrqs @@rtest2rus A   A 1CA q LLLLL!LLLLA ######$$$###$$$ & & & & & Hrc2dg}t|d}|ddsJddg}t|}|d}|d }|d ksJ|d ksJ|||rJdg}t|d}|d }|d ksJ|d }|dksJ|d}|dksJddg}t|d}|d}|d}|sJ|dk|dksJ|dksJddg}t|d}|d}|d}|dksJ|dksJdS)N).a..b.rlrmrwrx)fhkgh)mkkm fffghkkkmffghkmffffhmfffhmaaz.bb.bbrr)z.f.h.k.z.g.h.)z.m.z.k.k.m.z.f.f.f.g.h.k.k.k.m.z .f.f.g.h.k.m.)z .f.f.f.f.h.m.z .f.f.f.h.m.z f.f.f.f.h.mz f.f.f.h.m)z .f.ff.fff.z .ffff.ff.)z.fffff.z.fff.fff.fffff.z!.f.f.f.ffff.ff.fff.fff.fff.fffff.z.f.f.ffff.ff.fff.fffff.zf.f.f.f.ff.fffffzf.f.f.ff.fffff)rer)rrr'r(s rtestrs A 1CA 1UE???  %A 1A A A ==== <<<<qAww; A 1CA A 9999 A 9999  A 8888 12A 1CA &''A !!A 33a33331         $&DEA 1CA 455A *++A " " " " "  rcBgd}t|}gd}||_|S)N)HccHaabbaaacca)cccbabccacar) )HbHa)Haar)Habr)HcaHac)Hcbrrrr)abbr)rcb)acbr)baar)babr)bacr)bbar)bcar)bcbbbc)cabr)cbar)cbbr)cbcr)ccbr)Hacar)Haccr)bbbbr)bbbcr)bbccbbb)bccarr)ccaar)cccar)caccar)recanon)rrrs rtest3r%s?   A 1A   EAG Hr) __doc__rQrrTrergrurrr\rrrs==~NNNNNNNNb###           0%!%!%!P     r