PROLOG (VI) : La estructura condicional if-then-else

La estructura condicional if-then-else (si-entonces-sino) está implementada en PROLOG aunque tiene un formato singular.

true -> print(«then»); print(«else») se leería como «if true then print(«then») else «print(«else»)» así que devuelve then y true

false -> print(«then»); print(«else») se leería como «if false then print(«then») else «print(«else»)» devuelve else y truetrue *-> print(«true») ; print(«false»).

PROLOG (V): cut o corte , fail o fallo y not \+

El comando cut ! o corte hace que en la búsqueda de una solución y para evitar tiempo de proceso se da por buena la primera regla que se cumple con éxito por orden secuencial.

A la pregunta nota (8,Valor) devuelve Valor=notable, sin el ! tendriamos dos soluciones Valor = notable y Valor = sobresaliente

En otras palabras cut ! permite optimizar el tiempo de proceso, a cambio hay que ser cuidadoso con el orden de las reglas de más restrictiva a menos.

! siempre se cumple.

Fail no se cumple nunca y viene a ser el comando complementario a !.

Esta base de conocimiento nos dice que los corredores clasificados los inscritos que no han abandonado o se les ha descalificado, usando not

Se usa not o mejor \+ para negar una sentencia.

PROLOG (IV): Más que lógica

EXPRESIONES ARITMETICAS

Además de con expresiones lógicas, con PROLOG podemos trabajar con expresiones aritméticas , con números enteros (integer), racionales (rational) y en coma flotante (float) y tiene definidas las constantes pi y e

Veamos un ejemplo.

¿Es 5 el resultado de sumar 2 más 3? Verdadero.
¿Es 5 el resultado de sumar 2 más 4? Falso.

Pero hay muchísimas más como podemos ver en el manual de referencias, veamos unas pocas y así enteremos la nomenclatura que usa:

  • between(+Low, +High, ?Value) : Esta expresión es cierta si el valor de la variable (?Value) está comprendido en el intervalo cerrado (+Low,+Higth), así between(2,4,3)  es true.
  • succ(?Int1, ?Int2) : Esta expresión es cierta si el valor del numero entero de la variable ?int2 es el de ?Int1 incrementado en una unidad. Así succ(1,2) es true y succ(1,A) es A=2.
  • >, <, >=, =>, =/=, =:= o is : son los operadores lógicos correspondientes a menor que, mayor que, mayor o igual, menor o igual, desigual e igual. Por ejemplo 1.0 is sin(pi/2)  es true
  • round(+Expr) : redondea +Expr al entero más proximo. Por ejemplo A is round(1.2) nos devuelve A = 1.

LISTAS

Las listas es una estructura de datos que está implementada en PROLOG. Una lista es un conjunto ordenado de datos, que se escribe entre corchetes y separados por comas por ejemplo [X, Y, Z] . Disponemos de un completo conjunto de funciones para manipular listas en PROLOG.

  • = : permite asignar valores [X, Y, Z] = [juan, pablo, pedro]
  • member: indica si un valor está contenido en una lista member(juan,[juan, pablo, pedro]).
  • max_member: devuelve el elemento que ocupa la posición superior en la lista max_member(A,[juan, pablo, pedro]) devuelve A= pedro
  • min_menber: devuelve el elemento que ocupa la posición superior en la lista min_member(A,[juan, pablo, pedro]) devuelve A= juan
  • length([lista],Longitud) : devuelve la longitud de la lista. Así length([juan, pablo, pedro],Longitud) devuelve Longitud = 3.
  • append: une listas. Un ejemplo append([juan, pablo, pedro],[luis],A) devuelve A = [juan, pablo, pedro, luis].
  • delete (lista, elemento, nueva_lista): borra un elemento de una lista. Veamos un ejemplo delete([juan, pablo, pedro], juan, A) devuelve A = [pablo, pedro].
  • nth0(Index,[lista], elemento_buscado): devuelve el valor del indice del valor buscado en la lista, comenzando por 0. Un ejemplo como nth0(Index,[juan, pablo, pedro], pedro) nos devuelve Index = 2.
  • sort([lista], lista_ordenada): ordena una lista de entrada, devolviendo la lista ordenada sort([juan, pablo, pedro, andres], A) devuelve A = [andres, juan, pablo, pedro].

PROLOG (y fin): Para seguir aprendiendo

Comencemos por recordar que hay dos comandos de ayuda en el propio interprete PROLOG y estos son «help» y «apropos»

Preguntamos sobre el comando consult (carga del programa fuente en la memoria del interprete) con help y apropos

Un texto básico para comenzar a profundizar puede ser el del estándar ISO-PROLOG en él encontrará la razón por la que las variables comienzan por mayúscula o guion bajo, y otras curiosidades que he ido comentando y que un programador experto las considera obvias o evidentes.

Otra utilidad muy práctica es el editor e interprete en web de SWI-PROLOG llamado SWISH que permite desarrollar y programas sin necesidad de instalar ningun programa en nuestro dispositivo (por ejemplo desde la tablet o el móvil)

El mismo programa de PROLOG en SWISH

Existe un manual embebido en el propio SWISH que es muy práctico y además puede consultar un pequeño tutorial del SWISH de la universidad de Málaga y una guia del usuario muy didáctica.

También he encontrado útil el minimanual de Roberto torres de Alba y si prefiere leer el manual de referencia del SWI Prolog en formato libro aquí está el PDF.

Con esto doy por terminada esta introducción a lo que es PROLOG en 2020, un lenguaje que ayuda a pensar de forma lógica.