a
    kh>                     @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZ ddlmZ dd	l m!Z! dd
l"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd  Z6d!d" Z7d#d$ Z8d%d& Z9d'd( Z:d)d* Z;d+d, Z<d-d. Z=d/d0 Z>d1d2 Z?d3d4 Z@d5d6 ZAd7d8 ZBd9d: ZCd;d< ZDd=d> ZEd?d@ ZFdAS )Bz1For more tests on satisfiability, see test_dimacs    )Q)symbols)
Unequality)AndOrImplies
Equivalenttruefalse)literal_symbolpl_truesatisfiablevalidentailsPropKB)dplldpll_satisfiablefind_pure_symbolfind_unit_clauseunit_propagatefind_pure_symbol_int_reprfind_unit_clause_int_reprunit_propagate_int_repr)r   )z3_satisfiable)CNF
EncodedCNF)make_random_problem)randint)raisesskip)import_modulec                  C   sR   t d\} }tddu sJ tddu s,J t| | u s<J t|  | u sNJ d S )NzA,BTF)r   r   AB r$   N/var/www/auris/lib/python3.9/site-packages/sympy/logic/tests/test_inference.pytest_literal   s
    r&   c                  C   s   t d\} }}t| g| g| dfks(J t| |g|  |B | | B gdksNJ t| ||g| | B | | B || B g| dfksJ t| ||g|  |B || B || B g|dfksJ t| ||g|  | B | | B || B g|dfksJ t| ||g|  |B | | B || B gdksJ d S )NA,B,CTNNF)r   r   r"   r#   Cr$   r$   r%   test_find_pure_symbol    s    &426"r+   c                   C   s   t dgdhgdksJ t ddgddhddhgdks:J t g dddhddhd	dhgdksbJ t g dddhddhd	dhgd
ksJ t g dddhddhd	dhgdksJ t g dddhddhd	dhgdksJ d S )N   r,   T   r(   r,   r.      r2   r.   Tr.   F)r   r$   r$   r$   r%   test_find_pure_symbol_int_repr+   s4    r6   c                  C   s  t d\} }}t| gi | dfks&J t| |  gi | dfksBJ t| |B g| di|dfksbJ t| |B g|di| dfksJ t| |B |B || B | | B g| di|dfksJ t| |B |B || B | |B g| di|dfksJ t| |B |B || B | gi | dfksJ d S Nr'   TF)r   r   r)   r$   r$   r%   test_unit_clause9   s      "2r8   c                  C   s  t ttdggi dksJ t ttdgdggi dks<J t ddhgddidksXJ t ddhgddidkstJ t ttg dddgdd	ggddid
ksJ t ttg dddgddggddidksJ td\} }}t| |B |B || B | gi | dfks
J d S )Nr,   r-   r/   r.   Tr4   r1   r3   r0   r5   r2   r'   )r   mapsetr   r   r)   r$   r$   r%   test_unit_clause_int_reprE   s(     r;   c                  C   s`   t d\} }}t| |B g| g ks&J t| |B |  |B | |B | g| || |B | gks\J d S )Nr'   )r   r   r)   r$   r$   r%   test_unit_propagateS   s    r<   c                   C   sT   t ddhgdg ksJ t ttddgddgddgdggddhddhgksPJ d S )Nr,   r.   r/   r2   r3   )r   r9   r:   r$   r$   r$   r%   test_unit_propagate_int_reprY   s    r=   c                  C   s@   t d\} }}t| |B g| |g| d|di| d|diks<J dS )z"This is also tested in test_dimacsr'   TN)r   r   r)   r$   r$   r%   	test_dpll_   s    r>   c                  C   sr  t d\} }}t| |  @ du s$J t| | @ | d|diksBJ t| |B | di|di| d|difv slJ t|  |B | | B @ | d|di| d|difv sJ t| |B | |B @ | d|di| d|di|d|difv sJ t| |@ |@ | d|d|diksJ t| |B | |? @ |diks$J tt| || @ | d|diksHJ tt| ||  @ | d|diksnJ d S Nr'   FT)r   r   r   r)   r$   r$   r%   test_dpll_satisfiablee   s(    
&"$r@   c                  C   s~  t d\} }}t| |  @ du s$J t| | @ | d|diksBJ t| |B | di|di| d|difv slJ t|  |B | | B @ | d|di| d|difv sJ t| |B | |B @ | d|d|di| d|d|difv sJ t| |@ |@ | d|d|diksJ t| |B | |? @ |d| di|d| difv s0J tt| || @ | d|diksTJ tt| ||  @ | d|dikszJ d S r?   )r   dpll2_satisfiabler   r)   r$   r$   r%   test_dpll2_satisfiableu   s,    "
$
$rB   c               
   C   s  t d\} }}dd }|| |  @ du s,J || | @ | d|diksJJ || |B | di|di| d|di| d|di| d|difv sJ ||  |B | | B @ | d|di| d|difv sJ || |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difv sJ || |@ |@ | d|d|diks:J || |B | |? @ |d| di|d| difv slJ |t| || @ | d|diksJ |t| ||  @ | d|diksJ d S )Nr'   c                 S   s   t | ddS )N	minisat22	algorithmr   )exprr$   r$   r%   <lambda>       z,test_minisat22_satisfiable.<locals>.<lambda>FT)r   r   )r"   r#   r*   minisat22_satisfiabler$   r$   r%   test_minisat22_satisfiable   s.    ,"*&
