In My Mind
← inteligencia-artificial

9. DPLL Algoritms practice

Practica de algoritmo DPLL.

Para la actividad de programación generamos la clase DPLL. Hemos agregado el cascarón del método que deberás implementar. El método se denomina 'satisfiable' y recibe como entrada una fórmula en FNC. Hemos agregado la primera verificación que hace el algoritmo para que veas como debes entregar la respuesta. Se espera que el método regrese una tupla con dos elementos. El primer elemento de la tupla de respuesta es un valor booleano: verdadero si la fórmula es satisfactible, falso si no lo es. El segundo elemento de la tupla es una asignación en caso de que la fórmula sea satisfactible. En caso de que la fórmula no sea satisfactible deberás regresar None en el segundo elemento de la tupla, es decir la tupla deberá ser (False,None).

class DPLL:
    """
    DPLL algorithm
    """
    
    @staticmethod
    def satisfiable(phi):
        """
        determines if phi is satisfiable
        :param phi: a CNF formula
        :returs: una tupla cuyo primer elemento indica
        si la fórmula es satisfactible o no, y el segundo
        la asignación que logró hacer la fórmula verdadera
        """
        log.info("phi: "+str(phi))
        if phi.empty_sentence():
            log.info("sentencia vacia")
            return (True, phi.assignment)
        
        # Verificar si hay una cláusula vacía (contradicción)
        if phi.has_empty_clause():
            log.info("clausula vacia encontrada")
            return (False, None)
        
        # Propagación de literales unitarios
        unit_literal = phi.find_unit_clause()
        if unit_literal is not None:
            log.info(f"literal unitario encontrado: {unit_literal}")
            new_phi = phi.assign(unit_literal, True)
            return DPLL.satisfiable(new_phi)
        
        # Eliminación de literales puros
        pure_literal = phi.find_pure_literal()
        if pure_literal is not None:
            log.info(f"literal puro encontrado: {pure_literal}")
            # Asignar el valor que hace verdadero al literal puro
            value = True
            new_phi = phi.assign(pure_literal, value)
            return DPLL.satisfiable(new_phi)
        
        # Elegir un literal para ramificación
        literal = phi.choose_literal()
        log.info(f"ramificando en literal: {literal}")
        
        # Intentar con el literal como verdadero
        new_phi_true = phi.assign(literal, True)
        result = DPLL.satisfiable(new_phi_true)
        if result[0]:
            return result
        
        # Si falló, intentar con el literal como falso
        new_phi_false = phi.assign(literal, False)
        return DPLL.satisfiable(new_phi_false)

relatedInteligencia Artificial