B
    [ฎ  ใ               @   st   d dl mZ d dlmZ d dlmZmZ G dd deZG dd deZ	G dd	 d	e	Z
G d
d deZdd ZdS )้    )ฺ_fuzzy_group)ฺ	conjuncts)ฺQฺaskc               @   s   e Zd ZdZdS )ฺ
AskHandlerz-Base class that all Ask Handlers must inheritN)ฺ__name__ฺ
__module__ฺ__qualname__ฺ__doc__ฉ r   r   ๚@lib/python3.7/site-packages/sympy/assumptions/handlers/common.pyr      s   r   c               @   s8   e Zd ZdZedd Zedd Zedd ZeZdS )	ฺCommonHandlerz4Defines some useful methods common to most Handlers c             C   s   dS )NTr   )ฺexprฺassumptionsr   r   r   ฺ
AlwaysTrue   s    zCommonHandler.AlwaysTruec             C   s   dS )NFr   )r   r   r   r   r   ฺAlwaysFalse   s    zCommonHandler.AlwaysFalsec             C   s   d S )Nr   )r   r   r   r   r   ฺ
AlwaysNone   s    zCommonHandler.AlwaysNoneN)	r   r   r	   r
   ฺstaticmethodr   r   r   ฺNaNr   r   r   r   r      s
   r   c               @   s<   e Zd ZdZedd Zedd Zeejgd \Z	Z
dS )ฺAskCommutativeHandlerz'
    Handler for key 'commutative'
    c             C   sR   t |}| jdk	r(| jo&t | ก |kS t | ก|kr:dS t | ก |krNdS dS )z>Objects are expected to be commutative unless otherwise statedNTF)r   Zis_commutativer   ฺcommutative)r   r   Zassumpsr   r   r   ฺSymbol"   s    
zAskCommutativeHandler.Symbolc             C   s(   x"| j D ]}tt |ก|sdS qW dS )NFT)ฺargsr   r   r   )r   r   ฺargr   r   r   ฺBasic.   s    zAskCommutativeHandler.Basic้   N)r   r   r	   r
   r   r   r   r   r   ฺNumberr   r   r   r   r   r      s   r   c               @   sx   e Zd ZdZedd ZeejZeej	Z
edd Zedd Zedd	 Zed
d Zedd Zedd ZdS )ฺTautologicalHandlerzBWrapper allowing to query the truth value of a boolean expression.c             C   s   | S )Nr   )r   r   r   r   r   ฺbool;   s    zTautologicalHandler.boolc             C   s
   t | |S )N)r   )r   r   r   r   r   ฺAppliedPredicateB   s    z$TautologicalHandler.AppliedPredicatec             C   s(   t | jd |d}|dkr | S d S d S )Nr   )r   )TF)r   r   )r   r   ฺvaluer   r   r   ฺNotF   s    zTautologicalHandler.Notc             C   s<   d}x2| j D ](}t||d}|dkr(dS |d krd }qW |S )NF)r   T)r   r   )r   r   ฺresultr   ฺpr   r   r   ฺOrN   s    zTautologicalHandler.Orc             C   s<   d}x2| j D ](}t||d}|dkr(dS |d krd }qW |S )NT)r   F)r   r   )r   r   r"   r   r#   r   r   r   ฺAndY   s    zTautologicalHandler.Andc             C   s   | j \}}t| |B |dS )N)r   )r   r   )r   r   r#   ฺqr   r   r   ฺImpliesd   s    
zTautologicalHandler.Impliesc             C   sB   | j \}}t||d}|d kr"d S t||d}|d kr:d S ||kS )N)r   )r   r   )r   r   r#   r&   ZptZqtr   r   r   ฺ
Equivalenti   s    
zTautologicalHandler.EquivalentN)r   r   r	   r
   r   r   r   r   ZBooleanTruer   ZBooleanFalser   r!   r$   r%   r'   r(   r   r   r   r   r   8   s   

r   c                s   t  fdd| jD ddS )zR
    Test for membership in a group with respect
    to the current operation
    c             3   s   | ]}t | V  qd S )N)r   )ฺ.0ฺa)r   ฺkeyr   r   ๚	<genexpr>|   s    z$test_closed_group.<locals>.<genexpr>T)Z
quick_exit)r   r   )r   r   r+   r   )r   r+   r   ฺtest_closed_groupv   s    r-   N)Zsympy.core.logicr   Zsympy.logic.boolalgr   Zsympy.assumptionsr   r   ฺobjectr   r   r   r   r-   r   r   r   r   ฺ<module>   s   >