En Prolog existe el predicado ‘=’ que puede ser usado para diferentes propósitos. Cuando decimos a=b y tanto a como b son constantes, literales, estructuras o variables que estén instanciada, entonces es verdadero si a es idéntico a b. De otro modo es falso. Por ejemplo, [1,2]=[1,2] es verdadero; [1,2]=[1,2,3] es falso; libro(hamlet)=hamlet es falso; X=3 será verdadero si X está instanciada en el literal 3, de otro modo es falso.

En otro sentido, se puede usar cuando a y/o b no están vinculadas a ningún valor, en este caso, es un operador de asignación. Por ejemplo, si tenemos el siguiente predicado:

 

setear(X,Y):-X=Y.

Veamos algunas consultas:

?-setear(1,2).
no

?-setear(X,2).
X=2;
no

?-setear(1,Y).
Y=1;
no

?-setear(X,Y).
X=H26
Y=H26;
no

En este último caso, dado que no tiene ninguna de las variables instanciadas, resuelve que se debería asignar el mismo valor a ambas variables.

Sería muy común querer hacer 1+1=2 y uno pensaría que Prolog, ante esta consulta, debería responder “yes”. Pero en realidad responderá que no, dado que para Prolog, 1+1 es como si tuviéramos el predicado +(1,1), es decir, con dos argumentos y esto no es igual a una constante (en este caso el número 2). Con esto, decimos que no podemos utilizar el “=” para asignar resultados de operaciones aritméticas, dado que siempre fallaría la asignación. Para esto, Prolog utiliza un predicado denominado “is”. Este predicado, de alguna manera sirve para forzar la asignación en el caso que queramos obtener el resultado, en nuestro caso, de la suma 1+1. Veamos algunos ejemplos:

?- 1 is 2*2-3.
yes

En este caso, se resuelve la parte derecha del “is” y se la compara con la parte izquierda. Como la parte derecha da 1, el resultado de la consulta es yes.

?- X is 2*2-3.
X=1;
no

Aquí, se resuelve la parte derecha y como en la parte izquierda hay una variable que no está instanciada, se asigna a X el resultado de la operación realizada, es decir X=1.

Un tercer caso sería:

?- 1 is X*2-3.
error

Esto es, no puede resolver la operación de la parte derecha, dado que X no posee valor (no está instanciada). Sólo podría resolver el lado derecho del is si X tuviera algún valor. Si tenemos:

?- 1+X is 3+2.
X=4;
no

Por último, acá lo que sucede es que X debe tener el valor 4 para que ambas partes, izquierda y derecha, coincidan.

En síntesis, para utilizar el predicado is, debemos tener en cuenta que:

  • Toda variable que aparezca en la parte derecha de la expresión, deberá estar instanciada
  • Toda variable que aparezca en la parte izquierda de la expresión, puede o no estar instanciada. En caso que no lo esté, se instanciará según el resultado de la operación que se realiza en la parte derecha
  • Si ambas partes están instanciadas, is funciona como un operador de comparación por igual.

Ahora veamos una utilidad que podemos darle a este predicado. Definamos el predicado long(L,N).

long([],0).
long([X|Xs],N):- long(Xs,N1), N is N1+1.

En la primera regla, estamos definiendo que la longitud de la lista vacía es 0. Esta regla actúa como caso base de nuestro programa recursivo. Esto es importante, dado que si no la tuviéramos, no tendríamos forma de parar la cadena de llamadas recursivas.

En la segunda regla, la idea es recorrer la lista, por eso tenemos [X|Xs] y llamar recursivamente a long para lograr el conteo de los elementos. Esta cuenta se lleva en N. Cada vez que llamamos a long, N suma un elemento más. Al terminar de recorrer la lista, llegamos a la lista vacía e inicializamos el N en cero. A medida que volvemos de las llamadas recursivas, se suma 1 a N1,  por lo tanto N1 siempre está instanciado, que es lo que pretende el predicado “is”.

Hagamos una lista de operadores más usados en Prolog:

Operadores matemáticos:

+ Suma

- Resta

* Multiplicación


Operadores Relaciónales:

>               Mayor que

<               Menor que

>=             Mayor o Igual que

=<             Menor o Igual que

=:=            Aritméticamente igual (1)

=\=           Aritméticamente diferente

is                 Descrito anteriormente

=               Descrito anteriormente

Esto quiere decir que Prolog responderá “yes” si consultamos:

2=:=2.

X is 2,

X=:=2.  En este caso, instancia (por el is) a X en 2 y luego compara con 2.

Cabe destacar que dará “no” si se consulta:

 X=:=2.

2=:=1+1.

Dado que no realiza ningún tipo de instanciación de variables, como así tampoco ningún tipo de cálculo. Para ello se usan el “is” y el “=”.