U
    ZÊ¹jÖ;  ã                   @   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%   ú_/var/www/html/bwave/python/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s‚t‚t| ||g|  |B || B || B gƒ|dfks´t‚t| ||g|  | B | | B || B gƒ|dfksêt‚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sŽt‚t dddgddh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sât‚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s‚t‚t| |B |B || B | | B g| diƒ|dfks¶t‚t| |B |B || B | |B g| diƒ|dfksèt‚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s¤t‚t ttdddgddgddggƒddiƒdksÔt‚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s t‚t| |B | |B @ ƒ| d|di| d|di|d|difksÜt‚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s t‚t| |B | |B @ ƒ| d|d|di| d|d|difksÚt‚t| |@ |@ ƒ| d|d|diksþt‚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sˆt‚||  |B | | B @ ƒ| d|di| d|difks¼t‚|| |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�s�t‚|t| |ƒ|  @ ƒ| d|dik�s¶t‚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sŠt‚||  |B | | B @ ƒ| d|di| d|difks¾t‚|| |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�s’t‚|t| |ƒ|  @ ƒ| d|dik�s¸t‚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s†t‚t| |? ƒdksšt‚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sŽt‚t| |? | diƒdks¨t‚t| |B | B | d|d|diƒdksÐt‚tt| |ƒ| d|diƒdksðt‚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�s’t‚t| |@ | d|d iƒd k�s²t‚t| |? | d|d iƒd k�sÒt‚tt| |ƒ| d iƒd k�sðt‚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�s¦t‚t|| ? || ? ? |didd�dk�sÎt‚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s†t‚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s„t‚| |¡dks–t‚| |  ¡dksªt‚| | ¡dks¾t‚| | ¡dksÒt‚| | |? ¡dksèt‚| | ¡ | | ¡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„ƒ |rÈt‚ttt| |ƒdd�ƒ| d|di| d|digksút‚| 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ˆ ƒ�s”t‚�q”d 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sˆt‚|| dks˜t‚t|d dk|dk @ |d	k@ ƒdksÀt‚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     (	!!