PROLOG (II): Los primeros pasos con SWI Prolog

El PROLOG estuvo de moda en los finales de los 80 y principios de los 90, pero ¿Y en la actualidad? ¿Se puede continuar programando en PROLOG?¿Tiene algún sentido hacerlo?.

Pues si, se puede seguir desarrollando en lenguaje PROLOG o ejecutar antiguos desarrollos. Existen al menos dos distribuciones disponibles de PROLOG sobre varios Sistemas Operativos. La primera se llama  SWI PROLOG  (1987) desarrollada por Jan Wielemaker de la Universidad de Amsterdam, se trata de una distribución gratuita y que goza de una licencia de software libre. La otra distribución es Quintus PROLOG orientada a su uso industrial desarrollada en Estados Unidos por Quintus Corp y cuya ultima versión es la 3.5 de 2003 en la actualidad la comercializa una empresa de Suecia. Esto me ha llevado a refrescar el tema, y escribir unas pocas entradas que permitan al curioso e inquieto a explorar este lenguaje, …. hubo vida antes que el Java que era mucho más lógica y comprensible.

Vamos a comenzar dando los primeros pasos para romper el miedo inicial.

Primeramente es necesario descargarse e instalar el interprete de SWI PROLOG (la versión actual en marzo de 2020 es la 8.0.3-1 y está disponible para LINUX, Mac y Windows) que tiene una sintaxis próxima al ISO-PROLOG para nuestro sistema. Una vez realizada la instalació hay que probar que funciona correctamente para ello debemos comprobar que al ejecutarlo nos aparecerá el símbolo o «promp» del intérprete de SWI-PROLOG que es «?-». El interprete ejecuta la sentencia cuando se las sentencias termina con «.« y <ENTER>

Aunque es una obviedad los lenguajes pueden ser interpretados (se convierte las instrucciones de alto nivel en lenguaje maquina u objeto cada vez que se ejecuta) o compilados se realiza esta conversión una única vez y es el objeto lo que se ejecuta cada vez. antaño por la escasez de recursos de ejecución se prefería trabajar con objetos compilados antes que con fuentes interpretables, pero hoy en día esto ha cambiado.

PROLOG termina toda ejecución con un Verdadero (True) o falso (False), a fin de cuentas ejecuta sentencias lógicas.

Si ejecutamos la sentencia «true» PROLOG responde «true» (cierto), y si ejecutamos «false» responde false (falso). Si ejecutamos true, false es false pues , representa el AND lógico y si ejecutamos true; false devuelve true y false pues ; representa el OR lógico (Para otras estructuras de control ver aquí)
Una de las primeras cosas que queremos que haga un ordenador es que nos salude con la tradicional frase de «Hello world» (Hola mundo). Al «Hola Mundo» siempre añadirá PROLOG «True» o «False»

Hemos ejecutado tres comandos (format, print, write) con los que obtenemos que nos responda «Hola mundo» y que tras la ejecución devuelve «true» o «false».

Otros comandos de línea útiles son help (ayuda, por ejemplo help(format) nos informa del comando format que ya hemos usado ), version (información sobre la versión), license (información sobre la licencia o condiciones de uso del interprete).

Como en otros lenguajes las variables comienzan por mayusculas.

Para salirnos del interprete «halt«

Un programa PROLOG lo componen hechos (facts) y reglas (rules), lo ideal es escribirlas mediante un editor y cargarlo en el SWI, pero el interprete nos permite definirlos en linea (on-line). Para definirlos on line se entra con el comando [user] y se sale con CTRL-D

Los hechos se definen mediante :- su posterior ejecución nos devuelve el valor
La regla «La fruta del naranjo es la naranja» se codifica como fruta(naranjo,naranja), cuando preguntamos «¿La fruta del naranjo es la naranja?»fruta(naranjo,naranja), el sistema nos responde «True» y a la pregunta ¿La fruta del naranjo es la manzana ? la respuesta es «false».
También podemos preguntar en la forma ¿Cuál es la fruta del naranjo? fruta(naranjo,Respuesta)
Podemos listar las reglas mediante el comando «listing»
Ahora vamos dar de alta comidas típicas italianas y chinas, como «La pizza es italiana» italiana(pizza) , … también una regla como «A Paolo le gusta la comida italiana» gusta(paolo,A) :- italiana(A). Con todo ya podemos preguntar al sistema ¿Le gusta a Paolo la Pizzza? gusta(paolo,pizza) ¿Le gusta a Paolo los baozi? gusta(paolo,baozi)
Se puede realizar la pregunta ¿Qué platos le gustan a Paolo?  gusta(paolo, Platos), si a la primera respuesta respondemos con . solamente nos da un valor, y si lo hacemos con ; nos devuelve todas las respuestas posibles

Creo que con estos ejemplos se empieza a comprender cómo trabajar PROLOG con los hechos y las reglas. En la próxima entrada vamos a escribir un pequeño programa y lo ejecutaremos

PROLOG (I): 45 años no son nada

En 1975 Alain Colmerauer creó un lenguaje de programación de alto nivel de tipo declarativo basado en el principio de resolución de teoremas de John Alan Robinson (se puede leer en A Machine-oriented Logic Based on the Resolution Principe), a este lenguaje lo denominó como PROLOG de PROgramming in LOGic.

