OK, seu objetivo é mostrar que base em (nós não para especificar exatamente o que são essas classes, sabemos que elas são de alguma forma parametrizadas com o tamanho da entrada). Nós temos uma linguagem , decidiu por algum algoritmo . Agora criamos uma linguagem preenchendo cada palavra em , para que seu comprimento seja agora e vemos que ela está contida em (nosso novo algoritmo basicamente apenas ignora os zeros adicionados e executa na entrada curta real).C L A S S 1 [ g ( n ) ] = C L A S S 2 [ h ( n ) ] L ∈ C L ACL A SS1[ g( f( n ) ) ] = CL A SS2[ h ( f( n ) ) ]CL A SS1[ g( n ) ] = CL A SS2[ h ( n ) ]A G ' x ∈ L f ( n ) C G A S S 1 [ g ( n ) ] Uma ' UmL ∈ CL A SS1[ g( f( n ) ) ]UMAL′x∈Lf(n)CLASS1[g(n)]A′A
O que fazemos é: pegamos uma linguagem da classe maior e a protegemos, para que ela possa ser resolvida por um algoritmo mais fraco, nos dando contenção na classe menor - o algoritmo mais fraco pode fazê-lo, porque possui a mesma quantidade de 'trabalho real' para fazer como antes, mas tem suas restrições (sendo uma função do comprimento da entrada) levantadas estendendo a entrada.
Agora sabemos que e, portanto, (decidido por algum algoritmo ). Gostaríamos de ir daqui para . Mas isso é direto - o algoritmo decide apenas preenche a entrada de acordo e executa na entrada preenchida.L ' ∈ C G A S S 2 [ h ( n ) ] B ' L ∈ C G A S S 2 [ h ( f ( n ) ) ] B L B ′L′∈CLASS1[g(n)]L′∈CLASS2[h(n)]B′L∈CLASS2[h(f(n))]BLB′
Este passo pode ser resumido da seguinte forma: queremos decidir na classe maior e com mais recursos. Usando nossos recursos extras, preenchemos a entrada e executamos o algoritmo que decide a linguagem preenchidaL .
É claro que existem alguns detalhes técnicos envolvidos aqui (por exemplo, precisamos garantir que o preenchimento possa ser implementado nas classes que consideramos), mas eu simplesmente as ignoro para fornecer a intuição geral.