very straightforward. However, the set of primitive recursive functions does not include every possible total computable function—this can be seen with a variant of Cantor's diagonal argument. This argument provides a total computable function that is not primitive recursive. A sketch of the proof is as follows: This argument can be applied to any class of computable (total) functions that can be enumerated in this way, as explained in the article Machine that always halts. Note however that the partial computable functions (those that need not be defined for all arguments) can be explicitly enumerated, for instance by enumerating Turing machine encodings. Other examples of total recursive but not primitive recursive functions are known: The function that takes m to Ackermann(m,m) is a unary total recursive function that is not primitive recursive. The Paris–Harrington theorem involves a total recursive function that is not primitive recursive. The Sudan function The Goodstein function Variants Constant functions Instead of , alternative definitions use just one 0-ary zero function as a primitive function that always returns zero, and built the constant functions from the zero function, the successor function and the composition operator. Weak primitive recursion The 1-place predecessor function is primitive recursive, see section #Predecessor. Fischer, Fischer & Beigel removed the implicit predecessor from the recursion rule, replacing it by the weaker rule They proved that the predecessor function still could be defined, and hence that "weak" primitive recursion also defines the primitive recursive functions. Iterative functions Weakening this even further by using functions of arity k+1, removing and from the arguments of completely, we get the iteration rule: The class of iterative functions is defined the same way as the class of primitive recursive functions except with this weaker rule. These are conjectured to be a proper subset of the primitive recursive functions. Additional primitive recursive forms Some additional forms of recursion also define functions that are in fact primitive recursive. Definitions in these forms may be easier to find or more natural for reading or writing. Course-of-values recursion defines primitive recursive functions. Some forms of mutual recursion also define primitive recursive functions. The functions that can be programmed in the LOOP programming language are exactly the primitive recursive functions. This gives a different characterization of the power of these functions. The main limitation of the LOOP language, compared to a Turing-complete language, is that in the LOOP language the number of