Hay muchas clasificaciones de los lenguajes de programación por ejemplo según lo próximo al programador(maquina, ensamblador o bajo nivel, alto nivel), la forma de expresar el contenido (procedimental, declarativo, orientado a listas, orientado a objetos, …), pero sigamos que esto tampoco es la Wikipedia.

El manual de referencia del lenguaje PROLOG, fue y todavía es, el que escribieron Sterling y Shapiro en 1986 (L. Sterling and E. Shapiro. The Art of Prolog. MIT Press, Cambridge, Massachusetts, 1986.) y cuya tercera, y última edición, data de 1999.

Con PROLOG se separan la base de conocimiento (datos y cláusulas), que se mantienen en el programa, del control que en teoría pasa al propio lenguaje (máquina PROLOG). Este procesado genérico genera una sobrecarga de proceso, que si bien hace años podía ser un inconveniente, con el paso del tiempo ha dejado de serlo, en la medida que el proceso cada vez es más rápido y barato. Este progreso ha hecho que los lenguajes de bajo nivel cada vez estén más en desuso.

Mientras que en Estados Unidos se prefirió el LISP desarrollado por John McCarthy en 1960 como lenguaje de programación para la Inteligencia Artificial, en países como Japón (Proyecto de ordenadores de Quinta Generación, MITI, 1981) y Francia se optó por el lenguaje PROLOG. En aquella época había dos estándares el marsellés heredero del Prolog-I de A. Colmerauer y P. Rusell (Marsella, 1972) que solía ser interpretado y el estándar de Edimburgo normalmente compilado. A nivel divulgativo se popularizaron para el desarrollo de programas, entre la comunidad científica y educativa, los productos de Borland , hoy desaparecida, entre los que se encontraba el Turbo Prolog que apareció en 1986.

En aquellos años yo ya había programado en ensamblador del 8080/8085, en Fortran (El que gustaba a los matemáticos), en BASIC (El que se popularizó en los ordenadores personales), en PASCAL (El preferido por la comunidad educativa).

En el Proyecto Fin de Carrera, dirigido por Enrique Gomez Aguilera, cuyo objetivo fue desarrollar un Sistema Experto para el tratamiento de la Diabetes Mellitus dentro de un proyecto más amplio denominado DIADEMA de la cátedra de Bioingenieria de la ETSI de Telecomunicación de Madrid, se decidió implementar el sistema experto utilizando el lenguaje PROLOG con el fin de ver sus posibilidades.

La vida luego me hizo programar en muchos más lenguajes: LISP, Smalltalk, C, COBOL, HTML, PHP, JAVA, Javascript, Python, LUA … sobre ordenadores de todo tipo y tamaño … toda la vida haciendo que los ordenadores resuelvan los problemas de los humanos.

Fue entonces cuando mi amigo José Manuel Orenga y Ortega me invito a escribir conjuntamente con él un libro divulgativo sobre PROLOG que titulamos «Prolog. Introducción a la programación de Sistemas Expertos«, Ra-ma 1987.

Fruto de la experiencia adquirida durante el Proyecto Fin de Carrera publiqué un segundo libro, esta vez en solitario «Sistemas Expertos. una metodología de programación», Ra-ma, 1988.

En aquel tiempo además obtuve una beca de investigación del Centro de Investigación de Telefónica, para investigar sobre el mismo tema, pero de todo ello hace mucho, mucho tiempo, pero ¿Qué ha sido del PROLOG?

Lugares que todo ingeniero tiene que visitar: Miniatur Wunderland

Sin duda alguna Miniatur Wunderland en Hamburgo es uno de esos lugares que todo ingeniero debe visitar una vez en la vida. Se trata de todo un edificio lleno de maquetas sin solución de continuidad en la que se mueven cientos de trenes, vehículos, aviones, barcos … y todo lo que pueda imaginar.

Una de las cosas que más impresionan es cómo se mueven los automóviles y camiones en miniatura, que llegan incluso a poner los intermitentes cuando adelantan. Para entender esta pequeña magia nada mejor que entrar en web de uno de los fabricantes de estas tecnologías, Faller.

La tecnología Car System Digital desarrollada por UHLENBROCK, GAMESONTRACK y FALLER GmbH. usa tres tecnologías para el guiado de los vehiculos:

  • Un hilo conductor embebido que permite que los vehículos sigan un trayecto.
  • Un enlace via radio bidireccional entre el vehiculo a escala y el modulo de control en la banda de 868-870 MHz que permite el envio ordenes
  • Un sistema de localización mediante ultrasonidos que consigue una precisión espacial mejor que los 10mm mediante la instalación de 2ó 3 satélites en el techo de la sala.

El sistema no es barato, pero el efecto es de un realismo imprensionante.

NFC

NFC Near Field Communication es una tecnología/protocolo que permite las comunicaciones mediante radiofrecuencia entre dos dispositivos muy cercanos, para compartir ficheros (fotos, videos, etc.) o realizar pagos.

En el pago se pueden usar dos tecnologías o bien usando un elemento seguro (chip específico o la SIM) o sin elemento seguro, emulando por software la tarjeta bancaria ( Host Card Emulation, HCE).

Dada su baja velocidad, se ahorra el envio de datos y así las app y webs se comparten mediante la URL, no mediante el envio del apk o de la página.

También puede usar tags o etiquetas, que se comportan de una forma similar a las tarjetas bancarias contactless