
    e!h4                     J   d dl mZ ddl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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 d d
lmZ ed        Zej7                  e      d        Zej7                  e      d        Zej7                  e      d        Zd Zd ZddZy)    )singledispatch   )FeatureCheck	TypeCheckFactCaptureSameContextCheck)
WhereCheck)dnf)ConflictSetNodeNotNodeOrdinaryMatchNode)	WhereNode)NOTORANDTESTEXISTSFORALL)InitialFactFact)Rulec                     | S )a  
    Given a rule, build a new one suitable for RETE network generation.

    Meaning:

        #. Rule is in disjuntive normal form (DNF).

        #. If the `rule` is empty is filled with an `InitialFact`.

        #. If the `rule` starts with a `NOT`, an `InitialFact` is prepended.

        #. If any AND starts with a `NOT`, an `InitialFact` is prepended.

        #. If the `rule` is an OR condition, each NOT inside will be
        converted to AND(InitialFact(), NOT(...))

     exps    c/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/experta/matchers/rete/utils.pyprepare_ruler      s	    & J    c                 D   t        |       } |j                  |D cg c]  }t        |       c} }|s|j                  t                     S t	        |d   t
              st        t        |            dk(  r |j                  t               g| S t        |      S c c}w Nr   )r
   new_conditionsr   r   
isinstancer   lenextract_facts)r   dnf_rulee	prep_rules       r   _r(   #   s    3xH'''#+	,a,q/	,.I''66	IaL#	&#mI.F*G1*L'y''B	BB9~ 
-s   Bc                    g }| D ]r  }t        |t              r$|j                  t        t	               |             7t        |t              r|j                  t        |             b|j                  |       t t        | S N)r"   r   appendr   r   r   r   )r   or_expr&   s      r   r(   r(   0   sg    F aMM#kmQ/03MM,q/*MM! v;r   c                 T    t        | d   t              rt        t               g|  S | S r    )r"   r   r   r   r   s    r   r(   r(   =   s'    #a&#;='3''
r   c                 0    fdt         |             S )z9Given a rule, return a set containing all rule LHS facts.c              3      K   t        | t              r|  y t        | t              ry | D ]  } |      E d {     y 7 wr*   )r"   r   r   )cer&   _extract_factss     r   r1   z%extract_facts.<locals>._extract_factsG   sC     b$HD! -)!,,,-,s   7AAA)set)ruler1   s    @r   r$   r$   E   s    - ~d#$$r   c              #   l  K   t        t        |              d}| j                         D ]i  \  }}t        |t              rF|j                  d      r5|j                  d      r$|dk(  rt        |       d}Mt        ||       \t        ||       k |st        dt        |       z         yyw)z?Given a fact, generate a list of Check objects for checking it.F____bind__Tz__pattern_%s__N)
r   typeitemsr"   str
startswithendswithr   r   id)factfact_capturedkeyvalues       r   generate_checksrA   S   s      DJ
Mjjl +
UsC NN4(LL&j !%(( $"3..sE**+ *RX566 s   B2B4Nc                 F   || }t         d        j                  t              d        }j                  t              fd       }j                  t              fd       }j                  t
              j                  t              fd              }j                  t              d        }j                  t              fd       }j                  t              fd       } |      }t        |       }|j                  ||j                         y )	Nc                 0    t        dt        |       z        )NzUnknown type %s)	TypeErrorr7   elems    r   
_wire_rulezwire_rule.<locals>._wire_ruleo   s    )DJ677r   c                 0    t        t        | d               S r    )r   r	   rE   s    r   r(   zwire_rule.<locals>._s   s    DG,--r   c                    | d   }| dd  } t                     } |      } t        |       }t        t                     }t        t                     }|j	                  ||j
                         |j	                  ||j                         |j	                  ||j
                         |j	                  ||j                         |S )Nr   r   )r   r   r   r   	add_childactivate_rightactivate_left)	rF   leader	followersinitial_fact_nodeleader_nodefollowers_node
not_node_1
not_node_2rG   s	           r   r(   zwire_rule.<locals>._w   s    aH	&{}5 (#CO4-/0
-/0
 	  Z-F-FGj**B*BC 	Z)B)BC##J
0H0HIr   c                 j    | d         } t                     }t        t                     }t        t                     }|j                  ||j                         |j                  ||j
                         |j                  ||j
                         |j                  ||j                         |S r    )r   r   r   rJ   rK   rL   )rF   condition_noderO   rR   rS   rG   s        r   r(   zwire_rule.<locals>._   s     $DG,&{}5-/0
-/0
 	  Z-F-FG##J
0H0HI 	##J
0H0HIZ)B)BCr   c                 H   t        |       dk(  r&t        | d   t              r	| d      S  | d         S d }t        | | dd        D ]  \  }}t        |t              r1| |      } |      }|j                  ||j                         |}Gt        |t              rt        }nt        }|! |t                     } |      } |      }n|} |      } |t                     }|j                  ||j                         |j                  ||j                          |S )Nr   r   )r#   r"   r   zipr   rJ   activater   r   r   r   rL   rK   )
rF   current_nodefsnew_nodenode_clsleft_branchright_branchrG   alpha_terminalss
           r   r(   zwire_rule.<locals>._   s4    t9>$q'4(&tAw//!$q'**LD$qr(+ H1a&#+'1!}  *!}H **8X5F5FG#+L!!S)#*#4#+'/0@0B'C&0m'1!}&2'1!}'/0@0B'C)),*6*D*DF **<+7+F+FH5H8  r   c                     t        d      )Nz2You can't use an OR clause inside FORALL or EXISTS)SyntaxErrorrE   s    r   r(   zwire_rule.<locals>._   s    @B 	Br   c                     |    S r*   r   rF   r`   s    r   r(   zwire_rule.<locals>._   s    t$$r   c                     | d      S r    r   rd   s    r   r(   zwire_rule.<locals>._   s    tAw''r   )r   registerr   r   r   r   r   r   r   r   r   rJ   rX   )r3   r`   lhsr(   	last_nodeconflict_set_noderG   s    `    @r   	wire_rulerj   k   s>   
{8 8 . .   !(   !" $   $ L B B % % ( ( 3I (-)+<+E+EFr   r*   ) 	functoolsr   checkr   r   r   r   r	   r
   nodesr   r   r   r   experta.conditionalelementr   r   r   r   r   r   experta.factr   r   experta.ruler   r   rf   r(   r$   rA   rj   r   r   r   <module>rq      s    $ I I   > >  I I *   * t	 	 r	 	 s %70mGr   