My former student Albert Goldfain made the following observation on Knuth's characterization of an algorithm: ======================================================================== Knuth's characterization of an algorithm includes: d. "Output. An algorithm has *ONE* or more outputs..." Contrast this with 1c "*ZERO* or more inputs. This is not a typo...and most likely not a mental slip by someone as precise as Knuth. There are several modern high-level languages that will allow you to return nothing from a function. E.g., consider the C function: int store-and-return(int x) { int i; i=x; return; } In some sense, there are no "outputs" from this function, yet it is still somehow an algorithm. (If any of you know Pascal, there was a distinction between procedures and functions; some other languages call procedures "subroutines". But the point is that these are not functions in the mathematical sense of ordered *PAIRS*.) In Lisp, which may have been more dominant when Knuth wrote, every function *had* to return at least one value. We can, however, re-interpret the "output" of an algorithm so that it is not always the return-value of a function. So, in store-and-return, perhaps it is the memory location of the local variable i that gets the "output" of the algorithm. In a program like C's Hello World, main(){ printf("Hello World\n"); return; } perhaps it is the screen that you are printing to that gets the "output" of the algorithm. Notice also that if you think of the store-and-return function as a "black box" [i.e., a device whose internal workings are hidden from you but whose external behavior is observable], there would be no way to tell that it was doing anything. Behaviorally, you would hand an input into the black box and observe nothing else! It may be that Knuth wants to exclude behaviorally unobservable algorithms. Bottom line: the "one or more" from premise 1d should not trip you up from analyzing the rest of the argument.