I was wondering if someone could help resolve some issues I have understanding the proof given for the Cook-Levin theorem provided in the Sipser text (3rd edition) – as this proof has truly stumped me.
Having read through this proof numerous times, the only issue I have is that I simply do not understand how it actually proves the statement in question; namely that the resultant Boolean expression is satisfiable if and only if the nondeterministic Turing machine NM running on ‘w’ accepts on at least one of its computation branches. This is because as far as I can tell, you just produce a big Boolean expression that is always satisfiable, even when NM never accepts the input w. For instance, focusing on the ϕ_accept compound proposition as an example, clearly this is always satisfiable (just set one of the xi,j,q-accept Boolean variables to true – even if this never occurs in any of the computation histories of NM) – consequently what is the point of even including ϕ_accept? The same can be said for the other compound propositions.
As far as I can tell, the resultant Boolean expression produced evaluates to true if and only if NM accepts on one of its computation branches – but this is not what the statement in question actually says. To be clear, what I mean here is that after producing the Boolean expression, if you were to examine the computation history table for every single branch of NM’s computation tree and go about binding each of the variables depending on whether they are actually true or false for that specific computation history table, then ϕ would evaluate to false for every single table if NM rejects, but ϕ would evaluate to true for at least one of the computation history tables if NM accepts. But clearly this is not what the proof is saying, since they never talk about variable binding or the procedure just mentioned. Consequently, I am utterly stumped by this proof – any help would be greatly appreciated.