Cuando la humanidad inventó las computadoras, buscaba usarlas para resolver problemas. Pero ese no es el minuto cero de la resolución de problemas, pues las personas ya resolvían problemas mucho antes de que las computadoras existieran o se hicieran accesibles. Podemos decir que lo que hicimos en realidad, como humanidad, fue aplicar nuestra experiencia en la resolución de problemas para obtener una herramienta que nos permitiera extender nuestro horizonte.
Junto con las computadoras, nacen los programas de computadoras, —y luego las ciencias informáticas y/o sistémicas— que implementan las instrucciones que deben seguir las computadoras para resolver problemas con base en los miles de años de trabajo en la resolución de problemas. Para escribir programas de computadoras, utilizamos lenguajes de programación, que nos son más que especificaciones y reglas para formar instrucciones correctas y organizadas que puede entender un compilador o un intérprete para ejecutar el programa. En la práctica todo esto puede resumirse en el proceso de diseño, codificación, documentación y depuración del programa.
“El propósito primario de un lenguaje de programación es ayudar al programador en la práctica de su arte”. *Charles Hoare.*
Sabemos que las computadoras, son el resultado evolutivo de ideas relacionadas de muchos campos del conocimiento, pero principalmente de la lógica y el álgebra. También hemos aprendido que los programas de computadoras, hablando de forma general, se expresan como operaciones de índole matemática, de forma simbólica o numérica. Por lo tanto, están incluidos en el ámbito de las matemáticas.
De hecho, la mayoría de los lenguajes de computadora están basados en las matemáticas. Por ejemplo, podemos representar la suma de 1 y 2 mediante 1+2
, SUM(1,2)
o ADD 0001 0010
.
Estas tres posibles instrucciones o maneras de representar la suma son parte de lo que conocemos como sintaxis o forma de un lenguaje de programación que, como podemos ver, normalmente está mucho más cercana a un [lenguaje formal](https://es.wikipedia.org/wiki/Lenguaje_formal#:~:text=Estrictamente hablando%2C un,de símbolos .) que a los lenguajes naturales que utilizamos en el habla cotidiana.
Así como cada instrucción tiene sintaxis, también encontramos que tiene semántica o significado. La semántica de cada una de las representaciones de la suma de 1 y 2 debería adherirse a las nociones de la suma de dos números naturales.
Estas dos dimensiones son centrales, ya que, sin importar el lenguaje que estemos usando, una instrucción debe no tener ambigüedades sintácticas o semánticas para que un compilador o intérprete pueda decidir si un programa es sintácticamente correcto y ejecutarlo de acuerdo con su semántica.
La resolución de problemas matemáticos ha avanzado a través de la aritmética, la geometría, el álgebra y el análisis, permitiendo el acceso a las personas a través de lenguajes de programación de alto nivel, cuya notación o sintaxis, en la medida de lo posible, se conforma al uso matemático aceptado, tomando como base tres grupos de conocimientos matemáticos: la lógica, la teoría de conjuntos y la teoría de funciones.
La lógica es la ciencia del razonamiento. Si seguimos su sintaxis y reglas, podemos deducir nuevos hechos a partir de hechos anteriores. En el razonamiento lógico, primero debemos decidir lo que constituye una instrucción y lo que no, según la sintaxis del lenguaje que se está usando en un sistema lógico en particular. Entre las instrucciones correctamente escritas, algunas son verdaderas y otras no lo son.
A principios de siglo, las personas especialistas en matemáticas pensaban que todas las matemáticas podrían expresarse mediante la lógica formal. Aunque esto resultó no ser cierto, así como no es cierto que todos los problemas pueden ser resueltos por computadora, los métodos desarrollados han probado su valor en matemáticas, lingüística y ciencias de la computación. Aprenderemos sobre Programación Lógica más adelante.
La teoría de conjuntos es otro formalismo. Las esperanzas de que podría capturar todas las matemáticas fueron esbozadas a principios de 1930 cuando se descubrieron inconsistencias. Sin embargo, esto no impidió que profesionales de diversos campos se sientan a gusto trabajando con conjuntos para resolver problemas usando lenguajes que incorporan conjuntos dentro de sus estructuras de datos disponibles. Incluso, existen lenguajes que están basados completamente en conjuntos.
Luego de los intentos infructuosos de incorporar todas las matemáticas a través de la lógica y la teoría de conjuntos, Alonzo Church emprendió el intento a través de las funciones, donde una función especifica alguna clase de acción o transformación de la información. En este sentido, un programa de computadora puede ser visto como una función, pues transforma su entrada en su salida.
Aunque Church falló en su propósito de expresar todas las matemáticas a través de funciones, uno de los lenguajes más populares en el campo de la Inteligencia Artificial (AI), LISP (acrónimo de LISt Processing), debe su sintaxis y parte de su semántica al cálculo lambda de Church.
Junto a LISP, otros lenguajes basados en funciones han sido extremadamente útiles en el campo de la inteligencia artificial. Conoceremos más sobre lenguajes funcionales en cuando trabajemos con los paradigmas declarativos.