def AC3(csp, queue=None, removals=None):
    """[Fig. 6.3]"""
    if queue is None:
        queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
    csp.support_pruning()
    while queue:
        (Xi, Xj) = queue.pop()
        if revise(csp, Xi, Xj, removals):
            if not csp.curr_domains[Xi]:
                return False
            for Xk in csp.neighbors[Xi]:
                if Xk != Xi:
                    queue.append((Xk, Xi))
    return True
def AC3(csp, queue=None, removals=None):
    """[Fig. 6.3]"""
    if queue is None:
        queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
    csp.support_pruning()
    while queue:
        (Xi, Xj) = queue.pop()
        if revise(csp, Xi, Xj, removals):
            if not csp.curr_domains[Xi]:
                return False
            for Xk in csp.neighbors[Xi]:
                if Xk != Xi:
                    queue.append((Xk, Xi))
    return True
def AC3 ( csp , queue = None , removals = None ) : if queue is None : queue = [ ( Xi , Xk ) for Xi in csp . vars for Xk in csp . neighbors [ Xi ] ] csp . support_pruning ( ) while queue : ( Xi , Xj ) = queue . pop ( ) if revise ( csp , Xi , Xj , removals ) : if not csp . curr_domains [ Xi ] : return False for Xk in csp . neighbors [ Xi ] : if Xk != Xi : queue . append ( ( Xk , Xi ) ) return True
[Fig. 6.3]
[ Fig . 6 . 3 ]