= 
(f(t_{11}, \ldots, t_{n1}), \ldots, f(t_{1k}, \ldots, t_{nk})).$$ An operation $f: B^n \rightarrow B$ is a *polymorphism* of a structure ${\mathbf{B}}$ over $\sigma$ if for every symbol $R \in \sigma$ and any tuples ${\overline{t_1}}, \ldots, {\overline{t_n}} \in R^{{\mathbf{B}}}$, it holds that $f({\overline{t_1}}, \ldots, {\overline{t_n}}) \in R^{{\mathbf{B}}}$. That is, each relation $R^{{\mathbf{B}}}$ is closed under the action of $f$. Equivalently, an operation $f: B^n \rightarrow B$ is a polymorphism of ${\mathbf{B}}$ if it is a homomorphism from ${\mathbf{B}}^n$ to ${\mathbf{B}}$.

Algorithms {#sect:algorithms}
==========

In this section, we give a uniform presentation of the four algorithms under investigation in this paper: arc consistency, look-ahead arc consistency, peek arc consistency, and singleton arc consistency, presented in Sections \[ss:ac\], \[ss:laac\], \[ss:pac\], and \[ss:sac\], respectively. The results on the first three algorithms come from previous work, as we discuss in presenting each of these algorithms; for singleton arc consistency, we here develop results similar to those given for the other algorithms.

Our treatment of arc consistency, peek arc consistency, and singleton arc consistency is uniform: for each of these algorithms, we present a homomorphism-based consistency condition, we show that the algorithm checks precisely this consistency condition, and we give an algebraic condition describing the structures 