+
    ‹°³já-  ã                   óÒ   € R t ^ RIHt ^ RIHt ^ RIHtHt ^ RIH	t	H
t
 ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHtHt ^ R
IHt R]R]3R ltR tRR ltR tRR ltR]3R ltR# )zJ
Module to evaluate the proposition with assumptions using SAT algorithm.
)ÚS)ÚSymbol)Ú
NumberKindÚUndefinedKind)Úget_all_known_matrix_factsÚget_all_known_number_facts)Úglobal_assumptionsÚAppliedPredicate)Úclass_fact_registry)Úoo)Úsatisfiable)ÚCNFÚ
EncodedCNF)Ú
MatrixKindTc                óV  € \         P                  ! V 4      p\         P                  ! V ( 4      p\         P                  ! V4      p\        4       pV'       d   VP                  V4      p\        WQVW4R7      pVP	                  V4       V'       d   VP	                  V4       \        WVV4      # )aŠ  
Function to evaluate the proposition with assumptions using SAT algorithm.

This function extracts every fact relevant to the expressions composing
proposition and assumptions. For example, if a predicate containing
``Abs(x)`` is proposed, then ``Q.zero(Abs(x)) | Q.positive(Abs(x))``
will be found and passed to SAT solver because ``Q.nonnegative`` is
registered as a fact for ``Abs``.

Proposition is evaluated to ``True`` or ``False`` if the truth value can be
determined. If not, ``None`` is returned.

Parameters
==========

proposition : Any boolean expression.
    Proposition which will be evaluated to boolean value.

assumptions : Any boolean expression, optional.
    Local assumptions to evaluate the *proposition*.

context : AssumptionsContext, optional.
    Default assumptions to evaluate the *proposition*. By default,
    this is ``sympy.assumptions.global_assumptions`` variable.

use_known_facts : bool, optional.
    If ``True``, facts from ``sympy.assumptions.ask_generated``
    module are passed to SAT solver as well.

iterations : int, optional.
    Number of times that relevant facts are recursively extracted.
    Default is infinite times until no new fact is found.

Returns
=======

``True``, ``False``, or ``None``

Examples
========

>>> from sympy import Abs, Q
>>> from sympy.assumptions.satask import satask
>>> from sympy.abc import x
>>> satask(Q.zero(Abs(x)), Q.zero(x))
True

)Úuse_known_factsÚ
iterations)r   Ú	from_propÚextendÚget_all_relevant_factsÚadd_from_cnfÚcheck_satisfiability)	ÚpropositionÚassumptionsÚcontextr   r   ÚpropsÚ_propsÚcontext_cnfÚsats	   &&&&&    ÚY/home/luca/screen-checking/.venv/lib/python3.14/site-packages/sympy/assumptions/satask.pyÚsataskr       s‰   € ôd �MŠM˜+Ó&€EÜ�]Š]˜K˜<Ó(€Fä—-’- Ó,€Kä“%€KßØ!×(Ñ(¨Ó1ˆä
  °[Ø'ô@€Cà×Ñ�[Ô!ßØ×Ñ˜Ô%ä ¨sÓ3Ð3ó    c                 ó\  € VP                  4       pVP                  4       pVP                  V 4       VP                  V4       \        V4      p\        V4      pV'       d   V'       d   R # V'       d   V'       g   R# V'       g   V'       d   R# V'       g   V'       g   \        R4      hR # R # )NTFzInconsistent assumptions)Úcopyr   r   Ú
ValueError)ÚpropÚ_propÚfactbaseÚsat_trueÚ	sat_falseÚcan_be_trueÚcan_be_falses   &&&    r   r   r   U   sz   € Ø�}‰}‹€HØ—‘“€IØ×Ñ˜$ÔØ×Ñ˜5Ô!Ü˜hÓ'€KÜ˜yÓ)€Lç—|ÙçŸ<ÙçŸ<ÙçŸ|ô Ð3Ó4Ð4ñ	  ,‰;r!   Nc                ó  € \        V 4      pV P                  4       p\        4       pV'       d   WQP                  4       ,          pV'       d   WRP                  4       ,          pV\        P                  \        P
                  0,
          pRpV\        4       8w  dP   \        4       pV F-  p\        V4      p	W“,          \        4       8w  g   K%  Wy,          pK/  	  Ws,
          pW6,          pK^  YE Uu0 uF&  p\        V4      V,          \        4       8w  g   K$  VkK(  	  up,          p\        4       p
V FH  p\        V\        4      '       d   V
\        VP                  4      ,          p
K7  V
P                  V4       KJ  	  V
# u upi )a�  
Extract every expression in the argument of predicates from *proposition*,
*assumptions* and *context*.

Parameters
==========

proposition : sympy.assumptions.cnf.CNF

assumptions : sympy.assumptions.cnf.CNF, optional.

context : sympy.assumptions.cnf.CNF, optional.
    CNF generated from assumptions context.

Examples
========

>>> from sympy import Q, Abs
>>> from sympy.assumptions.cnf import CNF
>>> from sympy.assumptions.satask import extract_predargs
>>> from sympy.abc import x, y
>>> props = CNF.from_prop(Q.zero(Abs(x*y)))
>>> assump = CNF.from_prop(Q.zero(x) & Q.zero(y))
>>> extract_predargs(props, assump)
{x, y, Abs(x*y)}

N)
Úfind_symbolsÚall_predicatesÚsetr   ÚtrueÚfalseÚ
isinstancer	   Ú	argumentsÚadd)r   r   r   Úreq_keysÚkeysÚlkeysÚtmp_keysÚtmpÚlÚsymsÚexprsÚkeys   &&&         r   Úextract_predargsr>   m   s&  € ô8 ˜KÓ(€HØ×%Ñ%Ó'€Dä‹E€EßØ×+Ñ+Ó-Õ-ˆßØ×'Ñ'Ó)Õ)ˆà”Q—V‘VœQŸW™WÐ%Õ%€EØ€HØ
”c“eÔ
Ü‹eˆÛˆAÜ “?ˆDØ•¤C£EÖ)Ø•’ñ ð •>ˆØÕŠØ˜ÓE™�1¤¨a£°8Õ!;¼s»uÑ!D�QˆQ™ÑEÕE€Dä‹E€EÛˆÜ�cÔ+×,Ò,Ø”S˜Ÿ™Ó'Õ'ŠEà�I‰I�cŽNñ	 ð
 €Lùò Fs   Ã-!E<ÄE<c                óÂ   € \        V \        4      '       d6   \        4       pV P                  4        F  pV\	        V4      ,          pK  	  V# V P                  \        4      # )zo
