¿Cuáles son los requisitos previos para estudiar cosas como la verificación formal (software y hardware), la teoría del aprendizaje formal, la demostración automatizada de teoremas y los fundamentos de los lenguajes de programación?

No sé nada sobre la teoría del aprendizaje formal, pero puedo hablar sobre los demás.

No creo que haya demasiados requisitos previos reales. Obviamente, debe sentirse cómodo con el lenguaje de programación normal y las ideas del compilador : AST, análisis estático básico, transformaciones de programas, etc. Principalmente lo que cubrirías en un curso de compiladores.

También necesitará algunos conceptos básicos de la teoría de CS : lenguajes formales, autómatas y computabilidad. La teoría de la complejidad, sin embargo, no es relevante la mayor parte del tiempo.

Luego un poco de matemática. La parte más importante es la temida “madurez matemática”: hay que sentirse cómodo con el pensamiento formal y las pruebas. Además de esto, probablemente querrás la teoría básica de conjuntos y la lógica formal.

Dada esta base, puede recoger todo lo demás a medida que avanza. Dependiendo de lo que le interese, puede terminar con muchas más matemáticas (teoría de categorías, álgebra universal, más lógica de la que puede mover un palo …), pero nada de eso se requiere con anticipación.

Puede aprender sobre estos temas en la mayoría de los programas de posgrado de CS. Para el fin más teórico de las cosas (es decir, semántica y teoría de tipos), las mejores escuelas son probablemente Cambridge y CMU. Para cosas más aplicadas (es decir, solucionadores SMT, verificación automática) Berkeley y MIT parecen particularmente buenos