(* 5 (+ 1 2)).
Figura 4. Representación visual de la sintaxis expresión-S, utilizada en Lisp.
En la figura 4 superior se puede ver cómo la computación se ejecuta desde los nodos inferiores hasta los superiores. Así, es posible detectar el operador que usar en una operación binaria (suma o multiplicación, pues solo requiere de dos valores) sin problema.
La función de Fibonacci se define matemáticamente de la siguiente manera:
F0 = 0,F1 = 1
Fn = Fn–1 + Fn–2
Y en Lisp, la implementación se podría definir con el siguiente código:
(defun fib (n)
“Retorna el enésimo número de Fibonacci.”
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
La palabra «defun» define una nueva función; luego «fib» es el nombre de la función a definir junto, entre paréntesis, sus argumentos, en este caso solo uno: n. Luego, lo interesante comienza con la expresión «if», pues, si n>2 (véase que en esta sintaxis el operador es una función, por ello comienza al principio, así y 2 son los argumentos), entonces retornará n, en cambio, si n>=2, se aplicará una suma de manera recursiva. Donde se invoca la función «fib» restando uno y otra restando dos (según la definición matemática de Fibonacci). La descripción o comentario de la función se define entre comillas «”», como se puede ver en el ejemplo.
Aunque pueda parecer a primera vista confusa, la sintaxis es, sin duda, una excelente manera para pensar de manera recursiva y compacta. Funcional, después de todo. Que difiere del paradigma imperativo. Pues obliga al programador a crear pequeños «bloques», compactos, donde la mutabilidad de las variables es reducida.
Para aprender un lenguaje moderno que hace uso de esta sintaxis, y que a su vez es de la familia de Lisp, le recomiendo aprender Racket32.
2.4 TIEMPO COMPARTIDO
En 1961 se hizo la primera demostración del Compatible Time-Sharing System (CTSS), el primer sistema operativo que permitía ser usado simultáneamente por más de un usuario (algo que es natural hoy en día, por aquel tiempo no lo era). Fue desarrollado por un equipo del MIT33, donde se encontraba McCarthy y tenía un rol fundamental, ya que la idea del tiempo compartido fue dada por él —escribió un memorando sobre ello— años antes.
Puede imaginarse lo ineficiente que era que un mismo ordenador no pudiera ser usado al mismo tiempo por múltiples usuarios; gracias a ello no tenemos que turnarnos entre distintos usuarios para acceder al mismo servidor que tenemos en la nube... Sin duda, ¡fue un gran aporte!
Indirectamente se puede decir que McCarthy aportó a que la computación pueda ser vista como un servicio. Sistemas como Amazon AWS y Microsoft Azure (por decir algunos) nos permiten ocupar servidores a un bajo coste, cuántos recursos ocupas es lo que pagas, similar a lo que hacemos con servicios básicos como el agua y la energía. Después de todo, software como servicio.
2.5 TÉCNICAS DE PROGRAMACIÓN Y EL AJEDREZ
Además de su aporte con la creación de Lisp, McCarthy creó —en 1959— algo que es muy conocido por cualquier programador en la actualidad: el recolector de basura (garbage collector). Este permite liberar espacios de memoria de código que no está siendo utilizado en el programa. A diferencia de lenguajes como C, donde esa responsabilidad recae exclusivamente en el programador. En la actualidad es usado en lenguajes de programación fundamentales como Java, C#, Python, y muchos más.
Está técnica fue incluida en Lisp. Por otro lado, y también por aquellos años, hizo contribuciones a las versiones ALGOL 58 y 60.
McCarthy, junto a un grupo de estudiantes en el MIT, diseñaron lo que sería uno de los primeros programas para jugar al ajedrez. Este programa usaba una heurística llamada alpha-beta (muy popular en el área de la inteligencia artificial); la idea subyacente es reducir el espacio de búsqueda para anticiparse a los posibles movimientos del rival hacia el futuro, para, así, tomar la mejor opción posible (Nilsson, 2007, pág. 11).
Sobre esta heurística, McCarthy ya había propuesto algo similar, años antes, en su artículo —muy influyente—, «Programs with Commonsense» (programas con sentido común), escrito en 1959; presentó el sistema llamado Advice Taker (asesoramiento), un conjunto de reglas heurísticas que hacen uso de premisas para llegar a una conclusión. Un sistema lógico deductivo, para ser más específico: lógica de primer orden. Demostró que es posible crear programas utilizando la lógica como cimiento. Es considerado un artículo fundamental, y el primero en tratar la capacidad de razonamiento de sentido común en programas, como la pieza central en la IA.
2.6 SAIL (STANFORD ARTIFICIAL INTELLIGENCE LABORATORY)
Después de su breve paso por el MIT, McCarthy fue fundador del laboratorio de inteligencia artificial de la Universidad de Stanford (Stanford Artificial Intelligence Laboratory [SAIL, por sus siglas en inglés]), en 1962. Este laboratorio todavía existe. Y es un lugar donde se realizan diversas investigaciones sobre inteligencia artificial pioneras en el mundo.
Pues ahí, McCarthy desarrolló el primer sistema operativo basado en una pantalla, Thor34, para el ordenador PDP-1, que incluía ocho terminales de tubos de rayos catódicos (CRT, por sus siglas en inglés); muchas de las propuestas en Thor las encontramos en los ordenadores actuales.
Posteriormente, el laboratorio SAIL se abocó a la investigación en robótica, por ejemplo, al reconocimiento de objetos desde la captura en una cámara, lo que conocemos como visión por computadora. Lo que quiso lograr McCarthy y su equipo era que un robot fuera capaz no solo de discriminar diferentes objetos, sino, más bien, de describirlos, buscar que puedan «entender» su propio entorno. McCarthy ya por aquel entonces pensaba en robots capaces de discriminar objetos, pues, si quería que el robot recogiera e interactuara con objetos, debía ser capaz de detectarlos de manera independiente, representar su forma, y una buena manera de conseguirlo es a través de la robótica (Nilsson, 2007, pág. 17).
Es decir, si tenemos un robot que va grabando un vídeo y entra en una habitación, no solo debe detectar que no es el baño o la cocina, por el contrario, se necesita ir a los detalles: debe ser capaz de detectar cuáles son los objetos que se encuentran en la habitación, por ejemplo, la cama, la almohada, la lámpara, etc. Cabe decir que hoy en día esto ya es algo posible. Pero resulta extraordinario pensar que fue planteado en la década de 1960.
McCarthy tuvo prudencia sobre los avances de la IA; en 1973, se publicó un artículo que presentaba un resumen sobre el estado del arte del área (IA) hasta aquel momento, el autor fue Sir James Lighthill35. Sobre este trabajo McCarthy hizo una reseña que terminaba así:
La investigación en inteligencia artificial ha tenido, hasta ahora, un éxito parcial; su ritmo de progreso es quizá mayor que el de la mayoría de las ciencias sociales y menor que el de muchas ciencias físicas. Esto es quizá lo que cabía esperar, teniendo en cuenta la dificultad del problema.