Aritmética en Prolog

Programar en Prolog no es lo mismo que programar en lenguajes como C, Java, Python, u otros más. Su paradigma es totalmente diferente.

No podemos hacer un programa que sume dos números tipo entero, calcular el índice de masa corporal de una persona de 56 años, obtener la media y mediana de un conjunto de datos de un arreglo, encontrar los valores NULL en una consulta SQL o crear un sitio web responsivo.

Prolog se ocupa para otras cosas (ej. sistemas expertos).

En esta ocasión veremos la aritmética en este lenguaje. Operaciones básicas como la suma, resta, multiplicación, división, potenciación y radicación (sí, son 6 operaciones básicas, no solo 4).

Comencemos abriendo una terminal y entrando al REPL de Swipl.

$ swipl

Para que Prolog calcule una expresión aritmética, debemos usar el operador ``is``:

Resultado is Expresión.

Veamos unos ejemplos de suma, resta, multiplicación, división, potenciación y radicación (raíz cuadrada):

23 is 21 + 2.
true.

45 is 20 + 25.
true.

34 is 21 + 2.
false.

88 is 44 * 2.
true.

X is 21 - 4.
X = 17.

Y is 23 / 2.
Y = 11.5.

8 is 2 ** 3.
true.

4.0 is sqrt(16).
true.

4 is sqrt(16).
false.

X is div(10, 4).
X= 2.

X is mod(10, 4).
X= 2.

%% Errores
12 + 32 is 44.
false.

12 ** 2 is Y.
false.

Consideraciones:

- Variables deben estar instanciadas: no puedes hacer 4 + 5 is X, debe ser X is 4 + 5.

- No hay asignación reversible: X is 4 + 5 funciona, pero 4 + 5 is X no.

- Todas las expresiones se evalúan con is: no basta con escribir X = 4 + 5, eso solo une estructuras, no las evalúa.

Vamos a crear un programa que realice la siguiente operación:

(X+Y) * 2

calcula.pl

calcula(X, Y, Resultado) :-
    Resultado is (X + Y) * 2.

Usamos Swipl para cargarlo y ejecutarlo de esta forma:

$ swipl -s calcula.pl

Una vez cargado podemos invocar la función:

1 ?- calcula(2, 4, R).
R = 12.

2 ?- calcula(6, 8, R).
R = 28.

3 ?- calcula(77, 9, R).
R = 172.

Algunas funciones aritméticas en Prolog

Veamos la función ``succ``, la cual se ocupa para verificar si un número es la secuencia de otro:

succ(22, 23).
true.
succ(11, 13).
false.
succ(45, 46).
true.
succ(X, 46).
X= 45.
succ(46, Y).
Y= 47.

Veamos la función ``plus``, la cual se ocupa para verificar si un resultado es la suma de dos números enteros:

plus(22,22,44).
true.

plus(33, 9, 42).
true.

plus(33, 2, 42).
false.

plus(33, X, 42).
X = 9.

plus(X, 3, 42).
X = 39.

También podemos combinarlas, esto para hacer evaluaciones booleanas.

succ(12, 13); plus(22,44, 56), 7 is div(14, 2). %% expr1 or expr2 and expr3
true.

succ(12, 13), plus(22,44, 56), 7 is div(14, 2). %% expr1 and expr2 and expr3
false.

Uso de la función ``cos`` para obtener el coseno.

X is cos(9).
X = -0.9111302618846769.

1.0 is cos(0).
true.

0 is cos(0).
false.

Estas solo son algunas de las funciones aritméticas y matemáticas en Prolog.

Enlaces:

https://athena.ecs.csus.edu/~mei/logicp/home.html
https://github.com/Anniepoo/prolog-examples

Comentarios