and negative body literals, respectively, and ${{\mathit At}}({\ensuremath{r}})$ for the set ${\ensuremath{H({\ensuremath{r}})}}\cup {\ensuremath{B^+({\ensuremath{r}})}} \cup {\ensuremath{B^-({\ensuremath{r}})}}$. A rule ${\ensuremath{r}}$ is normal (or disjunction-free) if $|{\ensuremath{H({\ensuremath{r}})}}| = 1$ or $|{\ensuremath{H({\ensuremath{r}})}}| = 0$ (in this case ${\ensuremath{r}}$ is also referred to as a *constraint*), positive (or negation-free) if ${\ensuremath{B^-({\ensuremath{r}})}}=\emptyset$, a [*fact*]{} if both ${\ensuremath{B({\ensuremath{r}})}}=\emptyset$ and $|{\ensuremath{H({\ensuremath{r}})}}| = 1$.

A *program* ${P}$ is a finite set of rules; if all rules in it are positive (resp. normal), then ${P}$ is a positive (resp. normal) program. Odd-cycle-free (cf. [@dung-92; @you-yuan-94]) and stratified (cf. [@apt-etal-88]) programs constitute two other interesting classes of programs. An atom $p$ appearing in the head of a rule ${\ensuremath{r}}$ [*depends*]{} on each atom $q$ that belongs to ${\ensuremath{B({\ensuremath{r}})}}$; if $q$ belongs to ${\ensuremath{B^+({\ensuremath{r}})}}$, $p$ depends positively on $q$, otherwise negatively. A program without constraints is *odd-cycle-free* if there is no cycle of dependencies involving an odd number of negative dependencies, while it is [*stratified*]{} if each cycle of dependencies involves only positive dependencies. Programs containing constraints have been excluded by the definition of odd-cycle-free and stratified programs. In fact, constraints intrinsically introduce odd-cycles in programs as a constraint of the form $${\leftarrow}q_1,\ \ldots,\ q_j,\ {{\mathit not}}~q_{j+1},\ \ldots,\ {{\mathit not}}~q_m$$ can be 