anterior arriba atrasadelante (solo si previamente se ha ido atras)

A.2.6. Operaciones aritméticas

La programación lógica no tiene como objeto abordar problemas de cálculo numérico, pero a veces son necesarias ciertas operaciones elementales, como contar el número de elementos de una lista, multiplicar por una constante, etc.

En principio, las operaciones aritméticas pueden expresarse mediante relaciones. Así, se puede definir la relación «suma» , que tiene tres argumentos numéricos, y que será verdadera si el tercero es la suma de los dos primeros, de manera que «suma(2,3,5)» es verdadero y «suma(2,3,4)» es falso. Su definición extensional sería:

  suma(0,0,0).  
  suma(0,1,1).  
  suma(0,2,2).  
  ...  
 

Es fácil comprender que esta manera de proceder carece de utilidad práctica, como en el caso de las relaciones de orden entre números.

Operadores

Para hacer viables las operaciones aritméticas, Prolog incorpora (o sea, el procesador reconoce) operadores aritméticos que, para mejor legibilidad, se escriben con notación infija: «+» , «-» , «*» y «/» .

Un término en Prolog es, por ejemplo, «6+7» (equivalente a +(6,7)). Pero, como decíamos al hablar de las funciones, Prolog interpreta «6+7» simplemente como una estructura, diferente de «13» . Por tanto la consulta «?- 13=6+7.» obtiene como resultado «NO» , y «?- X=6+7.» da «X=6+7» .

Para desencadenar la evaluación aritmética el lenguaje incorpora un predicado especial infijo: «is» .

Evaluación de expresiones aritméticas

El predicado «is» , escrito con una variable o una constante a su izquierda y una expresión aritmética a su derecha, es verdadero si el resultado de evaluar la expresión es igual a la constante, o es verdadero para el valor de la variable igual a ese resultado. Por ejemplo:

  ?- 13 is 6+7.  
  YES  
 
  ?- 13 is 6*7.  
  NO  
 
  ?- X is 6*7.  
  X=42  
 

En la expresión aritmética pueden figurar variables siempre que estas variables tengan un valor determinado al evaluar la expresión. Por ejemplo, con la regla:

  media(X,Y,M) :- M is (X+Y)/2.  
 

podemos hacer consultas como:

  ?- media(10,16,X).  
  X=13  
 

pero la «máquina Prolog» (el procesador ejecutándose en un ordenador) dará un error si preguntamos:

  ?- media(X,16,13).  
 

Un ejemplo típico del uso de «is» es la definición recursiva del factorial de un número natural:

  fact(0,1).  
  fact(N,F) :- N>0,  
               Nmenos1 is N-1,  
               fact(Nmenos1,F1),  
               F is N*F1.  
 
 ?- fact(5,X).  
 X=120  
 
 ?- fact(-1,X).  
 NO  
 
 ?- fact(X,120).  
 (mensaje de error)

Un par de cláusulas muy útiles son las que permiten obtener la longitud (número de elementos) de una lista:

 longitud([],0).  
 longitud([C|L],Long):-longitud(L,L1),Long is L1+1.  
 
 ?- longitud([a,b,c,d],X).  
 X=4

Añadiendo esta definición de longitud, por ejemplo, a las escritas más arriba para la generación de listas que representan algunas frases en español, podemos preguntar por frases con un determinado número de palabras:

 ?- sentencia(X),longitud(X,4).  
 X=[’Espana’,es,un,estado]  
 X=[un,estado,es,’Espana’]  
 
 ?- sentencia(X),longitud(X,L),L<3  
 NO

anterior arriba atrasadelante (sólo si previamente se ha ido atras)


algunos derechos reservados DIT-ETSIT-UPM
Portada