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

A.2.5. Comparaciones

Veamos algunas operaciones de comparación entre números y entre estructuras.

Relaciones de orden

Teóricamente es posible definir cualquier relación de manera extensional (es decir, enumerando todos los individuos que están en la relación). Así haríamos si quisiéramos declarar, por ejemplo, una «base de datos» sobre «padres» , o sobre «jefes» : pondríamos tantos hechos como parejas padre–hijo o jefe–subordinado nos interesase considerar. Pero esta enumeración exhaustiva es inviable para representar, por ejemplo, relaciones de orden entre números. Así, se puede concebir la relación «mayor_que» entre números. Suponiendo que no tratamos más que con números enteros, en un rango de -32,768 a 32,767, la definición extensional debería ser:

  mayor_que(-32767,-32768).  
  ...  
  mayor_que(1,0).  
  mayor_que(2,0).  
  ...  
  mayor_que(32767,32766).  
 

Predicados incorporados

Estos predicados de uso frecuente están incorporados en el lenguaje. Esto quiere decir que el procesador del lenguaje está diseñado para reconocerlos y decidir, en función de sus argumentos, si son verdaderos o falsos. El más sencillo es el de igualdad, que podría definirse explícitamente escribiendo el hecho general «igual(X,X)» . Del mismo modo, están incorporadas las relaciones «mayor_que» , «menor_que» , etc. Para mayor facilidad, estos predicados se pueden escribir con notación infija:

PredicadoVerdadero si


X=Y X es igual que Y
X\=Y X no es igual que Y
X<Y X es menor que Y
X>Y X es mayor que Y
X=<Y X es igual o menor que Y
X>=Y X es mayor o igual que Y

Algunos de los ejemplos anteriores podrían haberse escrito de manera quizás más clara (pero menos concisa) con ayuda del predicado «=» . Por ejemplo:

  primero([Cab|Cola],X) :- X=Cab.  
 
  concatena([],L1,L2) :- L1=L2.  
 
  concatena(L1,L2,L3)  
          :- L1=[C1|CL1],L3=[C3|CL3],C3=C1,  
             concatena(CL1,L2,CL3).  
 

Los predicados de igualdad y desigualdad se aplican tanto a números como a estructuras. Así, se puede hacer directamente la consulta:

  ?- [madrid,barcelona,X]=[Y,barcelona,sevilla]  
  X=sevilla  
  Y=madrid  
 

Pero los otros, que implican relaciones de orden, sólo están definidos para números. Para otro tipo de objetos es preciso definir explícitamente la relación de orden mediante reglas. Veamos a continuación un ejemplo particularmente útil (que hace uso de otro predicado también incorporado):

Orden alfabético

El predicado incorporado «name(X,Y)» se hace verdadero si la variable X se sustituye por una cadena de caracteres y la variable Y por la lista de codificaciones ASCII correspondiente. Por ejemplo:

  ?- name(abc,X).  
  X=[97,98,99]  
 
  ?- name(X,[48,49,50]).  
  X=012  
 

Como las codificaciones ASCII de los caracteres alfabéticos están ordenadas numéricamente (ASCII(a)=D’97; ASCII(b)=D’98;. . . ASCII(y)=D’121; ASCII(z)=D’122), podemos aprovechar este predicado incorporado para reducir el problema de comparar dos cadenas de caracteres al de comparar dos listas de números:

  menor_alf(X,Y) :- name(X,LX),name(Y,LY),  
                    menor_list(LX,LY).  
 

Para definir el predicado «menor_list» hemos de considerar varios casos:

Reuniendo todas las reglas (y redenominando algunas variables para mayor brevedad) tenemos el siguiente conjunto:

  menor_list([],[X|L]).  
  menor_list([A|X],[B|Y]) :- A<B.  
  menor_list([A|X],[A|Y]) :- menor_list(X,Y).  
  menor_alf(X,Y)  
      :- name(X,LX),name(Y,LY),menor_list(LX,LY).  
 
  ?- menor_alf(abc,bca).  
  YES  
 
  ?- menor_alf(pepote,pepe).  
  NO  
 

Como el predicado incorporado «=» sirve para comparar estructuras en general, podemos fácilmente definir la relación «menor o igual» :

  menorig_alf(X,Y) :- X=Y.  
  menorig_alf(X,Y) :- menor_alf(X,Y).  
 

Se observará que estos predicados sólo tienen sentido para comprobar, no para generar. Es decir, una consulta con variables tendría infinitas respuestas. En el Apartado A.4.2 veremos cómo resultan de utilidad para ordenar alfabéticamente una lista de palabras.


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


algunos derechos reservados DIT-ETSIT-UPM
Portada