o
    o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u sJ tddu sJ t| | u sJ t|  | u s'J d S )NzA,BTF)r   r   AB r$   t/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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s'J t| ||g| | B | | B || B g| dfksAJ t| ||g|  |B || B || B g|dfksZJ t| ||g|  | B | | B || B g|dfksuJ t| ||g|  |B | | B || B gdksJ 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s1J t g dddhddhd	dhgd
ksEJ t g dddhddhd	dhgdksYJ t g dddhddhd	dhgdksmJ 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s!J t| |B g| di|dfks1J t| |B g|di| dfksAJ t| |B |B || B | | B g| di|dfks[J t| |B |B || B | |B g| di|dfkstJ t| |B |B || B | gi | dfksJ 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s,J t ddhgddidks:J t ttg dddgdd	ggddid
ksQJ t ttg dddgddggddidkshJ td\} }}t| |B |B || B | gi | dfksJ 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s(J 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   2r>   c                  C   sj  t d\} }}t| |  @ du sJ t| | @ | d|diks!J t| |B | di|di| d|difv s6J t|  |B | | B @ | d|di| d|difv sPJ t| |B | |B @ | d|di| d|di|d|difv snJ t| |@ |@ | d|d|diksJ t| |B | |? @ |diksJ tt| || @ | d|diksJ tt| ||  @ | d|diksJ d S Nr'   FT)r   r   r   r)   r$   r$   r%   test_dpll_satisfiablee   s(   
$ "(r@   c                  C   sx  t d\} }}t| |  @ du sJ t| | @ | d|diks!J t| |B | di|di| d|difv s6J t|  |B | | B @ | d|di| d|difv sPJ t| |B | |B @ | d|d|di| d|d|difv smJ t| |@ |@ | d|d|diksJ t| |B | |? @ |d| di|d| difv sJ tt| || @ | d|diksJ tt| ||  @ | d|diksJ 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s%J || |B | di|di| d|di| d|di| d|difv sDJ ||  |B | | B @ | d|di| d|difv s^J || |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difv sJ || |@ |@ | d|d|diksJ || |B | |? @ |d| di|d| difv sJ |t| || @ | d|diksJ |t| ||  @ | d|diksJ d S )Nr'   c                 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.   ,"*
$

"(rL   c            	   
   C   sB  t d\} }}ddd}|| |  @ du sJ || | @ | d|diks&J || |B | di|di| d|di| d|di| d|difv sEJ ||  |B | | B @ | d|di| d|difv s_J || |B | |B @ | d|d|di| d|d|di| d|d|di| d|d|difv sJ || |@ |@ | d|d|diksJ || |B | |? @ |d| di|d| difv sJ |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rJ d S )Nr'   Tc                 S   s   t | dddS )NrD   T)rF   minimalrG   )rH   rM   r$   r$   r%   rI      s    z4test_minisat22_minimal_satisfiable.<locals>.<lambda>FrD   )rF   rM   
all_modelsc                 S      h | ]\}}|r|qS r$   r$   .0keyvaluer$   r$   r%   	<setcomp>       z5test_minisat22_minimal_satisfiable.<locals>.<setcomp>c                 S   rO   r$   r$   rP   r$   r$   r%   rT      rU   c                 S   rO   r$   r$   rP   r$   r$   r%   rT      rU   )T)r   r   r   nextitems)	r"   r#   r*   rK   gsolfirst_solutionsecond_solutionthird_solutionr$   r$   r%   "test_minisat22_minimal_satisfiable   sB   
,"*
$

"$r]   c                  C   s0   t d\} }}t| | |? @ | @ du sJ d S )Nr'   F)r   r   r)   r$   r$   r%   test_satisfiable   s   "r^   c                  C   s   t d\} }}t| || ? ? du sJ t| ||? ? | |? | |? ? ? du s'J t| |  ? | |? ? du s7J t| |B |B du sCJ t| |? du sMJ d S r7   )r   r   r)   r$   r$   r%   
test_valid   s   ( r_   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 s+J t| |B |didu s8J t| |B | d |didu sGJ t| |? | didu sTJ t| |B | B | d|d|didu shJ tt| || d|didu sxJ tddu sJ t| |@ | d|didu sJ t| |@ | didu sJ t| |@ |didu sJ t| |B | d|didu sJ 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 sJ t| |B | diddd u sJ t|  | @ | diddd u s!J t| |B | d|didddu s3J t| |@ |  | B @ | didddu sIJ t|| ? || ? ? |didddu s]J d S )Nr'   TF)deep)r   r   r   r)   r$   r$   r%   test_pl_true   s0   (   $$,,ra   c                      s>   ddl m  ttdd  tt fdd ttdd  d S )Nr   pic                   S      t dS )NzJohn Cleeser   r$   r$   r$   r%   rI          z*test_pl_true_wrong_input.<locals>.<lambda>c                      s   t d   d  S )N*   r.   re   r$   rb   r$   r%   rI          c                   S   rd   )Nrg   re   r$   r$   r$   r%   rI      rf   )sympy.core.numbersrc   r   
ValueErrorr$   r$   rb   r%   test_pl_true_wrong_input   s   rk   c                  C   s   t d\} }}t| | |? | gdu sJ t|t| || gdu s#J t| |? |  | ? ? du s3J t| |? | |  ? ? du sCJ d S )NzA, B, CFT)r   r   r   r)   r$   r$   r%   test_entails   s
    $rl   c                  C   s\  t d\} }}t }|| |? du sJ || || ? ? du s"J || |?  |||?  || du s9J ||du sBJ ||du sKJ ||  du sUJ || du s_J || du siJ || |? du stJ ||  || du sJ ||du sJ ||du sJ || du sJ ||  ||du sJ d S r?   )r   r   asktellretract)r"   r#   r*   kbr$   r$   r%   test_PropKB   s(   

