U
    L?h;                     @   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?S )@z1For 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ksttddks,tt| | ks<tt|  | ksNtd S )NzA,BTF)r   r   AssertionErrorAB r%   R/var/www/html/venv/lib/python3.8/site-packages/sympy/logic/tests/test_inference.pytest_literal   s
    r'   c                  C   s   t d\} }}t| g| g| dfks(tt| |g|  |B | | B gdksNtt| ||g| | B | | B || B g| dfkstt| ||g|  |B || B || B g|dfkstt| ||g|  | B | | B || B g|dfkstt| ||g|  |B | | B || B gdkstd S )NA,B,CTNNF)r   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tt ddgddhddhgdks:tt dddgddhddhddhgdksdtt dddgddhddhddhgd	kstt dddgddhddhddhgd
kstt dddgddhddhddhgdkstd S )N   r-   T   r)      r/   Tr/   F)r   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&tt| |  gi | dfksBtt| |B g| di|dfksbtt| |B g|di| dfkstt| |B |B || B | | B g| di|dfkstt| |B |B || B | |B g| di|dfkstt| |B |B || B | gi | dfkstd S Nr(   TF)r   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tt ttdgdggi dks<tt ddhgddidksXtt ddhgddidksttt ttdddgddgdd	ggddid
kstt ttdddgddgddggddidksttd\} }}t| |B |B || B | gi | dfkstd S )Nr-   r.   r0   r/   Tr4   r2   r3   r1   r5   r(   )r   mapsetr!   r   r   r*   r%   r%   r&   test_unit_clause_int_reprE   s(     r;   c                  C   s`   t d\} }}t| |B g| g ks&tt| |B |  |B | |B | g| || |B | gks\td S )Nr(   )r   r   r!   r*   r%   r%   r&   test_unit_propagateS   s    r<   c                   C   sT   t ddhgdg kstt ttddgddgddgdggddhddhgksPtd S )Nr-   r/   r0   r2   r3   )r   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<tdS )z"This is also tested in test_dimacsr(   TN)r   r   r!   r*   r%   r%   r&   	test_dpll_   s    r>   c                  C   sr  t d\} }}t| |  @ dks$tt| | @ | d|diksBtt| |B | di|di| d|difksltt|  |B | | B @ | d|di| d|difkstt| |B | |B @ | d|di| d|di|d|difkstt| |@ |@ | d|d|dikstt| |B | |? @ |diks$ttt| || @ | d|diksHttt| ||  @ | d|diksntd S Nr(   FT)r   r   r!   r   r*   r%   r%   r&   test_dpll_satisfiablee   s*    
 

&"$r@   c                  C   s~  t d\} }}t| |  @ dks$tt| | @ | d|diksBtt| |B | di|di| d|difksltt|  |B | | B @ | d|di| d|difkstt| |B | |B @ | d|d|di| d|d|difkstt| |@ |@ | d|d|dikstt| |B | |? @ |d| di|d| difks0ttt| || @ | d|diksTttt| ||  @ | d|diksztd S r?   )r   dpll2_satisfiabler!   r   r*   r%   r%   r&   test_dpll2_satisfiableu   s,    "
$
$rB   c               
   C   s  t d\} }}dd }|| |  @ dks,t|| | @ | d|diksJt|| |B | di|di| d|di| d|di| d|difkst||  |B | | B @ | d|di| d|difkst|| |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difkst|| |@ |@ | d|d|diks:t|| |B | |? @ |d| di|d| difkslt|t| || @ | d|dikst|t| ||  @ | d|dikst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$   r+   minisat22_satisfiabler%   r%   r&   test_minisat22_satisfiable   s2    ,"  &
$rK   c            	   
   C   sL  t d\} }}ddd}|| |  @ dks.t|| | @ | d|diksLt|| |B | di|di| d|di| d|di| d|difkst||  |B | | B @ | d|di| d|difkst|| |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difkst|| |@ |@ | d|d|diks<t|| |B | |? @ |d| di|d| difksnt|t| || @ | d|dikst|t| ||  @ | d|dikstt| |B |B dddd}t|}dd	 | D }t|}d
d	 | D }t|}dd	 | D }||kr,t||kr:t||krHt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>   s      z5test_minisat22_minimal_satisfiable.<locals>.<setcomp>c                 S   s   h | ]\}}|r|qS r%   r%   rN   r%   r%   r&   rR      s      c                 S   s   h | ]\}}|r|qS r%   r%   rN   r%   r%   r&   rR      s      )T)r   r!   r   r   nextitems)	r#   r$   r+   rJ   gZsolZfirst_solutionZsecond_solutionZthird_solutionr%   r%   r&   "test_minisat22_minimal_satisfiable   sF    
,"  &
$&rV   c                  C   s0   t d\} }}t| | |? @ | @ dks,td S )Nr(   F)r   r   r!   r*   r%   r%   r&   test_satisfiable   s    rW   c                  C   s   t d\} }}t| || ? ? dks&tt| ||? ? | |? | |? ? ? dksNtt| |  ? | |? ? dksntt| |B |B dkstt| |? dkstd S r7   )r   r   r!   r*   r%   r%   r&   
test_valid   s    ( rX   c                  C   s  t d\} }}tddkstt| |@ | d|didks<tt| |B | didksVtt| |B |didksptt| |B | d |didkstt| |? | didkstt| |B | B | d|d|didksttt| || d|didksttddkstt| |@ | d|didks"tt| |@ | didks>tt| |@ |didksZtt| |B | d|didksztt||d id kstt| |@ | d|d id kstt| |? | d|d id ksttt| || d id ksttt| || d|d id kstt| |B | diddd ks2tt|  | @ | diddd ksVtt| |B | d|didddksztt| |@ |  | B @ | didddkstt|| ? || ? ? |didddkstd S )Nr(   TF)deep)r   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ks*tt|t| || gdksFtt| |? |  | ? ? dksftt| |? | |  ? ? dkstd S )NzA, B, CFT)r   r   r!   r   r*   r%   r%   r&   test_entails   s
     ra   c                  C   sf  t d\} }}t }|| |? dks*t|| || ? ? dksDt|| |?  |||?  || dksrt||dkst||dkst||  dkst|| dkst|| dkst|| |? dkst||  || dkst||dkst||dks.t|| dksDt||  ||dksbtd S r?   )r   r   askr!   tellZretract)r#   r$   r+   kbr%   r%   r&   test_PropKB   s(    

re   c                  C   s*   t  } td\}}}| |dks&tdS )z"tolerant to bad inputr(   FN)r   r   rb   r!   )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ttt||| dd|ks4ttt|||ddrNttt||| dd|ksntd S )Nzx yTFr   rD   Zdpll2)r   r   zeror   r   r   r!   )xyZassumptionsZfactsqueryZrefutationsr%   r%   r&   test_satisfiable_non_symbols  s    $$$$ rk   c                  C   s\   ddl m}  ttttiks tt| jttiks6tttdksFtt| jdksXtd S )Nr   SF)Zsympy.core.singletonrm   r   r	   r!   r
   rl   r%   r%   r&   test_satisfiable_bool  s
    rn   c                     s  ddl m} m} ttddddks(ttt| |  ? | @ dddgksLtttdddttigksjt| d|di| d|dig}t| |A dd |t  |t  t	t
 fdd |rtttt| |dd| d|di| d|digkst| d|di| d|di| d|dig}t| |? ddD ]}|| q,|rHtddlm} dd	lm} | fd
dtdD }t|| dd tdD ]}t st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%   rp   )rO   i)symr%   r&   
<listcomp>@  s     z/test_satisfiable_all_models.<locals>.<listcomp>d   
   )Z	sympy.abcr#   r$   rS   r   r!   listr	   remover   StopIterationr   Zsympy.utilities.iterablesrr   sympy.logic.boolalgr   range)r#   r$   modelsmodelrr   r   Xrt   r%   )rq   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ksLtt|| @ dksbtt|| |B |B @ }t|dkst|| dkstt|d dk|dk @ |d	k@ dkstd S )
Nz3z3 not installed.r(   zx,y,zr/   r-   FTr0   )r    r   r   r   r!   bool)r   r#   r$   r+   rh   ri   zr   r%   r%   r&   test_z3F  s    r   c               	      s   t d} | d krtd dd  d fdd		}d
d }tdD ]T}|dddd}zt|}W n | jjk
rx   Y q>Y nX ||dk	}||ks>tq>d S )Nr   r   c                 S   s   t | }t }|| |S ro   )r   Z	from_propr   Zfrom_cnf)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t 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  s     zAtest_z3_vs_lra_dpll2.<locals>.make_random_cnf.<locals>.<listcomp>r   r-   c                 S   s   g | ]}t | qS r%   rs   )rO   Zclauser%   r%   r&   rv   m  s     )r!   r   
isinstancer   r   appendr   )num_clausesr   num_varconstraintsZ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   )rh   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Z3Exceptionr!   )r   r   Zlra_dpll2_satisfiable_r   Zz3_satZlra_dpll2_satr%   r   r&   test_z3_vs_lra_dpll2X  s    
r   N)F__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   rk   rn   r   r   r   r%   r%   r%   r&   <module>   sJ     (	!!