Find every :obj:`~.Symbol` in *pred*.

Parameters
==========

pred : sympy.assumptions.cnf.CNF, or any Expr.

)r2   r   r/   r.   r-   Úatomsr   )ÚpredÚsymbolsÚas   &  r   r-   r-   ¦   sM   € ô �$œ×ÒÜ“%ˆØ×$Ñ$Ö&ˆAØ”| A“Õ&ŠGñ 'àˆØ�:‰:”fÓÐr!   c                óh  € V'       g   \        4       p\        4       pV  F‡  p\        V4       Fu  p\         P                  ! V4      pVP	                  V4      pVP                  4        F7  p\        V\        4      '       g   K  V\        VP                  4      ,          pK9  	  Kw  	  K‰  	  W ,
          V3# )a^  
Extract relevant facts from the items in *exprs*. Facts are defined in
``assumptions.sathandlers`` module.

This function is recursively called by ``get_all_relevant_facts()``.

Parameters
==========

exprs : set
    Expressions whose relevant facts are searched.

relevant_facts : sympy.assumptions.cnf.CNF, optional.
    Pre-discovered relevant facts.

Returns
=======

exprs : set
    Candidates for next relevant fact searching.

relevant_facts : sympy.assumptions.cnf.CNF
    Updated relevant facts.

Examples
========

Here, we will see how facts relevant to ``Abs(x*y)`` are recursively
extracted. On the first run, set containing the expression is passed
without pre-discovered relevant facts. The result is a set containing
candidates for next run, and ``CNF()`` instance containing facts
which are relevant to ``Abs`` and its argument.

