There is an algorithm that, when given an input — typically an integer or a tuple of integers or a sequence of characters — eventually halts if it is a member of S and otherwise runs forever.
Or, equivalently,
There is an algorithm that "generates" the members of S. That means that its output is simply a list of the members of S: s1, s2, s3, ... If necessary it runs forever.
Common-programming-sense should suggest how to convert either of these algorithms to the other, thus showing the equivalence of the existence of either with the existence of the other. The first condition suggests why the term semi-decidable is sometimes used; the second suggests why computably enumerable is used.
In other words the set S is recursively enumerable iff there exists a computable functionf with domain(f) = S.
Notes
If A and B are recursively enumerable sets then A ∩ B and A ∪ B are recursively enumerable sets. A set A is a recursive setiff both A and the complement of A are recursively enumerable sets. The preimage of a recursively enumerable set under a computable function is a recursively enumerable set.
A recursivelyenumerable formal language is a recursivelyenumerablesubset in the set of all possible words over the alphabet of the language.
A recursivelyenumerable language is a formal language for which there exists a Turing machine (or other computable function) which will enumerate all valid strings of the language.
A recursivelyenumerable language is a formal language for which there exists a Turing machine (or other computable function) that will halt and accept when presented with any string in the language as input.