K iB0ddlmZddlmZGddZy))deque) StateMachinecveZdZdZdZdZedZdZdZ ddZ ddZ dd Z d Z dd Zd ZdZdZdZy )RewritingSystema A class implementing rewriting systems for `FpGroup`s. References ========== .. [1] Epstein, D., Holt, D. and Rees, S. (1991). The use of Knuth-Bendix methods to solve the word problem in automatic groups. Journal of Symbolic Computation, 12(4-5), pp.397-414. .. [2] GAP's Manual on its KBMAG package https://www.gap-system.org/Manuals/pkg/kbmag-1.5.3/doc/manual.pdf c||_|j|_d|_d|_d|_d|_d|_i|_i|_ tgd|_ |jt|j}||Dcgc]}|dz c}z }tdt|jz||_|j!ycc}w)NidF2zReduction automaton for )group generatorsalphabet _is_confluentmaxeqnstidyint _max_exceededreduction_automaton _new_rulesrulesr rules_cache _init_ruleslistrreprconstruct_automaton)selfr r gens i/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/combinatorics/rewritingsystem.py__init__zRewritingSystem.__init__s (( !  #$(   R= $--( *53sBw55 #/0JDQUQ[Q[L\0\^h#i    "6s Cc>||jkDrd|_||_y)zF Set the maximum number of rules that can be defined FN)rr)rns rset_maxzRewritingSystem.set_max0s" t|| !&D  c\|j|j|_|jS)z; Return `True` if the system is confluent )r_check_confluencers r is_confluentzRewritingSystem.is_confluent:s-    %!%!7!7!9D !!!r!c|jjj}|jjD]}|j |||j yN)r free_groupidentityrelatorsadd_rule_remove_redundancies)rr)rs rrzRewritingSystem._init_rulesDsM::((11$$ 'A MM!X & ' !!#r!ct|jdz|jkDr'|j|_d|_t d||j|<|jr||j|<yy)zW Add the rule r1 -> r2 with no checking or further deductions TzToo many rules were defined.N) lenrrr#rr RuntimeErrorrr)rr1r2s r _add_rulezRewritingSystem._add_ruleKsk tzz?Q  -!%!7!7!9D !%D => > 2  # #"$DOOB  $r!ct}||k(r|S||kr||}}||f|jvr|S|jj||f||}}t|t|z dkr}||jvr%|j ||s|j |||dz|dzkDr?|dz|jvr.|j |dz|s|j |dz|dzt|t|z dkDr|t|dz }|jdt|dz }||dzz}t|t|z dkr4||jvrd|s|j |||j |n>t|t|z dkr$|j|||}|j|t|t|z dkDrt|t|z dkDr|d}|jdt|}|dz|z}t|t|z dkr4||jvrd|s|j |||j |n>t|t|z dkr$|j|||}|j|t|t|z dkDr|S)Nr r/r) setrappendr0raddr4subwordr+update) rw1w2checknew_keyss1s2gnews rr+zRewritingSystem.add_ruleZs5 8O 7B 8t'' 'O R)RB r7SW q # R NN2r*2vB2r6#; RV$NN2r62r62"gB"$3r719 AAs2wqy)BArEB2wR 1$TZZ' r2.LL$R3r7"Q&mmBE2$"gB"$"gB"$1AAs2w'BBrB2wR 1$TZZ' r2.LL$R3r7"Q&mmBE2$"gB"$r!ct}t}|jj}|D]}|j||}|j||}||k7rk|j|=|j |||kDr!|j |||j|<s||ksy|j |||j|<||j|<|r||fSy)a Reduce left- and right-hand sides of reduction rules and remove redundant equations (i.e. those for which lhs == rhs). If `changes` is `True`, return a set containing the removed keys and a set containing the added keys )excludeN)r7rcopyreducer9)rchangesremovedaddedrr-vws rr,z$RewritingSystem._remove_redundanciess% ! "A Aq )A E!H%AAvJJqM Aq5IIaL$%DJJqMUIIaL$%DJJqM ! 1  " E> !r!c8jr jStjj d}fd}d}d}|t kr$|}|dz }d}|t kr|}|dz }||k(r|||} | j ||dz|| sE| D]F} || |||} | r$|ryj | |t | z }4| dk(s:jcS|jkDrZ|sXjd\} } d}| rtfd | D}Dcgc] }|| vs| c}j | || vrn|t kr|t kr$d_|sjycc}w) zg Try to make the system confluent using the Knuth-Bendix completion algorithm ct|}t|}g}td||zD]}|j||z ||z|z d|j||z |dk(s9|jd||z d}||jd||z dz}|j||z |d}|j||d}||j||z|z |dz}|j||z|z|S)Nr/F)strictr)r0ranger:r8) r2r3len1len2resultjabcs r _overlapsz1RewritingSystem.make_confluent.._overlapss r7Dr7DF1dTk* )JJtaxqJG**QXq*?@ 1d1fU ;A"**Q$u*==A 1T61U ;A 1d5 9A"**TD[1_d5*IIAMM!A#a%( )Mr!c$|j|j|}j|}|j|j|}j|}||k7r|rdgS j|||}|Sy#t$rYywxYw)NrF)eliminate_wordrrGr+r1)rLr2r3r>str?rs r_process_overlapz8RewritingSystem.make_confluent.._process_overlaps$$RB8KKN$$RB8KKN6 !s %#'==Au#='(%$%s-B BBrr/r FT)rHc3@K|]}j|ywr')index).0r[lhss r z1RewritingSystem.make_confluent..s8 ! 8s) rrrrkeysr0extendrr,min)rr>rXr]rJir2rTr3overlapsrLr?r-rUlras` @rmake_confluentzRewritingSystem.make_confluents   %% %4::??$%    #c(lQB FAAc#h,VQ8$R, "b&" 56! 2A/2r5AH #( 8,X.!U* $111 24<<'44T4BDAqE8a88&)8QaZ18CJJqMQwAc#h,#c(lX"  % % '9s 7 FFc&|jdS)NT)r>)rir$s rr#z!RewritingSystem._check_confluences"""..r!Nc|jDcic]}||k7s ||j|}}d}|}|rTd}|D]J}|}||dz|dzkDr|j|||dd}n|j|||d}||k7sId}L|rT|Scc}w)zv Apply reduction rules to `word` excluding the reduction rule for the lhs equal to `exclude` TFr )_allinverse)rl)rrZ)rwordrEr-ragainrCprevs rrGzRewritingSystem.reduces ,0::FagDJJqM!FFE !8R '  bD $"6"6 6 $&OD ! $T%9%9 : $'(9$: !A45 /'81'=>OPQ>R'R!!$(1-t77>>>,,66t6L!((.  /%6OD !}$CF((//5@@I$((//5=$$T*433:::((224CQZ[_Q`2a/ b2!!34--44 YE!& !%!9!9!@!@!G!R!R "S(0jF!9!9!@!@@0077>MMfV\]0077>MMfVhi j $s*0YF.v5Ee*d6N6N6U6U)U % aU <e*d6N6N6U6U)Uu: ',,33E:II&RWX Y Y0 t'':: ;sCU?V V& Y%*""66IIYF.v5Ee*d6N6N6U6U)U % aU <e*d6N6N6U6U)Uu: ',,33E:II&RWX Y Y Wr!c|jr"|j|ji|_d}|rd}|jjd}t |j D]s\}}|j |}|jj|}|jdk(r5|j}|j|t|z dz|dz|}d}n|}u|r|S)af Reduce a word using an automaton. Summary: All the symbols of the word are stored in an array and are given as the input to the automaton. If the automaton reaches a dead state that subword is replaced and the automaton is run from the beginning. The complete word has to be replaced when the word is read and the automaton reaches a dead state. So, this process is repeated until the word is read completely and the automaton reaches the accept state. Arguments: word (instance of FreeGroupElement) -- Word that needs to be reduced. r/rr}r{) rrxrr enumerater~ transitionsrzr|substituted_wordr0) rrnflag current_staterfr[next_state_name next_statesubsts rreduce_using_automatonz&RewritingSystem.reduce_using_automatons ??  " "4?? 3 DOD 44;;GDM!$"6"67 +1"/";";A">!55<<_M ((C/&..E00S5I1IA1MqQRsTYZDD *  + r!)Fr')__name__ __module__ __qualname____doc__rr propertyr%rr4r+r,rir#rGrvrrxrrrr!rrrsb #<"" %<|rs@AAr!