>>> from sympy import Abs
>>> from sympy.assumptions.satask import get_relevant_clsfacts
>>> from sympy.abc import x, y
>>> exprs = {Abs(x*y)}
>>> exprs, facts = get_relevant_clsfacts(exprs)
>>> exprs
{x*y}
>>> facts.clauses #doctest: +SKIP
{frozenset({Literal(Q.odd(Abs(x*y)), False), Literal(Q.odd(x*y), True)}),
frozenset({Literal(Q.zero(Abs(x*y)), False), Literal(Q.zero(x*y), True)}),
frozenset({Literal(Q.even(Abs(x*y)), False), Literal(Q.even(x*y), True)}),
frozenset({Literal(Q.zero(Abs(x*y)), True), Literal(Q.zero(x*y), False)}),
frozenset({Literal(Q.even(Abs(x*y)), False),
            Literal(Q.odd(Abs(x*y)), False),
            Literal(Q.odd(x*y), True)}),
frozenset({Literal(Q.even(Abs(x*y)), False),
            Literal(Q.even(x*y), True),
            Literal(Q.odd(Abs(x*y)), False)}),
frozenset({Literal(Q.positive(Abs(x*y)), False),
            Literal(Q.zero(Abs(x*y)), False)})}

We pass the first run's results to the second run, and get the expressions
for next run and updated facts.

>>> exprs, facts = get_relevant_clsfacts(exprs, relevant_facts=facts)
>>> exprs
{x, y}

On final run, no more candidate is returned thus we know that all
relevant facts are successfully retrieved.

>>> exprs, facts = get_relevant_clsfacts(exprs, relevant_facts=facts)
>>> exprs
set()

)	r   r/   r
   Úto_CNFÚ_andr.   r2   r	   r3   )r<   Úrelevant_factsÚnewexprsÚexprÚfactÚnewfactr=   s   &&     r   Úget_relevant_clsfactsrL   ¸   s‘   € ÷L Ü›ˆä‹u€HÛˆÜ'¨Ö-ˆDÜ—j’j Ó&ˆGØ+×0Ñ0°Ó9ˆNØ×-Ñ-Ö/�Ü˜cÔ#3×4Ô4Ø¤ C§M¡MÓ 2Õ2’Hó 0ó .ñ ð Õ˜^Ð+Ð+r!   c                ó*  a€ ^ p\        4       p\        4       p V^ 8X  d   \        WV4      pVX,          p\        W†4      w  r†V^,          pWT8¼  d   MV'       d   KD   V'       EdŽ   \        4       p	\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V	P                  \        4       4       \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V	P                  \        4       4       \        4       p
V
P                  V	4       R oV3R lp. p. p\        V
P                  4      p\        V4       FL  w  r_YÚP                   Uu. uF  pV! V4      NK  	  up,          pWË! V
P                  W^,          4      ,          pKN  	  \        \        \!        V\#        ^\        V4      ^,           4      4      4      4      p\        VV4      pM
\        4       pVP%                  V4       V# u upi )aè  
Extract all relevant facts from *proposition* and *assumptions*.

This function extracts the facts by recursively calling
``get_relevant_clsfacts()``. Extracted facts are converted to
``EncodedCNF`` and returned.

Parameters
==========

proposition : sympy.assumptions.cnf.CNF
    CNF generated from proposition expression.

assumptions : sympy.assumptions.cnf.CNF
    CNF generated from assumption expression.

context : sympy.assumptions.cnf.CNF
    CNF generated from assumptions context.

use_known_facts : bool, optional.
    If ``True``, facts from ``sympy.assumptions.ask_generated``
    module are encoded as well.

iterations : int, optional.
    Number of times that relevant facts are recursively extracted.
    Default is infinite times until no new fact is found.

Returns
=======

sympy.assumptions.cnf.EncodedCNF

Examples
========

