Explain why the reduction function f must output a *description* of a machine M' rather than running M on w, even though the reduction's correctness depends entirely on M's behavior on w.
Think about your answer, then reveal below.
Model answer: If f ran M on w, f would loop forever on any input where M does not halt — making f partial (undefined for those inputs) and breaking the composition. Instead, f performs only string manipulation: it takes ⟨M, w⟩ as input and outputs a description of a new machine M' that *encodes* contingent behavior ('simulate M on w; if M halts, do X'). Constructing this description is always a finite mechanical operation — f is essentially writing a short program as a string, without executing it. The description of M' is always a finite string producible in bounded time, even if running M' would be infinite.
The 'describe but don't run' pattern is the fundamental technique in computability theory for constructing things that depend on undecidable behavior. It exploits the fact that a Turing machine is just a data structure — a finite description of a computation. You can manipulate, compose, and embed TM descriptions as strings without ever executing them. The constructed M' may run forever when invoked, but its description is always a finite string. Once you internalize this pattern, most undecidability proofs follow a standard template: receive ⟨M, w⟩, construct M' by text manipulation, map to the target language's format.