Evaluación de expresiones aritméticas
LLega el momento de utilizar Prolog para nuestros complejísimos
cálculos aritméticos. ¿ Acaso existe algún
programa donde no se sumen dos y dos ?.
En Prolog es fácil construir expresiones aritméticas.
Algún avispado se habrá percatado de que las expresiones
matemáticas en general son términos, puesto que
corresponden a teorías lógicas de primer orden.
El problema es reducir esas expresiones según las leyes
matemáticas para obtener lindos numeritos. Eso se hace en
Prolog mediante el predicado is/2, cuyo modo de uso es
is(-Var,+Expr). Además, el argumento Expr debe ser
un término cerrado (es decir, que no contenga variables libres).
Por ejemplo, vamos a sumar dos y dos:
Welcome to SWI-Prolog (Version 2.7.14)
Copyright (c) 1993-1996 University of Amsterdam. All rights reserved.
For help, use ?- help(Topic). or ?- apropos(Word).
1 ?- X is 2 + 2.
X = 4
yes
2 ?-
El predicado is/2 no es reversible, por eso debemos estar seguros de
que las variables del segundo argumento siempre están
instanciadas. El modo de uso que instancia todas las variables solo
tiene éxito si el primer argumento es un número y
coincide con la evaluación del segundo argumento. Por ejemplo:
2 ?- 5 is 2 + 2.
no
3 ?-
Expresiones válidas
Las expresiones que podemos utilizar en el segundo argumento pueden
variar de un entorno de desarrollo a otro, pero vamos a citar las
más comunes:
| Término |
Significado |
Ejemplo |
| +/2 |
Suma |
X is A + B. |
| */2 |
Producto |
X is 2 * 7. |
| -/2 |
Resta |
X is 5 - 2. |
| '/'/2 |
División |
X is 7 / 5. |
| -/1 |
Cambio de signo |
X is -Z. |
| '//'/2 |
División entera |
X is 7 // 2. |
| mod/2 |
Resto de la división entera |
X is 7 mod 2. |
| '^'/2 |
Potencia |
X is 2^3. |
| abs/1 |
Valor absoluto |
X is abs(-3). |
| pi/0 |
La constante PI |
X is 2*pi. |
| sin/1 |
seno en radianes |
X is sin(0). |
| cos/1 |
coseno en radianes |
X is cos(pi). |
| tan/1 |
tangente en radianes |
X is tan(pi/2). |
| asin/1 |
arcoseno en radianes |
X is asin(7.2). |
| acos/1 |
arcocoseno en radianes |
X is acos(Z). |
| atan/1 |
arcotangente en radianes |
X is atan(0). |
| floor/1 |
redondeo por defecto |
X is floor(3.2). |
| ceil/1 |
redondeo por exceso |
X is ceil(3.2). |