
    6S*                        / S Qr  " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r	 " S S\5      r
S rS rS r\" \5      \l        \S:X  aB  SSKJr  \" \5      S:  a  SrO\S   r\R                  \5      r\" \R-                  5       5        gg))FormulaRelationConjunctionDisjunctionNegationImplicationEquivalencec                   Z    \ rS rSrS rS rS rS rS rS r	\
S 5       rS	 rS
 rS rSrg)r      c                 d    U R                   U R                  4UR                   UR                  4:H  $ N	__class____dict__selfothers     (/home/kabel/public_html/src/sat/logic.py__eq__Formula.__eq__   '    .5??ENN2SSS    c                 d    U R                   U R                  4UR                   UR                  4:g  $ r   r   r   s     r   __ne__Formula.__ne__   r   r   c                 r    U R                   R                  U R                   5      nU R                  Ul        U$ r   )r   __new__r   r   ress     r   copyFormula.copy   s*    nn$$T^^4}}
r   c                 "    U R                  5       $ r   r   r   s    r   flattenFormula.flatten       yy{r   c                 "    U R                  5       $ r   r"   r#   s    r   basicFormula.basic   r&   r   c                 "    U R                  5       $ r   r"   r#   s    r   demorganFormula.demorgan   r&   r   c                 \    [        U [        5      (       a  U" U 5      $ U R                  5       $ r   )
isinstancer   transform_relationsxtransformers     r   _transform_relationsFormula._transform_relations   s(    a""q>!((**r   c                     g)NF r#   s    r   	is_atomicFormula.is_atomic    s    r   c           	      f   [        U 5      nS nU H  n[        U[        5      (       d  M  Un  O   Ubx  UR                  U5        / nU HW  n[        U[        5      (       a%  UR                  [	        U[        U5      -   6 5        M=  UR                  [	        X/-   6 5        MY     [        U6 $ [	        U6 $ r   )listr.   r   remover   append)r   disjunctionconjunctionargresults        r   __distribute_orsFormula.__distribute_ors#   s    4jC#{++!  "{+F"c;//MM+d3i0G"IJMM+e0C"EF	 #
 '',,r   c                 H   U R                  5       R                  5       R                  5       nUR                  5       (       a  U$ [	        U[
        5      (       a'  UR                  5       n[	        U[
        5      (       a  U$ SnU(       a  SnUn/ nU H`  n[	        U[
        5      (       a  UR                  5       n[	        U[        5      (       a  U[        U5      -  nSnMO  UR                  U5        Mb     [        U6 R                  5       R                  5       nU(       a  M  U$ )NTF)
r(   r+   r$   r7   r.   r   _Formula__distribute_orsr   r:   r<   )r   r@   again
old_resultr?   s        r   cnfFormula.cnf6   s    &&(002Mfk**,,.F&+..EJF!c;//..0Cc;//d3i'F EMM#& " !&)224<<>F e r   r6   N)__name__
__module____qualname____firstlineno__r   r   r   r$   r(   r+   staticmethodr3   r7   rD   rG   __static_attributes__r6   r   r   r   r      sE    TT
 + +-&r   r   c                   F    \ rS rSrSS.S jrS rS rS rS rS	 r	S
 r
Srg)r   N   Finfixc                |    Xl         [        U5      U l        [        U R                  5      S:H  =(       a    UU l        g )N   )reltupleargslenrR   )r   rU   rR   rW   s       r   __init__Relation.__init__O   s+    $K	^q(2U
r   c                 ,    [        U R                  5      $ r   )rX   rW   r#   s    r   arityRelation.arityT   s    499~r   c                     U R                   $ r   )rU   r#   s    r   nameRelation.nameW   s    xxr   c                     g)NTr6   r#   s    r   r7   Relation.is_atomicZ   s    r   c                     U" U 5      $ r   r6   r   r2   s     r   r/   Relation.transform_relations]   s    4  r   c                 Z    [        U R                  U R                  U R                  45      $ r   )hashr   rU   rW   r#   s    r   __hash__Relation.__hash__`   s     T^^TXXtyy9::r   c                 L   U R                   (       d  [        U R                  5      $ U R                  (       a3  SU R                   S   < SU R                  < SU R                   S   < S3$ U R                  < SSR	                  [        [        U R                   5      5      < S3$ )N(        )z, )rW   strrU   rR   joinmapr#   s    r   __str__Relation.__str__c   sd    yytxx= ZZZ#'99Q<499Q<HH#xx3sDII3F)GHHr   )rW   rR   rU   N)rI   rJ   rK   rL   rY   r\   r_   r7   r/   rh   rs   rN   r6   r   r   r   r   N   s)    ). 3
!;Ir   r   c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)NFormulak   c                 @   [        U5      (       d  [        S5      eU H#  n[        U[        5      (       a  M  [	        S5      e   [        U5      U l        [        U R                  5      S:X  a1  [        U5      S   nUR                  U l        UR                  U l	        g g )Nz!at least one argument is required&arguments must be instances of Formularn   rl   )
rX   AttributeErrorr.   r   	TypeError	frozensetrW   r:   r   r   r   rW   r?   s      r   rY   NFormula.__init__l   s    4yy !DEECc7++ HII  dO	tyy>Qt*Q-C ]]DNLLDM r   c                 D    [        U R                  U R                  45      $ r   )rg   r   rW   r#   s    r   rh   NFormula.__hash__x   s    T^^TYY/00r   c                 ,    [        U R                  5      $ r   )iterrW   r#   s    r   __iter__NFormula.__iter__{   s    DIIr   c                     / nU  HN  nUR                  5       n[        X R                  5      (       a  U[        U5      -  nM=  UR	                  U5        MP     U R                  " U6 $ r   )r$   r.   r   r:   r<   r}   s      r   r$   NFormula.flatten~   sV    C++-C#~~..S	!C   ~~t$$r   c                 6    U R                   " [        S U 5      6 $ )Nc                 "    U R                  5       $ r   )r(   r1   s    r   <lambda> NFormula.basic.<locals>.<lambda>   s
    QWWYr   r   rr   r#   s    r   r(   NFormula.basic   s    ~~s#6=>>r   c                 6    U R                   " [        S U 5      6 $ )Nc                 "    U R                  5       $ r   )r+   r   s    r   r   #NFormula.demorgan.<locals>.<lambda>   s
    QZZ\r   r   r#   s    r   r+   NFormula.demorgan   s    ~~s#94@AAr   c                 >   ^ U R                   " [        U4S jU 5      6 $ )Nc                 &   > U R                  T5      $ r   )r/   r0   s    r   r   .NFormula.transform_relations.<locals>.<lambda>   s    Q-B-B;-Or   r   rd   s    `r   r/   NFormula.transform_relations   s    ~~s#OQUVWWr   )r   r   rW   N)rI   rJ   rK   rL   rY   rh   r   r$   r(   r+   r/   rN   r6   r   r   rv   rv   k   s'    
)1%?BXr   rv   c                       \ rS rSrS rSrg)r      c                 L    SSR                  [        [        U 5      5      -   S-   $ )Nrk   u    ∧ ro   rq   rr   rp   r#   s    r   rs   Conjunction.__str__   !    gll3sD>23c99r   r6   NrI   rJ   rK   rL   rs   rN   r6   r   r   r   r          :r   r   c                       \ rS rSrS rSrg)r      c                 L    SSR                  [        [        U 5      5      -   S-   $ )Nrk   u    ∨ ro   r   r#   s    r   rs   Disjunction.__str__   r   r   r6   Nr   r6   r   r   r   r      r   r   r   c                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)r      c                 P    [        U[        5      (       d  [        S5      eXl        g )Nz$argument must be instance of Formula)r.   r   r{   a)r   r   s     r   rY   Negation.__init__   s     !W%%BCCr   c                 D    [        U R                  U R                  45      $ r   )rg   r   r   r#   s    r   rh   Negation.__hash__   s    T^^TVV,--r   c                 2    S[        U R                  5      -   $ )N   ¬)rp   r   r#   s    r   rs   Negation.__str__   s    c$&&k!!r   c                 6    U R                   R                  5       $ r   )r   r7   r#   s    r   r7   Negation.is_atomic   s    vv!!r   c                     [        U R                  [        5      (       a$  U R                  R                  R                  5       $ [        U R                  5      $ r   )r.   r   r   r$   r#   s    r   r$   Negation.flatten   s9    dffh''6688##%%DFF##r   c                 H    [        U R                  R                  5       5      $ r   )r   r   r(   r#   s    r   r(   Negation.basic   s    ''r   c                     U R                   R                  5       n[        U[        5      (       a  [	        [        S U5      6 nU$ [        U[        5      (       a  [        [        S U5      6 nU$ [        U5      nU$ )Nc                 4    [        U 5      R                  5       $ r   r   r+   r   s    r   r   #Negation.demorgan.<locals>.<lambda>       Xa[-A-A-Cr   c                 4    [        U 5      R                  5       $ r   r   r   s    r   r   r      r   r   )r   r+   r.   r   r   rr   r   r   s     r   r+   Negation.demorgan   sp    ffooc;''s#CSIJC
 
	 [))s#CSIJC 
 3-C
r   c                 J    [        U R                  R                  U5      5      $ r   )r   r   r/   rd   s     r   r/   Negation.transform_relations   s    22;?@@r   )r   N)rI   rJ   rK   rL   rY   rh   rs   r7   r$   r(   r+   r/   rN   r6   r   r   r   r      s+    
.""$(Ar   r   c                   2    \ rS rSrS rS rS rS rS rSr	g)	
BinFormula   c                     [        U[        5      (       a  [        U[        5      (       d  [        S5      $ Xl        X l        g )Nry   )r.   r   r{   r   b)r   r   r   s      r   rY   BinFormula.__init__   s1    !W%%Z7-C-CEFFr   c                 Z    [        U R                  U R                  U R                  45      $ r   )rg   r   r   r   r#   s    r   rh   BinFormula.__hash__   s     T^^TVVTVV455r   c                     U R                  U R                  R                  5       U R                  R                  5       5      $ r   )r   r   r$   r   r#   s    r   r$   BinFormula.flatten   s)    ~~dffnn.0@AAr   c                     U R                  U R                  R                  5       U R                  R                  5       5      $ r   )r   r   r+   r   r#   s    r   r+   BinFormula.demorgan   s)    ~~dffoo/1BCCr   c                     U R                  U R                  R                  U5      U R                  R                  U5      5      $ r   )r   r   r/   r   rd   s     r   r/   BinFormula.transform_relations   s7    ~~FF&&{3FF&&{3
 	
r   )r   r   N)
rI   rJ   rK   rL   rY   rh   r$   r+   r/   rN   r6   r   r   r   r      s    6BD
r   r   c                        \ rS rSrS rS rSrg)r      c                 j    S[        U R                  5      -   S-   [        U R                  5      -   S-   $ )Nrk   u    → ro   rp   r   r   r#   s    r   rs   Implication.__str__   ,    S[ 7*S[83>>r   c                     [        [        U R                  R                  5       5      U R                  R                  5       5      $ r   )r   r   r   r(   r   r#   s    r   r(   Implication.basic   s(    8DFFLLN3TVV\\^DDr   r6   NrI   rJ   rK   rL   rs   r(   rN   r6   r   r   r   r      s    ?Er   r   c                        \ rS rSrS rS rSrg)r      c                 j    S[        U R                  5      -   S-   [        U R                  5      -   S-   $ )Nrk   u    ↔ ro   r   r#   s    r   rs   Equivalence.__str__   r   r   c           	      &   [        [        [        U R                  R	                  5       5      U R
                  R	                  5       5      [        [        U R
                  R	                  5       5      U R                  R	                  5       5      5      $ r   )r   r   r   r   r(   r   r#   s    r   r(   Equivalence.basic   sU    0$&&,,.A0$&&,,.A
 	
r   r6   Nr   r6   r   r   r   r      s    ?
r   r   c                     U S   R                  5       (       d
  U S   S:w  a  gU SS   H"  nUR                  5       (       a  M  US:w  d  M"    g   g)Nrl   _Frn   T)isalphaisalnum)r   cs     r   	isvarnamer      sG    Q4<<>>adckqrUyy{{qCx  r   c                    0 SS_SS_SS_SS_SS_SS_SS_S	S_SS_S
S
_SS_SS_SS_SS_SS_SS_SS_S
SSSSS.EnU S:X  a  gU R                  5       n U SS U;   a  XSS    U SS  4$ U SS U;   a  XSS    U SS  4$ U S   U;   a  XS      U SS  4$ U S   R                  5       (       d	  U S   S:X  aE  U S   nU SS   H  nUR                  5       (       d    OX#-  nM      [        U5      U [        U5      S  4$ U S   R	                  5       (       d	  U S   S:X  aA  U S   nU SS   H$  nUR                  5       (       d  US:w  a    OX#-  nM&     X [        U5      S  4$ [        SU -   5      e)Nrk   ro   |   ∨&   ∧!r   ~   →   ↔=   ≠<>   ≤   ≥)z->z!=z>=z<=z<-> )NNrl      rT   rn   -r   zunknown token at )lstripisdigitintrX   r   r   SyntaxError)inputopsvr   s       r   
next_tokenr      sK   SS 	U 	u	
 	U 	u 	T 	T 	d 	u 	u 	S 	u 	S 	S  	u!" 	u#$ -C2 {LLNEQqzS1:ab	))	qs	1:ab	))	qS8}eABi''	q				uQx3!HqrA99;;FA  1vuSVW~%%	q				uQx3!HqrA99;;18FA  A.  -566r   c                   ^^^^ SSSSSSSSSSS.
n[         [        [        [        [        [        [        [        [        [        S.
m/ m/ mUU4S jmUUUU4S jnU R                  5       n  [        U 5      u  p0Uc  GO6[        U[        5      (       a  TR                  U5        GO[        U5      (       aZ  [	        U5      nT(       a6  TS   S:X  a-  TR                  5         [        U5      nT(       a  TS   S:X  a  M-  TR                  U5        OUS	:X  a  TR                  S	5        OUS
:X  aG  T" 5         TS   S	:w  a  U" 5         TS   S	:w  a  M  TS   S	:w  a  [        S5      eTR                  5         O<T(       a$  US;  a  TS   S;  a  X   UTS      ::  a  U" 5         TR                  U5        GMH  T" 5         T(       a  U" 5         T(       a  M  [        T5      S:  a  [        S5      eTS   $ )Nrn   rT   r   )
r   r   r   r   r   r   r   r   r   r   c                     > T(       a?  TS   S:X  a5  TR                  5         [        T S   5      T S'   T(       a  TS   S:X  a  M3  g g g g )Nr   )popr   )outputstacks   r   negateparse.<locals>.negate?  sC    b	T)IIK!&*-F2J b	T)e)er   c                    >  TR                  5       n TR                  5       nTR                  5       nTU   nU[        :X  aS  [        U[        5      (       a  UR                  5       n[        U [        5      (       a  U R                  5       n U" X!U SS9nOU" X5      nTR	                  U5        T" 5         g !   [        S5      e= f)NTrQ   invalid input)r   r   r.   r_   r<   r   )	r   r   opclsobjformular   r   r   s	        r   applyparse.<locals>.applyD  s    	/

A

AB"+Cha**Aa**A"$/!iMM#H	/o..s   B2B6 6Cr   r   rk   ro   zparentheses mismatchu   (¬r  rl   )r   r   r   r   r   stripr   r.   r   r<   r   r   r   r   rX   )	r   precr  tokenr   r  r   r   r   s	        @@@@r   parser  #  s   D G EF.
/ /& KKME
!%(=eS!!MM% u5/CE"I-		sm E"I- MM#c\LLc\H)s" )s"RyC!"899IIKe+b	0F4;Z^_deg_hZiKiLL3 6 H
 % 6{Q/**!9r   __main__rl   )argvrT   z(a->b->c)<->~(d&f|a)rn   N)__all__objectr   r   rv   r   r   r   r   r   r   r   r   r  rM   rI   sysr  rX   r  fprintr$   r6   r   r   <module>r     s   )Hf HTIw I:$Xw $XL:( ::( :#Aw #AJ
 
,E* E
* 
37lVp U#z
4y1}(q'gA	!))+ r   