Esempio n. 1
0
def solve(num_variables, clauses, selection_heuristic):
    """
    Uses the dpll algorithm to determine if the formula is satisfiable or 
    unsatisfiable
    
    Returns a tuple with the following formats:
        - If the formula is satisfiable
            (True, [None, truth_value1, truth_vaue2, ...] )
        - If the formula is unsatisfiable
            (False, frozenset() ) 
    """
    
    # Dictionary with clauses classified by literals
    litclauses = datautil.classifyClausesByLiteral(clauses)
    
    # Amount of times each clause appears in the formula.
    # At the beginning every clause appears only once but after some
    # branching some clauses can appear more than once
    ctimes = { c : 1 for c in clauses }

    # We use an struct to have less parameters
    cdata = ClausesData(clauses, ctimes, litclauses)
    
    variables, interpretation = getVarsAndFirstIntp(num_variables, cdata)
    
    return _solve(variables, cdata, interpretation, selection_heuristic)
Esempio n. 2
0
def solve(num_variables, clauses, selection_heuristic):
    """
    Uses the dpll algorithm to determine if the formula is satisfiable or 
    unsatisfiable
    
    Returns a tuple with the following formats:
        - If the formula is satisfiable
            (True, [None, truth_value1, truth_vaue2, ...] )
        - If the formula is unsatisfiable
            (False, frozenset() ) 
    """

    # Dictionary with clauses classified by literals
    litclauses = datautil.classifyClausesByLiteral(clauses)

    # Amount of times each clause appears in the formula.
    # At the beginning every clause appears only once but after some
    # branching some clauses can appear more than once
    ctimes = {c: 1 for c in clauses}

    # We use an struct to have less parameters
    cdata = ClausesData(clauses, ctimes, litclauses)

    variables, interpretation = getVarsAndFirstIntp(num_variables, cdata)

    return _solve(variables, cdata, interpretation, selection_heuristic)
Esempio n. 3
0
def solve(num_variables, clauses, selection_heuristic):
    """
    Uses the dp algorithm to determine if the formula is satisfiable or 
    unsatisfiable
    
    Returns a tuple with the following formats:
        - If the formula is satisfiable
            (True, frozenset() )
        - If the formula is unsatisfiable
            (False, frozenset(<core_clause1>, <core_clause2>, ...) ) 
    """

    litclauses = datautil.classifyClausesByLiteral(clauses)
    variables = range(1, num_variables + 1)
    reason = {}  # Clause "parents"

    while variables:

        if unitPropagation(variables, clauses, litclauses, reason):
            return (False, generateCoreFromEmtpyClause(reason))

        # All clauses and variables wasted without finding the emtpy clause
        if not clauses or not variables:
            return (True, frozenset())

        # Select variable
        var = selection_heuristic(variables, litclauses)
        variables.remove(var)

        # Ignore variables that don't belong to any clause
        if not litclauses.has_key(var) and not litclauses.has_key(var):
            continue

        if resolution(var, clauses, litclauses, reason):
            return (False, generateCoreFromEmtpyClause(reason))

    return (True, frozenset())
Esempio n. 4
0
def solve(num_variables, clauses, selection_heuristic):
    """
    Uses the dp algorithm to determine if the formula is satisfiable or 
    unsatisfiable
    
    Returns a tuple with the following formats:
        - If the formula is satisfiable
            (True, frozenset() )
        - If the formula is unsatisfiable
            (False, frozenset(<core_clause1>, <core_clause2>, ...) ) 
    """
    
    litclauses = datautil.classifyClausesByLiteral(clauses)
    variables = range(1, num_variables+1)
    reason = {} # Clause "parents"
        
    while variables:
        
        if unitPropagation(variables, clauses, litclauses, reason):
            return (False, generateCoreFromEmtpyClause(reason))

        # All clauses and variables wasted without finding the emtpy clause
        if not clauses or not variables:
            return (True, frozenset())
        
        # Select variable
        var = selection_heuristic(variables, litclauses)
        variables.remove(var)
        
        # Ignore variables that don't belong to any clause
        if not litclauses.has_key(var) and not litclauses.has_key(var):
            continue
        
        if resolution(var, clauses, litclauses, reason):
            return (False, generateCoreFromEmtpyClause(reason))
            
    return (True, frozenset())