+
    i#                         R t ^ RIHtHtHtHtHt ^ RIHt ^ RI	H
t
 ^ RIHt R tRR ltR tRR	 ltRR
 lt ! R R4      t ! R R]4      tR# )z Inference in propositional logic)AndNot	conjunctsto_cnfBooleanFunction)ordered)sympify)import_modulec                    V RJ g   V RJ d   V # V P                   '       d   V # V P                  '       d   \        V P                  ^ ,          4      # \	        R4      h)z
The symbol in this literal (without the negation).

Examples
========

>>> from sympy.abc import A
>>> from sympy.logic.inference import literal_symbol
>>> literal_symbol(A)
A
>>> literal_symbol(~A)
A

TFz#Argument must be a boolean literal.)	is_Symbolis_Notliteral_symbolargs
ValueError)literals   &u/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/sympy/logic/inference.pyr   r   	   sP      $'U*					gll1o..>??    Nc                   V'       d   Ve   VR8w  d   \        RV R24      hRpVe   VR8X  d'   \        R4      pVe   RpMVR8X  d   \        R4      hRpVR8X  d   \        R4      pVf   RpVR8X  d   \        R4      pVf   RpVR	8X  d   ^ R
IHp V! V 4      # VR8X  d   ^ R
IHp V! WVR7      # VR8X  d   ^ RIHp	 V	! W4      # VR8X  d   ^ RIH	p
 V
! WV4      # VR8X  d   ^ RI
Hp V! W4      # \        h)aJ  
Check satisfiability of a propositional sentence.
Returns a model when it succeeds.
Returns {true: true} for trivially true expressions.

On setting all_models to True, if given expr is satisfiable then
returns a generator of models. However, if expr is unsatisfiable
then returns a generator containing the single element False.

Examples
========

>>> from sympy.abc import A, B
>>> from sympy.logic.inference import satisfiable
>>> satisfiable(A & ~B)
{A: True, B: False}
>>> satisfiable(A & ~A)
False
>>> satisfiable(True)
{True: True}
>>> next(satisfiable(A & ~A, all_models=True))
False
>>> models = satisfiable((A >> B) & B, all_models=True)
>>> next(models)
{A: False, B: True}
>>> next(models)
{A: True, B: True}
>>> def use_models(models):
...     for model in models:
...         if model:
...             # Do something with the model.
...             print(model)
...         else:
...             # Given expr is unsatisfiable.
...             print("UNSAT")
>>> use_models(satisfiable(A >> ~A, all_models=True))
{A: False}
>>> use_models(satisfiable(A ^ A, all_models=True))
UNSAT

dpll2z2Currently only dpll2 can handle using lra theory. z is not handled.pycosatzpycosat module is not present	minisat22pysatz3dpll)dpll_satisfiable)use_lra_theory)pycosat_satisfiable)minisat22_satisfiable)z3_satisfiable)r   r	   ImportErrorsympy.logic.algorithms.dpllr   sympy.logic.algorithms.dpll2&sympy.logic.algorithms.pycosat_wrapperr   (sympy.logic.algorithms.minisat22_wrapperr   !sympy.logic.algorithms.z3_wrapperr   NotImplementedError)expr	algorithm
all_modelsminimalr   r   r   r   r   r   r   r   s   &&&&&       r   satisfiabler*   #   s   T  Y'%9QR[Q\\lmnn	I2	*!II%!"ABB  I+g&=I$4 :IF@%%	g	APP	i	N"444	k	!R$Tw??	d	Dd//
r   c                4    \        \        V 4      4      '       * # )a@  
Check validity of a propositional sentence.
A valid propositional sentence is True under every assignment.

Examples
========

>>> from sympy.abc import A, B
>>> from sympy.logic.inference import valid
>>> valid(A | ~A)
True
>>> valid(A | B)
False

References
==========

.. [1] https://en.wikipedia.org/wiki/Validity

)r*   r   )r&   s   &r   validr,   z   s    * 3t9%%%r   c                  aaa ^ RI Ho RoVVV3R loV S9   d   V # \        V 4      p S! V 4      '       g   \        RV ,          4      hV'       g   / pVP	                  4        UUu/ uF  w  r4VS9   g   K  W4bK  	  pppV P                  V4      pVS9   d   \        V4      # V'       d_   \        P                  VP                  4       R4      p\        WQ4      '       d   \        V4      '       d   R#  R# \        V4      '       g   R# R# u uppi )a  
Returns whether the given assignment is a model or not.

If the assignment does not specify the value for every proposition,
this may return None to indicate 'not obvious'.

Parameters
==========

model : dict, optional, default: {}
    Mapping of symbols to boolean values to indicate assignment.
deep: boolean, optional, default: False
    Gives the value of the expression under partial assignments
    correctly. May still return None to indicate 'not obvious'.


Examples
========

