³ò
dO“Ic           @   sä   d  Z  d Z d Z e Z e Z d d d „  ƒ  YZ d „  Z d „  Z	 d  d k
 l Z l Z d  d k l Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d S(   iÿÿÿÿi    i   t   GVc           B   s   e  Z d  Z h  Z d Z RS(   s   Variabil globali di data.pyi    (   t   __name__t
   __module__t   __doc__t   varst   vars_N(    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR    
   s   c         C   s   |  d j o d n d S(   Ni    i   iÿÿÿÿ(    (   t   z(    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   sgn   s    c         C   s   |  d j o | n | S(   Ni    (    (   t   lt   v(    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   val   s    (   t   uniquet   append_if_new(   t   DEBUGt   Unsatisfablec           B   s   e  Z RS(    (   R   R   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR      s    t   Conflictc           B   s   e  Z RS(    (   R   R   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR      s    t
   TrueClausec           B   s   e  Z RS(    (   R   R   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR      s    t   Clausec           B   s2   e  Z d  d d g Z d „  Z d „  Z d „  Z RS(   t   undefst   onest   litc      
   C   s;  t  | ƒ t  g  ƒ j o t d ‚ n t g  } | D] } | t j o | | q4 q4 ~ ƒ |  _ |  i g  j o t d ‚ n t |  i j o
 t ‚ n t |  i ƒ t t g  } |  i D] } | t	 | ƒ q¸ ~ ƒ ƒ j o
 t ‚ n x1 |  i D]& } t
 | ƒ t i t	 | ƒ i |  <qò Wt |  i ƒ |  _ d |  _ d S(   s¬  lit e' un vettore che rappresenta la clausola. E' del tipo [Z1, Z2, ...]
                   Ogni Zi rappresenta un letterale ed e' un intero (positivo
                   o negativo, diverso da zero). Zi e' negativo se il letterale contiene il 
                   simbolo NOT. In particolare,  1 verra' interpretato come TRUE e -1 come FALSE.
        
                   Nota: per "valutare" una letterale, basta moltiplicare la variabile per il
                   segno del letterale, cioe' sgn(l)*v, dove l e' un letterale che contiene la variabile v. Ad
                   esempio, se l e' "NOT v", con v.value=TRUE, e 15 e' il numero della variabile v, avremo:  
                       l=-15
                       sgn(l)=-1
                       v.value=TRUE=1
                       sgn(l)*v.value=-1=FALSE

                   Questa funzione (__init__) fa una raise di TrueClause se la clausola deve essere scartata.
                s   lit  deve essere un arrays   Clausola vuotai    N(   t   typet	   ExceptionR   t   FALSER   R   t   TRUER   t   lent   absR   R    R   t   clause_listR   R   (   t   selfR   t   _[1]R   t   _[2](    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   __init__   s    ;
F

 $c         C   sQ   d |  _  xA |  i D]6 } t i t | ƒ i t j o |  i  d 7_  q q Wd S(   s�   Resetta il contatore self.undefs, conta il numero di
                   letterali non assegnati correnti e reimposta il contatorei    i   N(   R   R   R    R   R   t   valuet   UNDEF(   R   R   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   adjust_undefsF   s
    	
 c         C   s/   t  |  i ƒ d t  |  i ƒ d t  |  i ƒ S(   Ns	    undefs: s    ones: (   t   strR   R   R   (   R   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   __str__M   s    (   R   R   t	   __slots__R   R"   R$   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR      s   	,	t   Varc           B   sb   e  Z d  d d d d d g Z d d „ Z d d d „ Z d	 „  Z d
 „  Z g  d „ Z d „  Z	 RS(   t   nameR    t	   impliedbyt   levelR   t   activityi    c         C   s@   | |  _  t |  _ d  |  _ t d ƒ |  _ h  |  _ d |  _ d  S(   Nt   infinityi    (	   R'   R!   R    t   NoneR(   t   floatR)   R   R*   (   R   R'   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR   S   s    				c   
      C   s  |  i  t j o6 |  i  | j o
 t ‚ n t o t d ‚ n g  Sn g  } | |  _  | d j o | |  _ n | d j o | |  _ n xs|  i i	 ƒ  D]b\ } } |  i  | j o | i
 d 7_
 n | i d 8_ | i d j oƒ t | i ƒ d j om t | i d ƒ |  i  j oP t o( t | i d ƒ |  i j p t ‚ n | i | | i d |  f ƒ q™ | i d j o� d } xU | i D]J } t i t | ƒ }	 |	 i  t j o! | i | | |	 f ƒ d } PqŠqŠWt o | d j p t ‚ qûq™ q™ W| S(   sÆ   Assegna un valore alla variabile.
                   Ritorna la lista delle clausole unitarie generate dall'assegnamento.
                   Se entriamo in conflitto fa il raise dell'errore Conflicts;   Non dovremmo riassegnare lo stesso valore ad una variabile!i   i    N(   R    R!   R   R   R   R,   R(   R)   R   t	   iteritemsR   R   R   R   R   R   R'   t   AssertionErrort   appendR    R   (
   R   R
   R(   R)   t   impliedt   Ct   signt   foundR   R	   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt	   set_valueg   sB    
 	 C (!
 	  c         C   se   |  i  } t |  _  xL |  i i ƒ  D]; \ } } | | j o | i d 8_ n | i d 7_ q" Wd S(   s”   Azzeriamo il valore di `self', aggiornando tutti i relativi
                   contatori.
                   Nota: Supponiamo che self.value!=UNDEF.i   N(   R    R!   R   R.   R   R   (   R   t   oldvalueR2   R   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   unset–   s    		 c         C   s/   d |  _ d |  _ |  i d 7_ |  i ƒ  d S(   s­   Resettiamo la variabile `self', ripristinandola alla
                   condizione di inizio programma. Aggiorniamo pero' il suo
                   contatore di attivita'.  i    i   N(   R,   R(   R)   R*   R7   (   R   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   reset¥   s    		c      
   C   sÇ   |  i  p |  g Sn g  } | i |  ƒ x˜ |  i  i D]Š } t | ƒ } | |  i j o q5 n t i | | j o q5 n | t i | i | g  } |  i  i D] } | t | ƒ qž ~ ƒ 7} q5 W| S(   s	  Ritorna la lista di tutte le variabili decisionali che
                hanno contribuito ad implicare l'attuale valore di `self'.
                Nota: le variabili decisionali sono quelle il cui valore e'
                stato assegnato a seguito di una decisione.(   R(   R0   R   R   R'   R    R   t   get_root_implications(   R   t   alreadyseent   LR   R   t   il(    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR9   ®   s    
   Jc         C   s   d |  i  |  i |  i f S(   Ns   v:%d val=%d lvl=%d(   R'   R    R)   (   R   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR$   Á   s    N(
   R   R   R%   R   R,   R5   R7   R8   R9   R$   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyR&   P   s   /			c          C   s4   x- t  i i ƒ  D] }  t |  i ƒ d |  _ q Wd S(   sx   Ammortizza il contatore di attivita' di ogni variabile, in modo da
           favorire quelle con attivita' piu' recentegš™™™™™ñ?N(   R    R   t
   itervaluesR-   R*   (   R	   (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pyt   adjust_activityÄ   s     N(    (   R   R!   R   t   Truet   PyTruet   Falset   PyFalseR    R   R
   t   miscR   R   t   debugR   R   R   R   R   t   objectR   R&   R>   (    (    (    sD   /home/alpt/misc/unimat/appunti/logica/computazionale/dputnam/data.pys   <module>   s   		8t