AC-3 Algorithm

The following pseudo-code illustrates the AC-3 algorithm which enforces arc-consistency on a binary CSP or returns failure if it is discovered that the CSP cannot be satisfied.


//This is the top-level function that takes in a CSP. 
//The CSP contains the variables, domains, and constraints
AC-3(CSP)
    queue ← {}
    for all constraints (X,Y) in CSP
        queue.push((X,Y))
    end

    while queue not empty
        (Xi, Xj) ← queue.pop()

        if REMOVE-VALUES(Xi, Xj)
            if Di is empty
                // There is no way to satisfy this CSP
                return FAILURE
            end

            //Modifying the domain of Xi necessitates re-queueing all incoming arcs
            for each arc of the form (Xk, Xi)
	            queue.push((Xk, Xi))
            end
        end
    end
end    


//Makes X arc-consistent with respect to Y
REMOVE-VALUES(X, Y)
    modified = false

    for each p in DX
        
        //Try to find a value in DY that satisfies the constraint
        found = false
        for each q in DY
            if (p,q) satisfies the constraint on (X,Y)
                found = true
                break
            end
        end
        
        if !found
            remove p from DX
            modified = true
        end
    end

    return modified
end