>>> from sympy import Q
>>> from sympy.assumptions.cnf import CNF
>>> from sympy.assumptions.satask import get_all_relevant_facts
>>> from sympy.abc import x, y
>>> props = CNF.from_prop(Q.nonzero(x*y))
>>> assump = CNF.from_prop(Q.nonzero(x))
>>> context = CNF.from_prop(Q.nonzero(y))
>>> get_all_relevant_facts(props, assump, context) #doctest: +SKIP
<sympy.assumptions.cnf.EncodedCNF at 0x7f09faa6ccd0>

Tc              3   óX   "  € T F   qP                   \        \        4      8H  x € K"  	  R # 5i©N)Úkindr   r   ©Ú.0rI   s   & r   Ú	<genexpr>Ú)get_all_relevant_facts.<locals>.<genexpr>R  s   é € ÐI¹y°t�y‰yœJ¤zÓ2Ö2»yùs   ‚(*Fc              3   ó|   "  € T F2  qP                   \        8H  ;'       g    VP                   \        8H  x € K4  	  R # 5irO   )rP   r   r   rQ   s   & r   rS   rT   U  s-   é € ÐaÑW`Èt—‘œjÑ(×IÐI¨d¯i©i¼=Ñ.HÔIÓW`ùs   ‚< <c                 ó0   € V ^ 8”  d	   W,           # W,
          # )é    © )ÚlitÚdeltas   &&r   Útranslate_literalÚ1get_all_relevant_facts.<locals>.translate_literal[  s   € Ø�QŒwØ•{Ð"à•{Ð"r!   c                 ól   <€ V  UUu. uF  q" Uu0 uF  pS! W14      kK  	  upNK  	  upp# u upi u uppi rO   rX   )ÚdatarZ   ÚclauseÚir[   s   &&  €r   Útranslate_dataÚ.get_all_relevant_facts.<locals>.translate_dataa  s5   ø€ ÙPTÔUÑPTÀf¸&ÓA¹&°QÑ& qÖ0¹&ÔAÑPTÒUÐUùÒAùÓUs   ‡0�+ 0«0)r   r/   r>   rL   ÚanyÚadd_clausesr   r   r   Úfrom_cnfÚlenrB   Ú	enumerater^   ÚdictÚlistÚzipÚranger   )r   r   r   r   r   r`   rG   Ú	all_exprsr<   Úknown_facts_CNFÚ
kf_encodedra   r^   rB   Ún_litrI   rA   ÚencodingÚctxr[   s   &&&&&              @r   r   r     s«  ø€ ðh 	
€AÜ“U€NÜ“€IØ
Ø�Œ6Ü$ [¸wÓGˆEØ�UÕˆ	Ü 5°eÓ LÑˆØ	ˆQ�ˆØŒ?Øß‰uØç€Ü›%ˆç‹3ÑI¹yÓI�3�3Š3ÑI¹yÓI×IÒIØ×'Ñ'Ô(BÓ(DÔEç‹3ÑaÑW`Óa�3�3Š3ÑaÑW`Óa×aÒaØ×'Ñ'Ô(BÓ(DÔEä“\ˆ
Ø×Ñ˜OÔ,ò	#õ	VàˆØˆÜ�J×&Ñ&Ó'ˆÜ  Ö+‰GˆAØ×/AÒ/AÓBÑ/A t™˜Tž
Ñ/AÑBÕBˆGØ�N :§?¡?°AµIÓ>Õ>ŠDñ ,ô œœS ¬%°´3°w³<Àµ>Ó*BÓCÓDÓEˆÜ˜˜xÓ(‰ä‹lˆà×Ñ�^Ô$à€Jùò Cs   Å1H)NNrO   )Ú__doc__Úsympy.core.singletonr   Úsympy.core.symbolr   Úsympy.core.kindr   r   Úsympy.assumptions.ask_generatedr   r   Úsympy.assumptions.assumer   r	   Úsympy.assumptions.sathandlersr
   Ú
sympy.corer   Úsympy.logic.inferencer   Úsympy.assumptions.cnfr   r   Úsympy.matrices.kindr   r    r   r>   r-   rL   r   rX   r!   r   Ú<module>r}      sb   ðñõ #Ý $ß 5ß bß IÝ =Ý Ý -ß 1Ý *ð %)Ð2DØ¨ôA4òH5ô07òrô$R,ðl ¨ödr!   