code: 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
docs: [Fig. 6.3]