>>> from sympy.abc import A, B
>>> from sympy.logic.inference import pl_true
>>> pl_true( A & B, {A: True, B: True})
True
>>> pl_true(A & B, {A: False})
False
>>> pl_true(A & B, {A: True})
>>> pl_true(A & B, {A: True}, deep=True)
>>> pl_true(A >> (B >> A))
>>> pl_true(A >> (B >> A), deep=True)
True
>>> pl_true(A & ~A)
>>> pl_true(A & ~A, deep=True)
False
>>> pl_true(A & B & (~A | ~B), {A: True})
>>> pl_true(A & B & (~A | ~B), {A: True}, deep=True)
False

)SymbolTFc                   < \        V S4      '       g   V S9   d   R # \        V \        4      '       g   R# \        ;QJ d)    V3R lV P                   4       F  '       d   K   R# 	  R # ! V3R lV P                   4       4      # )TFc              3   4   <"   T F  pS! V4      x  K  	  R # 5iN ).0arg	_validates   & r   	<genexpr>-pl_true.<locals>._validate.<locals>.<genexpr>   s     7Yc9S>>Ys   )
isinstancer   allr   )r&   r.   r5   booleans   &r   r5   pl_true.<locals>._validate   sZ    dF##tw$00s7TYY7ss7s7s7TYY777r   z$%s is not a valid boolean expressionN)TF)sympy.core.symbolr.   r   r   itemssubsbooldictfromkeysatomspl_truer,   r*   )	r&   modeldeepkvresultr.   r5   r:   s	   &&&   @@@r   rC   rC      s    P )G8 w4=DT???$FGG#kkm<mdaqG|TQTmE<YYuFF|fllnd36!!V}} 
  v&& =s   %D	5D	c                    V'       d   \        V4      pM. pVP                  \        V 4      4       \        \	        V!  4      '       * # )a  
Check whether the given expr_set entail an expr.
If formula_set is empty then it returns the validity of expr.

Examples
========

>>> from sympy.abc import A, B, C
>>> from sympy.logic.inference import entails
>>> entails(A, [A >> B, B >> C])
False
>>> entails(C, [A >> B, B >> C, A])
True
>>> entails(A >> B)
False
>>> entails(A >> (B >> A))
True

References
==========

.. [1] https://en.wikipedia.org/wiki/Logical_consequence

)listappendr   r*   r   )r&   formula_sets   &&r   entailsrM      s;    2 ;'s4y!3,---r   c                   P   a  ] tR t^t o RtR	R ltR tR tR t]	R 4       t
RtV tR# )
KBz"Base class for all knowledge basesNc                Z    \        4       V n        V'       d   V P                  V4       R # R # r1   )setclauses_tellselfsentences   &&r   __init__KB.__init__   s    IIh r   c                    \         hr1   r%   rT   s   &&r   rS   KB.tell      !!r   c                    \         hr1   rZ   rU   querys   &&r   askKB.ask  r\   r   c                    \         hr1   rZ   rT   s   &&r   retract
KB.retract	  r\   r   c                >    \        \        V P                  4      4      # r1   )rJ   r   rR   )rU   s   &r   clauses
KB.clauses  s    GDMM*++r   )rR   r1   )__name__
__module____qualname____firstlineno____doc__rW   rS   r`   rc   propertyrf   __static_attributes____classdictcell____classdict__s   @r   rO   rO      s0     , 
""" , ,r   rO   c                   6   a  ] tR tRt o RtR tR tR tRtV t	R# )PropKBi  z=A KB for Propositional Logic.  Inefficient, with no indexing.c                r    \        \        V4      4       F  pV P                  P                  V4       K   	  R# )zAdd the sentence's clauses to the KB

Examples
========

>>> from sympy.logic.inference import PropKB
>>> from sympy.abc import x, y
>>> l = PropKB()
>>> l.clauses
[]

>>> l.tell(x | y)
>>> l.clauses
[x | y]

>>> l.tell(y)
>>> l.clauses
[y, x | y]

N)r   r   rR   addrU   rV   cs   && r   rS   PropKB.tell  s*    * 6(+,AMMa  -r   c                ,    \        WP                  4      # )zChecks if the query is true given the set of clauses.

Examples
========

>>> from sympy.logic.inference import PropKB
>>> from sympy.abc import x, y
>>> l = PropKB()
>>> l.tell(x & ~y)
>>> l.ask(x)
True
>>> l.ask(y)
False

)rM   rR   r^   s   &&r   r`   
PropKB.ask,  s      umm,,r   c                r    \        \        V4      4       F  pV P                  P                  V4       K   	  R# )zRemove the sentence's clauses from the KB

Examples
========

>>> from sympy.logic.inference import PropKB
>>> from sympy.abc import x, y
>>> l = PropKB()
>>> l.clauses
[]

>>> l.tell(x | y)
>>> l.clauses
[x | y]

>>> l.retract(x | y)
>>> l.clauses
[]

N)r   r   rR   discardrv   s   && r   rc   PropKB.retract>  s*    * 6(+,AMM!!!$ -r   r2   N)
rh   ri   rj   rk   rl   rS   r`   rc   rn   ro   rp   s   @r   rs   rs     s     G!0-$% %r   rs   )NFFF)NFr1   )rl   sympy.logic.boolalgr   r   r   r   r   sympy.core.sortingr   sympy.core.sympifyr   sympy.external.importtoolsr	   r   r*   r,   rC   rM   rO   rs   r2   r   r   <module>r      sN    & L L & & 4@4Tn&0FR.B, ,*C%R C%r   