tutorial swi portable online inteligencia elementos descargar artificial prolog

swi - Operador de Prolog=:=



prolog tutorial (6)

Hay algunos operadores especiales en Prolog, uno de ellos es "es", sin embargo, recientemente encontré los operadores =: = y no tengo idea de cómo funciona.

¿Alguien puede explicar lo que hace el operador y también dónde puedo encontrar una lista predefinida de dichos operadores especiales y qué hacen?

Gracias.


=: = es un operador de comparación.A1 =: = A2 tiene éxito si los valores de las expresiones A1 y A2 son iguales. A1 == A2 tiene éxito si los términos A1 y A2 son idénticos;


Complementando las respuestas existentes, me gustaría indicar algunos puntos adicionales:

Un operador es un operador.

En primer lugar, el operador =:= es, como su nombre lo indica, un operador . En Prolog, podemos usar el predicado current_op/3 para aprender más sobre los operadores. Por ejemplo:

?- current_op(Prec, Type, =:=). Prec = 700, Type = xfx.

Esto significa que el operador =:= tiene prioridad 700 y es de tipo xfx . Esto significa que es un operador de infijo binario.

Esto significa que puede , si lo desea , escribir un término como =:=(X, Y) equivalente como X =:= Y En ambos casos , el functor del término es =:= , y la aridad del término es 2. Puede usar write_canonical/1 para verificar esto:

?- write_canonical(a =:= b). =:=(a,b)

Un predicado no es un operador.

¡Hasta ahora tan bueno! Todo esto ha sido una característica puramente sintáctica . Sin embargo, lo que realmente estás preguntando es el predicado (=:=)/2 , cuyo nombre es =:= y que toma 2 argumentos .

Como otros ya han explicado, el predicado (=:=)/2 denota la igualdad aritmética de dos expresiones aritméticas. Es verdad si sus argumentos evalúan al mismo número.

Por ejemplo, probemos la consulta más general, mediante la cual pedimos cualquier solución, utilizando variables como argumentos:

?- X =:= Y. ERROR: Arguments are not sufficiently instantiated

Por lo tanto, este predicado no es una relación verdadera, ¡ya que no podemos usarlo para generar resultados! Este es un inconveniente bastante grave de este predicado, que choca con lo que comúnmente se denomina "programación declarativa".

El predicado solo funciona en una situación muy específica en la que ambos argumentos están totalmente instanciados. Por ejemplo:

?- 1 + 2 =:= 3. true.

Llamamos modificados a estos predicados porque solo se pueden utilizar en determinados modos de uso. Para la gran mayoría de los principiantes, los predicados modificados son una pesadilla para usar, porque requieren que piense en sus programas de manera procesal , lo cual es bastante difícil al principio y también lo es más adelante. Además, los predicados modificados limitan severamente la generalidad de sus programas, porque no puede usarlos en todas las direcciones en las que podría usar predicados puros.

Las restricciones son una alternativa más general.

Prolog también proporciona predicados aritméticos mucho más generales en forma de restricciones aritméticas.

Por ejemplo, en el caso de los enteros , pruebe las restricciones CLP (FD) de su sistema Prolog. Una de las restricciones CLP (FD) más importantes denota la igualdad aritmética y se llama (#=)/2 . En una analogía completa con (=:=)/2 , el operador (#=)/2 también se define como un operador de infijo , por lo que puede escribir, por ejemplo:

| ?- 1 + 2 #= 3. yes

Estoy usando GNU Prolog como un ejemplo particular, y muchos otros sistemas Prolog también proporcionan implementaciones CLP (FD).

Un gran atractivo de las restricciones se encuentra en su generalidad . Por ejemplo, en contraste con (=:=)/2 , obtenemos con el predicado (#=)/2 :

| ?- X + 2 #= 3. X = 1 | ?- 1 + Y #= 3. Y = 2

Y hasta podemos hacer la consulta más general :

| ?- X #= Y. X = _#0(0..268435455) Y = _#0(0..268435455)

Observe qué tan naturalmente estos predicados se mezclan en Prolog y actúan como relaciones entre expresiones enteras que pueden consultarse en todas las direcciones .

Dependiendo del dominio de interés, mi recomendación es usar CLP (FD), CLP (Q), CLP (B), etc. en lugar de usar más predicados aritméticos de bajo nivel.

También vea clpfd , clpq y clpb para más información.

Casualmente, el operador =:= es usado por CLP (B) con un significado completamente diferente:

?- sat(A =:= B+1). A = 1, sat(B=:=B).

Esto demuestra que debes distinguir entre operadores y predicados . En el caso anterior, el predicado sat/1 ha interpretado la expresión dada como una fórmula proposicional, y en este contexto, =:= denota la igualdad de las expresiones booleanas.


Creo que la respuesta anterior merece algunas palabras de explicación aquí, sin embargo.

Una breve nota de antemano: Las expresiones aritméticas en Prolog son solo términos ("Todo es un término en Prolog"), que no se evalúan automáticamente . (Si tiene un fondo Lisp, piense en listas citadas). Entonces 3 + 4 es exactamente igual a +(3,4) , que no hace nada por sí solo. Es responsabilidad de los predicados individuales evaluar esos términos.

Varios predicados incorporados hacen una evaluación implícita, entre ellos los operadores de comparsión aritmética como =:= y is . Si bien =:= evalúa ambos argumentos y compara el resultado, acepta y evalúa solo su argumento correcto como una expresión aritmética.

El argumento de la izquierda debe ser un átomo, ya sea una constante numérica (que luego se compara con el resultado de la evaluación del operando derecho), o una variable. Si es una variable vinculada , su valor debe ser numérico y se compara con el operando correcto como en el caso anterior. Si es una variable no vinculada, el resultado de la evaluación del operando correcto está vinculado a esa variable. is usa a menudo en este último caso, para vincular variables.

Para seleccionar un ejemplo del Diccionario de Prólogo vinculado anterior: Para probar si un número N es par, puede usar ambos operadores:

0 is N mod 2 % true if N is even 0 =:= N mod 2 % dito

Pero si desea capturar el resultado de la operación, solo puede usar la primera variante. Si X está sin unir, entonces:

X is N mod 2 % X will be 0 if N is even X =:= N mod 2 % !will bomb with argument/instantiation error!

Regla de oro: si solo necesitas una comparación aritmética, usa =:= . Si desea capturar el resultado de una evaluación, el uso is .