$rK   c            	   
   C   sL  t d\} }}ddd}|| |  @ du s.J || | @ | d|diksLJ || |B | di|di| d|di| d|di| d|difv sJ ||  |B | | B @ | d|di| d|difv sJ || |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difv sJ || |@ |@ | d|d|diks<J || |B | |? @ |d| di|d| difv snJ |t| || @ | d|diksJ |t| ||  @ | d|diksJ t| |B |B dddd}t|}dd	 | D }t|}d
d	 | D }t|}dd	 | D }||kr,J ||kr:J ||krHJ d S )Nr'   Tc                 S   s   t | dddS )NrC   T)rE   minimalrF   )rG   rL   r$   r$   r%   rH      rI   z4test_minisat22_minimal_satisfiable.<locals>.<lambda>FrC   )rE   rL   
all_modelsc                 S   s   h | ]\}}|r|qS r$   r$   .0keyvaluer$   r$   r%   	<setcomp>   rI   z5test_minisat22_minimal_satisfiable.<locals>.<setcomp>c                 S   s   h | ]\}}|r|qS r$   r$   rN   r$   r$   r%   rR      rI   c                 S   s   h | ]\}}|r|qS r$   r$   rN   r$   r$   r%   rR      rI   )T)r   r   r   nextitems)	r"   r#   r*   rJ   gZsolZfirst_solutionZsecond_solutionZthird_solutionr$   r$   r%   "test_minisat22_minimal_satisfiable   sB    
,"*&
$&rV   c                  C   s0   t d\} }}t| | |? @ | @ du s,J d S )Nr'   F)r   r   r)   r$   r$   r%   test_satisfiable   s    rW   c                  C   s   t d\} }}t| || ? ? du s&J t| ||? ? | |? | |? ? ? du sNJ t| |  ? | |? ? du snJ t| |B |B du sJ t| |? du sJ d S r7   )r   r   r)   r$   r$   r%   
test_valid   s    ( rX   c                  C   s  t d\} }}tddu sJ t| |@ | d|didu s<J t| |B | didu sVJ t| |B |didu spJ t| |B | d |didu sJ t| |? | didu sJ t| |B | B | d|d|didu sJ tt| || d|didu sJ tddu sJ t| |@ | d|didu s"J t| |@ | didu s>J t| |@ |didu sZJ t| |B | d|didu szJ t||d id u sJ t| |@ | d|d id u sJ t| |? | d|d id u sJ tt| || d id u sJ tt| || d|d id u sJ t| |B | diddd u s2J t|  | @ | diddd u sVJ t| |B | d|didddu szJ t| |@ |  | B @ | didddu sJ t|| ? || ? ? |didddu sJ d S )Nr'   TF)deep)r   r   r   r)   r$   r$   r%   test_pl_true   s0    (     " $$,rZ   c                      s>   ddl m  ttdd  tt fdd ttdd  d S )Nr   pic                   S   s   t dS )NzJohn Cleeser   r$   r$   r$   r%   rH      rI   z*test_pl_true_wrong_input.<locals>.<lambda>c                      s   t d   d  S )N*   r.   r]   r$   r[   r$   r%   rH      rI   c                   S   s   t dS )Nr^   r]   r$   r$   r$   r%   rH      rI   )Zsympy.core.numbersr\   r   
ValueErrorr$   r$   r[   r%   test_pl_true_wrong_input   s    r`   c                  C   s   t d\} }}t| | |? | gdu s*J t|t| || gdu sFJ t| |? |  | ? ? du sfJ t| |? | |  ? ? du sJ d S )NzA, B, CFT)r   r   r   r)   r$   r$   r%   test_entails   s
     ra   c                  C   sf  t d\} }}t }|| |? du s*J || || ? ? du sDJ || |?  |||?  || du srJ ||du sJ ||du sJ ||  du sJ || du sJ || du sJ || |? du sJ ||  || du sJ ||du sJ ||du s.J || du sDJ ||  ||du sbJ d S r?   )r   r   asktellZretract)r"   r#   r*   kbr$   r$   r%   test_PropKB   s(    

re   c                  C   s*   t  } td\}}}| |du s&J dS )z"tolerant to bad inputr'   FN)r   r   rb   )rd   r"   r#   r*   r$   r$   r%   test_propKB_tolerant  s    rf   c                  C   sr  t d\} }t| | }tt| | t| t|B }t|  t| @ }t| dt| | dit|dt| | dit| dt|dt| | dit| dt|dt| | dit| dt|dt| | dig}tt|||ddrJ tt||| dd|v s4J tt|||ddrNJ tt||| dd|v snJ d S )Nzx yTFr   rD   Zdpll2)r   r   Zzeror   r   r   )xyZassumptionsZfactsqueryZrefutationsr$   r$   r%   test_satisfiable_non_symbols  s    $$$$ rj   c                  C   s\   ddl m}  ttttiks J t| jttiks6J ttdu sFJ t| jdu sXJ d S )Nr   SF)Zsympy.core.singletonrl   r   r	   r
   rk   r$   r$   r%   test_satisfiable_bool  s
    rm   c                     s  ddl m} m} ttddddu s(J tt| |  ? | @ dddgksLJ ttdddttigksjJ | d|di| d|dig}t| |A dd |t  |t  tt	 fdd |rJ ttt
| |dd| d|di| d|digksJ | d|di| d|di| d|dig}t| |? ddD ]}|| q,|rHJ ddlm} dd	lm} | fd
dtdD }t|| dd tdD ]}t sJ qd S )Nr   r!   FT)rM   c                      s   t  S NrS   r$   )resultr$   r%   rH   /  rI   z-test_satisfiable_all_models.<locals>.<lambda>)numbered_symbolsr   c                    s   g | ]}t  qS r$   ro   rO   i)symr$   r%   
<listcomp>@  rI   z/test_satisfiable_all_models.<locals>.<listcomp>d   
   )Z	sympy.abcr"   r#   rS   r   listr	   remover   StopIterationr   Zsympy.utilities.iterablesrq   sympy.logic.boolalgr   range)r"   r#   modelsmodelrq   r   Xrt   r$   )rp   ru   r%   test_satisfiable_all_models%  s0    $"
r   c                  C   s   t d} | std td\}}}td\}}}t|dk|dk @ du sLJ t|| @ du sbJ t|| |B |B @ }t|du sJ || du sJ t|d dk|dk @ |d	k@ du sJ d S )
Nz3z3 not installed.r'   zx,y,zr.   r,   FTr/   )r    r   r   r   bool)r   r"   r#   r*   rg   rh   zr   r$   r$   r%   test_z3F  s    r   c               	      s   t d} | d u rtd dd  d fdd		}d
d }tdD ]R}|dddd}zt|}W n | jjyv   Y q>Y n0 ||du}||ks>J q>d S )Nr   r   c                 S   s   t | }t }|| |S rn   )r   Z	from_propr   Zfrom_cnf)Zbfcnfencr$   r$   r%   boolean_formula_to_encoded_cnf]  s    

z<test_z3_vs_lra_dpll2.<locals>.boolean_formula_to_encoded_cnf   rx   r.   c                    s   | |ksJ t ||dd}dd |d |  D }|| d  D ]0}t|trP| }td| d }|| | q<dd |D }t| } |S )NF)Znum_variablesnum_constraintsZrationalc                 S   s   g | ]
}|gqS r$   r$   )rO   consr$   r$   r%   rv   f  rI   zAtest_z3_vs_lra_dpll2.<locals>.make_random_cnf.<locals>.<listcomp>r   r,   c                 S   s   g | ]}t | qS r$   rr   )rO   Zclauser$   r$   r%   rv   m  rI   )r   
isinstancer   r   appendr   )num_clausesr   num_varconstraintsclausesr   rt   r   r   r$   r%   make_random_cnfc  s    
z-test_z3_vs_lra_dpll2.<locals>.make_random_cnfc                 S   s   t | ddS )NTZuse_lra_theory)rA   )rg   r$   r$   r%   rH   q  rI   z&test_z3_vs_lra_dpll2.<locals>.<lambda>2      )r   r   r   F)r   rx   r.   )r    r   r}   r   Zz3typesZZ3Exception)r   r   Zlra_dpll2_satisfiable_r   Zz3_satZlra_dpll2_satr$   r   r%   test_z3_vs_lra_dpll2X  s    
r   c                     s  t d\}  g dg dg dg dg dg dg dg d	g d
ddgg dg dg dg dg dg dg dg dddgg dg dg dg dg ddgdgg} fddtddD }d |t| d!< d|t| d!< t||}t|d"d#d$u sJ d S )%Nzx,y)r,   r3   r0   )r      i)rx      r   )i      )r   	   r   r   r   )      i)r   r   rx   r   )r   r   r   r   )r.   r3   r/   i   )r   r2   r   )ir      r   )r   r   rx   r   r   )   r/   r0   )iii)rx   r   r   r   )r   r   r   r   )   r   r   i)r   r   r   r   r   )   ii)r   r   ir   )r      ir   r   )ii   r   c                    s*   i | ]"}|d kr|dkrt  ||qS )r   r   )r   gtrs   rh   r$   r%   
<dictcomp>  rI   z$test_issue_27733.<locals>.<dictcomp>r,      r   r   Tr   F)r   r}   r   r   ltr   r   )rg   r   encodingr   r$   r   r%   test_issue_27733  s    $$
r   N)G__doc__Zsympy.assumptions.askr   Zsympy.core.symbolr   Zsympy.core.relationalr   r|   r   r   r   r   r	   r
   Zsympy.logic.inferencer   r   r   r   r   r   Zsympy.logic.algorithms.dpllr   r   r   r   r   r   r   r   Zsympy.logic.algorithms.dpll2rA   Z!sympy.logic.algorithms.z3_wrapperr   Zsympy.assumptions.cnfr   r   Z!sympy.logic.tests.test_lra_theoryr   Zsympy.core.randomr   Zsympy.testing.pytestr   r   Zsympy.externalr    r&   r+   r6   r8   r;   r<   r=   r>   r@   rB   rK   rV   rW   rX   rZ   r`   ra   re   rf   rj   rm   r   r   r   r   r$   r$   r$   r%   <module>   sL     (	!!'