rq   c                  C   s*   t  } td\}}}| |du sJ dS )z"tolerant to bad inputr'   FN)r   r   rm   )rp   r"   r#   r*   r$   r$   r%   test_propKB_tolerant  s   rr   c                  C   sj  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rJ tt||| dd|v sJ tt|||ddrJ tt||| dd|v sJ d S )Nzx yTFr   rE   dpll2)r   r   zeror   r   r   )xyassumptionsfactsqueryrefutationsr$   r$   r%   test_satisfiable_non_symbols  s   $$$$"r{   c                  C   s\   ddl m}  ttttiksJ t| jttiksJ ttdu s#J t| jdu s,J d S )Nr   SF)sympy.core.singletonr}   r   r	   r
   r|   r$   r$   r%   test_satisfiable_bool  s
   r   c                     s  ddl m} m} ttddddu sJ tt| |  ? | @ dddgks&J ttdddttigks5J | d|di| d|dig}t| |A dd |t  |t  tt	 fdd |rdJ ttt
| |dd| d|di| d|digks}J | d|di| d|di| d|dig}t| |? ddD ]}|| q|rJ 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)rN   c                      s   t  S NrV   r$   )resultr$   r%   rI   /  rf   z-test_satisfiable_all_models.<locals>.<lambda>)numbered_symbolsr   c                    s   g | ]}t  qS r$   r   )rQ   i)symr$   r%   
<listcomp>@  rh   z/test_satisfiable_all_models.<locals>.<listcomp>d   
   )	sympy.abcr"   r#   rV   r   listr	   remover   StopIterationr   sympy.utilities.iterablesr   sympy.logic.boolalgr   range)r"   r#   modelsmodelr   r   Xr   r$   )r   r   r%   test_satisfiable_all_models%  s2   $"r   c                  C   s   t d} | s
td td\}}}td\}}}t|dk|dk @ du s&J t|| @ du s1J t|| |B |B @ }t|du sDJ || du sLJ t|d dk|dk @ |d	k@ du s`J d S )
Nz3z3 not installed.r'   zx,y,zr.   r,   FTr/   )r    r   r   r   bool)r   r"   r#   r*   ru   rv   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 ]'}|dddd}zt|}W n | jjy9   Y qw ||du}||ksFJ qd S )Nr   r   c                 S   s   t | }t }|| |S r   )r   	from_propr   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   r   r.   c                    s   | |ksJ t ||dd}dd |d |  D }|| d  D ]}t|tr(| }td| d }|| | qdd |D }t| } |S )NF)num_variablesnum_constraintsrationalc                 S   s   g | ]}|gqS r$   r$   )rQ   consr$   r$   r%   r   f  s    zAtest_z3_vs_lra_dpll2.<locals>.make_random_cnf.<locals>.<listcomp>r   r,   c                 S   s   g | ]}t | qS r$   r   )rQ   clauser$   r$   r%   r   m  rh   )r   
isinstancer   r   appendr   )num_clausesr   num_varconstraintsclausesr   r   r   r   r$   r%   make_random_cnfc  s   
z-test_z3_vs_lra_dpll2.<locals>.make_random_cnfc                 S   rC   )NT)use_lra_theory)rA   )ru   r$   r$   r%   rI   q  rJ   z&test_z3_vs_lra_dpll2.<locals>.<lambda>2      )r   r   r   F)r   r   r.   )r    r   r   r   z3typesZ3Exception)r   r   lra_dpll2_satisfiable_r   z3_satlra_dpll2_satr$   r   r%   test_z3_vs_lra_dpll2X  s    r   N)F__doc__sympy.assumptions.askr   sympy.core.symbolr   sympy.core.relationalr   r   r   r   r   r   r	   r
   sympy.logic.inferencer   r   r   r   r   r   sympy.logic.algorithms.dpllr   r   r   r   r   r   r   r   sympy.logic.algorithms.dpll2rA   !sympy.logic.algorithms.z3_wrapperr   sympy.assumptions.cnfr   r   !sympy.logic.tests.test_lra_theoryr   sympy.core.randomr   sympy.testing.pytestr   r   sympy.externalr    r&   r+   r6   r8   r;   r<   r=   r>   r@   rB   rL   r]   r^   r_   ra   rk   rl   rq   rr   r{   r   r   r   r   r$   r$   r$   r%   <module>   sL      (	!!