Estou interessado na questão de qual a melhor maneira de ensinar a NP-completude aos cursos de ciência da computação. Em particular, devemos ensiná-lo usando reduções de Karp ou reduções de Turing?
Sinto que os conceitos de completude e redução de NP são algo que todo especialista em ciência da computação deve aprender. No entanto, ao ensinar a NP-completude, notei que o uso das reduções de Karp tem algumas desvantagens.
Antes de tudo, as reduções de Karp parecem desnecessariamente confusas para alguns estudantes. A noção intuitiva de redução é "se eu tiver um algoritmo para resolver o problema X, então também posso usá-lo para resolver o problema Y". Isso é muito intuitivo - mas mapeia muito melhor as reduções de Turing do que as reduções de Karp. Como resultado, vejo alunos que tentam provar a completude do NP serem desviados por sua intuição e formam uma prova incorreta. Tentar ensinar ambos os tipos de reduções e enfatizar esse aspecto das reduções de Karp às vezes parece um formalismo desnecessário e ocupa um tempo desnecessário nas aulas e a atenção dos alunos sobre o que parece ser um detalhe técnico não essencial; não é evidente por que usamos essa noção mais restrita de redução.
Entendo a diferença entre reduções de Karp e reduções de Turing (Cook), e como elas levam a diferentes noções de completude de NP. Percebo que as reduções de Karp nos dão uma granularidade mais fina de distinções entre classes de complexidade. Portanto, para um estudo sério da teoria da complexidade, as reduções de Karp são obviamente a ferramenta certa. Mas para os estudantes de ciência da computação que estão apenas aprendendo isso e nunca vão entrar na teoria da complexidade, não tenho certeza se essa distinção mais fina é crítica é fundamental para que eles sejam expostos.
Por fim, como estudante, lembro-me de ficar confuso ao encontrar um problema como "tautologia" - por exemplo, dada uma fórmula booleana, verifique se é uma tautologia. O que foi confuso foi que esse problema é claramente difícil: qualquer algoritmo de tempo polinomial implicaria que ; e resolver esse problema é obviamente tão difícil quanto resolver o problema da tautologia. No entanto, embora a tautologia intuitivamente seja tão difícil quanto a satisfação, a tautologia não é difícil para o NP. Sim, entendo hoje por que esse é o caso, mas na época me lembro de ficar intrigado com isso. (O que passou pela minha cabeça uma vez que finalmente entendi foi: Por que traçamos essa distinção entre NP-hard e co-NP-hard, afinal? Isso parece artificial e não é muito bem motivado pela prática. Por que nos concentramos em NP Eles parecem igualmente naturais. De uma perspectiva prática, a dureza da co-NP parece ter essencialmente as mesmas conseqüências práticas que a dureza da NP, então por que ficamos todos presos nessa distinção? Sim, eu sei o respostas, mas como estudante, lembro que isso apenas fez o sujeito parecer mais misterioso e pouco motivado.)
Então, minha pergunta é essa. Quando ensinamos NP-completude aos alunos, é melhor ensinar usando reduções de Karp ou reduções de Turing? Alguém já tentou ensinar o conceito de completude NP usando reduções de Turing? Se sim, como foi? Haveria armadilhas ou desvantagens não óbvias se ensinássemos os conceitos usando reduções de Turing e pulássemos as questões conceituais associadas às reduções de Karp?
Relacionado: veja aqui e aqui , que menciona que a razão pela qual usamos reduções de Karp na literatura é porque ela nos permite distinguir entre dureza NP e dureza co-NP. No entanto, parece não dar nenhuma resposta focada em uma perspectiva pedagógica sobre se essa capacidade é crítica para os objetivos de aprendizagem de uma classe de algoritmos que devem ser adotados por todos os principais especialistas em CS. Veja também aqui no cstheory.SE , que tem uma discussão semelhante.