El paradigma olvidado (3). Programación lógica

Cuando se tratan los lenguajes de programación, se suelen clasificar en cuatro grandes paradigmas:

  • Programación imperativa o por procedimientos, en la que el código es una secuencia de intrucciones que van alterando variables o flujo. Lenguajes típicos serían C o Pascal.
  • Programación funcional, en la que el código se asemeja a funciones o sentencias matemáticas. Por ejemplo, así es Haskell o Lisp.
  • Programación lógica, para la que un programa está compuesto por reglas (predicados), que sirven para la resolución de un problema. Tal sucede con Prolog.
  • Programación orientada a objetos. Propiamente se trata de programación imperativa, pero sus características suelen hacer que se trate independientemente. Típicos son C++ o Java.

Hay que hacer el inciso de que un paradigma no es tanto una clasificación de lenguajes como un estilo de programación; así, se puede hacer programación funcional con Java, por ejemplo.
En entradas previas de esta serie he hablado de los lenguajes de los PLC y de los HMI. Se ha visto que la programación funcional e imperativa están bastante extendidas, y que incluso se puede encontrar algún ejemplo de orientación a objetos. Hay que añadir que es común ver controladores con sistemas operativos embebidos como Linux o Windows XP, lo que permite desarrollar para ellos aplicaciones en lenguajes de alto nivel. Pero no tengo conocimiento de ningún sistema de control que use programación lógica. En realidad, este paradigma ha sido siempre el menos empleado en otros ámbitos, acaso también el menos comprendido.
Una búsqueda rápida en Google Academics nos devuelve bastantes artículos, incluso antiguos, sobre lógica difusa en sistemas de control, o redes neuronales, y en general se realiza bastante investigación en la aplicación de nuevas herramientas para abordar los problemas que la automatización plantea. También se usa la programación lógica para el modelado de autómatas. Pero no abundan los sistemas expertos que, basándose en conjuntos de reglas, descubran el procedimiento adecuado que debe seguir el sistema de control para alcanzar su objetivo. He encontrado una patente publicada en el año 1991 o, más recientemente, una propuesta de generación automática de código basándose en una descripción funcional,o una aplicación en la que la actuación de equipos se resuelve a partir de una base de conocimiento (eso sí, desde fuera del sistema de control).

Autor: Richard D. Skeirik
Autor: Richard D. Skeirik

En todo caso, un lenguaje de controlador que aplicase el paradigma lógico no sería tan ajeno como para partir de cero, y podemos imaginar fácilmente su aspecto y características. Vamos a basarnos en Prolog y lo aplicaremos a un ejemplo sencillo: un depósito con una bomba de llenado y una válvula a la salida.
bombeo-deposito
Empecemos por codificar los comportamientos de los equipos. En Prolog, el signo :- debe leerse como una implicación de derecha a izquierda (⇐).

%% Órdenes (salidas digitales) y sus confirmaciones (entradas digitales)
válvula_abierta :- válvula_abrir
válvula_cerrada :- válvula_cerrar
bomba_marcha :- bomba_orden

Es decir, abrir la válvula implica recibir señal de válvula abierta, y así con los siguientes. Este simple fragmento ya debería permitir al programa realizar inferencias. Si, por ejemplo, se manda abrir la válvula y no se recibe el final de carrera transcurrido un tiempo, podemos detectar la anomalía y generar una alarma. Esta idea concreta no forma parte de Prolog, pero sería una funcionalidad interesante fácil de implementar.
Lo original de la programación lógica es que el programador no debe encargarse de definir secuencias o acciones; se extraen de forma automática de las reglas. Por ejemplo, para esta construcción se pueden establecer la siguiente lógica, que hace uso de las boyas de máximo y mínimo nivel y el requerimiento de suministro:

%% Funcionamiento de los equipos
nivel_alto :- bomba_marcha
not(nivel_bajo) :- bomba_marcha
suministro :- válvula_abierta
not(suministro) :- válvula_cerrada

Las dos primeras líneas nos dicen que con la bomba en marcha sube el nivel (se desactiva la boya de mínimo y se activa la de máximo). Las dos siguientes, que con válvula abierta se suministra agua. Con estas reglas, que constituyen el programa en Prolog, a partir de las entradas (suministro, nivel_alto y y nivel_bajo), se deducen los valores de las salidas (válvula_abrir, válvula_cerrar y válvula_orden). El cómo lo veremos en la siguiente entrada.

Facebooktwitterlinkedin