o
    8Vaq3                     @   sD  d Z ddlmZmZ ddl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	 Zd
d Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)d d! Z*d"d# Z+d$d% Z,d&d' Z-d(d) Z.d*d+ Z/d,d- Z0d.d/ Z1d0d1 Z2d2d3 Z3d4S )5z1For more tests on satisfiability, see test_dimacs    )symbolsQ)And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   )raisesc                  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   B/usr/lib/python3/dist-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%      r)   r%   Tr%   F)r   r   r   r   r   test_find_pure_symbol_int_repr"   s4   r-   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_clause0   s     "2.r/   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%   Tr+   r(   r*   r'   r,   r)   r   )r   mapsetr   r   r    r   r   r   test_unit_clause_int_repr<   s(    .r2   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_propagateJ   s   :r3   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&   r)   r*   )r   r0   r1   r   r   r   r   test_unit_propagate_int_reprP   s   r4   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_dpllV   s   2r5   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_satisfiable\   s(   
$ "(r7   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 r6   )r   dpll2_satisfiabler   r    r   r   r   test_dpll2_satisfiablel   s,   "
$

"(r9   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   s   t | ddS )N	minisat22	algorithmr   )exprr   r   r   <lambda>   s    z,test_minisat22_satisfiable.<locals>.<lambda>FT)r   r   )r   r   r!   minisat22_satisfiabler   r   r   test_minisat22_satisfiable}   s.   ,"*
$

"(rA   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 )Nr:   T)r<   minimalr=   )r>   rB   r   r   r   r?      s    z4test_minisat22_minimal_satisfiable.<locals>.<lambda>Fr:   )r<   rB   
all_modelsc                 S      h | ]\}}|r|qS r   r   .0keyvaluer   r   r   	<setcomp>       z5test_minisat22_minimal_satisfiable.<locals>.<setcomp>c                 S   rD   r   r   rE   r   r   r   rI      rJ   c                 S   rD   r   r   rE   r   r   r   rI      rJ   )T)r   r   r   nextitems)	r   r   r!   r@   gZsolZfirst_solutionZsecond_solutionZthird_solutionr   r   r   "test_minisat22_minimal_satisfiable   sB   
,"*
$

"$rN   c                  C   s0   t d\} }}t| | |? @ | @ du sJ d S )Nr   F)r   r   r    r   r   r   test_satisfiable   s   "rO   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 r.   )r   r   r    r   r   r   
test_valid   s   ( rP   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)Zdeep)r   r
   r   r    r   r   r   test_pl_true   s0   (   $$,,rQ   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   r?          z*test_pl_true_wrong_input.<locals>.<lambda>c                      s   t d   d  S )N*   r%   rU   r   rR   r   r   r?          c                   S   rT   )NrW   rU   r   r   r   r   r?      rV   )sympyrS   r   
ValueErrorr   r   rR   r   test_pl_true_wrong_input   s   r[   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
    $r\   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 r6   )r   r   asktellZretract)r   r   r!   kbr   r   r   test_PropKB   s(   

r`   c                  C   s*   t  } td\}}}| |du sJ dS )z"tolerant to bad inputr   FN)r   r   r]   )r_   r   r   r!   r   r   r   test_propKB_tolerant   s   ra   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   r;   Zdpll2)r   r   Zzeror   r   r   )xyZassumptionsZfactsZqueryZrefutationsr   r   r   test_satisfiable_non_symbols  s   $$$$"rd   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)Zsympy.core.singletonrf   r   r   r   re   r   r   r   test_satisfiable_bool  s
   rg   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)rC   c                      s   t  S )NrK   r   )resultr   r   r?   &  rV   z-test_satisfiable_all_models.<locals>.<lambda>)numbered_symbols)Orc                    s   g | ]}t  qS r   rh   )rF   i)symr   r   
<listcomp>7  rX   z/test_satisfiable_all_models.<locals>.<listcomp>d   
   )Z	sympy.abcr   r   rK   r   listr   remover   StopIterationr   rY   rj   sympy.logic.boolalgrk   range)r   r   ZmodelsZmodelrj   rk   Xrl   r   )ri   rm   r   test_satisfiable_all_models  s2   $"rw   N)4__doc__rY   r   r   rt   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.dpll2r8   Zsympy.testing.pytestr   r   r"   r-   r/   r2   r3   r4   r5   r7   r9   rA   rN   rO   rP   rQ   r[   r\   r`   ra   rd   rg   rw   r   r   r   r   <module>   s:     (	!